答案:下面是我找到的一个直接使用smtp发送邮件的php例子程序(经改编), 但是服务器方总是提示: 550 system busy! 并且邮件无法发送.
那位知道如何处理?
另: 对于smtp服务器需要密码的情况该如何处理验证呢?
sory , 刚刚看到 smtp 发送邮件的问题 (链接的这个帖子怎么不是精华?, 建议斑竹给一个啊).
问题已经解决:
1. 命令data应该是"DATA\r\n"
2. from和to命令应该有, 否则一些server拒发邮件
3.使用base64_encode 加密用户名和密码
<?php
require("php\mail.php");
?>
<?
$smtp = "smtp.163.net";
$from ="hylpro@163.net";
$to = "hylpro@163.net";
$subject ="Hello php mail";
$message="Hello! this is a test use php";
$mail = new mail($smtp,"Welcom use this mail",true);
$mail->send( $to,$from,$subject,$message);
?>
<?
//---------------
// 实现SMTP
//---------------
class Mail{
var $lastmessage; //记录最后返回的响应信息
var $lastact; //最后的动作,字符串形式
var $welcome; //用在HELO后面,欢迎用户
var $debug; //是否显示调试信息
var $smtp; //smtp服务器
var $port; //smtp端口号
var $fp; //socket句柄
//Construct
function mail($smtp, $welcome="", $debug=false)
{
if(empty($smtp)) die("SMTP cannt be NULL!");
$this->smtp=$smtp;
if(empty($welcome))
{
$this->welcome=gethostbyaddr("localhost");
}
else
$this->welcome=$welcome;
$this->debug=$debug;
$this->lastmessage="";
$this->lastact="";
$this->port="25";
}
//
function show_debug($message, $inout)
{
if ($this->debug)
{
if($inout=="in") //响应信息
{
$m="<b> 收: </b>";
}
else
$m="<b> 发: </b>" ;
if(!ereg("n$", $message))
$message .= " ";
$message=nl2br($message);
echo "<font color=#339933> $m </font>$message ";
}
}//end show debug
function do_command($command, $code)
{
$this->lastact=$command."\r\n";
$this->show_debug($this->lastact, "out");
fputs ( $this->fp, $this->lastact );
$this->lastmessage = fgets ( $this->fp, 512 );
$this->show_debug($this->lastmessage, "in");
if(!ereg("^$code", $this->lastmessage)) return false;
else return true;
} //end do command
//发一个命令
function command($command, $code)
{
$this->lastact=$command."\r\n";
$this->show_debug($this->lastact, "out");
fputs ( $this->fp, $this->lastact );
} //end send Cmd
//等待一个应答
function wait($code)
{
$this->lastmessage = fgets ( $this->fp, 512 );
$this->show_debug($this->lastmessage, "in");
if(!ereg("^$code", $this->lastmessage))
{
return false;
}
else
{
return true;
}
}
//发送邮件
function send( $to,$from,$subject,$message)
{
//连接服务器
echo "<br>";
$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 );
// stream_set_blocking($this->fp,true);
$this->lastmessage=fgets($this->fp,512);
$this->show_debug($this->lastmessage, "in");
if (! ereg ( "^220", $this->lastmessage ) )
{
return false;
}
else
{
if(!$this->do_command("EHLO I want mail!", "250"))
{
fclose($this->fp);
return false;
}
//处理认证, 不知如何直接使用用户名和密码计算认证值
if(!$this->do_command("AUTH LOGIN","334"))
{
fclose($this->fp);
return false;
}
//User hash
if(!$this->do_command("xxxxx","334"))
{
fclose($this->fp);
return false;
}
//code hash
if(!$this->do_command("xxxx","235"))
{
fclose($this->fp);
return false;
}
if(!$this->do_command("MAIL FROM : <$from> " , "250"))
{
fclose($this->fp);
return false;
}
if(!$this->do_command("RCPT TO: <$to>", "250"))
{
fclose($this->fp);
return false;
}
//发送正文
if(!$this->do_command("DATA\r\n.", "354"))
{
fclose($this->fp);
return false;
}
fputs($this->fp, "From: hylpro <$from>\r\n");
fputs($this->fp,"To: $to <$to>\r\n");
fputs($this->fp, "Mime-Version: 1.0\r\n");
fputs($this->fp, "Subject: $subject\r\n");
fputs($this->fp, "Context-Type : text/plain;\r\n");
fputs($this->fp, " charset = \"GB2312\" \r\n ");
fputs($this->fp, "Content-Transfer-Encoding : quoted--printable ;\r\n");
fputs($this->fp, "$message\r\n");
fputs($this->fp, " \r\n");
fputs($this->fp, " \r\n");
fputs($this->fp, ".\r\n"); //end
$this->show_debug($message, "out");
echo "<br>";
$this->show_debug(".\r\n", "out"); //以只含点的行结束数据传送
$this->wait("250"); 这里总是返回 system busy
if(!$this->do_command("QUIT", "250"))
{
fclose($this->fp);
return false;
}
fclose($this->fp);
}
return true;
} //end if($this->fp)
else
{
$this->show_debug("Connect failed!", "in");
return false;
}
} //end send
} //end class
?>