[QUESTION] MAIL: Send a NOOP instead of DATA

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux