I wrote a class to send mail by remote mail server.
But it was failed. So I captured the network packets by tcpdump,
and found that there is a strange packet "NOOP" was sent.
But in the source code I mean to send command "DATA".
I don't know why a "NOOP" packet was sent instead.

Here is my php source code and the attachment is tcpdump file.

---
<?php
/**
 * sendmail class
 */
class sendmail
{
        var $lastmessage;               //last reply
        var $lastact;                   //last action
        var $welcome;                   //welcome info
        var $smtp;                      //smtp server
        var $port;                      //smtp port
        var $fp;                        //socket handler
        var $user;                      //smtp user account
        var $pass;                      //smtp user passwd

        /**
         * Constructor
         */
        function sendmail($welcome)
        {
                global $config;
                
                $this->smtp=$config['smtp_svr'];
                if(empty($welcome)){
                        $this->welcome=gethostbyaddr($_SERVER['REMOTE_ADDR']);
                }else{
                        $this->welcome=$welcome;
                }

                $this->lastmessage="";
                $this->lastact="";
                $this->port=$config['smtp_port'];
                $this->user = base64_encode($config['smtp_user']);
                $this->pass = base64_encode($config['smtp_pass']);
        }

        /**
         * Exe command such as HELO, MAIL FROM, RCPT TO, QUIT, DATA
         * $code:               reply code
         */
        function do_command($command, $code)
        {
                $this->lastact=$command;

                fputs ( $this->fp, $this->lastact );
                $this->lastmessage = fgets ( $this->fp, 512 );

                if(!ereg("^$code", $this->lastmessage)) {
                        return false;
                } else {
                        return true;
                }
        }

        /**
         * Send mail
         * $to:         the mail address of receiver
         * $subject:the subject of mail
         * $message:mail content
         * return:      true -- successful
         *              false -- fail
         */
        function send( $to,$subject,$message)
        {
                global $config;
                $from=$config['smtp_from'];

                /* Connect to server. */
                $this->lastact="connect";

                $this->show_debug("Connect to SMTP server : 
".$this->smtp,"out");
                $this->fp = fsockopen ( $this->smtp, $this->port );
                if ( $this->fp ) {
                        set_socket_blocking( $this->fp, true );
                        $this->lastmessage=fgets($this->fp,512);

                        /* reply 220 means connect sucessfully */
                        if (! ereg ( "^220", $this->lastmessage ) ) {
                                return false;
                        } else {
                                $this->lastact="HELO " . $this->welcome . "\n";
                                if(!$this->do_command($this->lastact, "250")){
                                        fclose($this->fp);
                                        return false;
                                }
                                
                                $this->lastact="AUTH   LOGIN\r\n";
                                if(!$this->do_command($this->lastact, "334")){
                                        fclose($this->fp);
                                        return false;
                                }
                                $this->lastact=$this->user."\r\n";
                                if(!$this->do_command($this->lastact, "334")){
                                        fclose($this->fp);
                                        return false;
                                }
                                $this->lastact=$this->pass."\r\n";
                                if(!$this->do_command($this->lastact, "235")){
                                        fclose($this->fp);
                                        return false;
                                }

                                $this->lastact="MAIL FROM: $from" . "\n";
                                if(!$this->do_command($this->lastact, "250")) {
                                        fclose($this->fp);
                                        return false;
                                }

                                $this->lastact="RCPT TO: $to" . "\n";
                                if(!$this->do_command($this->lastact, "250")) {
                                        fclose($this->fp);
                                        return false;
                                }

                                /* Send data, I send a command "DATA", but 
tcpdump capture a "NOOP" packet */
                                $this->lastact="DATA\n";
                                if(!$this->do_command($this->lastact, "354")) {
                                        fclose($this->fp);
                                        return false;
                                }

                                /* Insert Conten-Type */
                                $message = "Content-Transfer-Encoding: 
8bit\n".$message;
                                $message = "Content-Type: text/plain; 
charset=UTF-8\n".$message;
                                $message = "MIME-Version: 1.0\n".$message;

                                /* Deal with subject header */
                                $subject = 
"=?UTF-8?B?".base64_encode($subject)."?=";
                                $head="Subject: $subject\n";
                                if(!empty($subject) && !ereg($head, $message)) {
                                        $message = $head.$message;
                                }

                                /* Deal with from header */
                                $head="From: $from\n";
                                if(!empty($from) && !ereg($head, $message)) {
                                        $message = $head.$message;
                                }

                                /* Deal with to header */
                                $head="To: $to\n";
                                if(!empty($to) && !ereg($head, $message)) {
                                        $message = $head.$message;
                                }

                                /* Ending string */
                                if(!ereg("\n\.\n", $message))
                                        $message .= "\n.\n";
                                fputs($this->fp, $message);

                                $this->lastact="QUIT\n";
                                if(!$this->do_command($this->lastact, "250")) {
                                        fclose($this->fp);
                                        return false;
                                }
                        }
                        return true;
                } else  {
                        $this->show_debug("Connect failed!", "in");
                        return false;
                }
        }
}
?>


-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to