当前位置:编程学习 > php >>

用SMTP传送邮件时的问题

答案:

下面是我找到的一个直接使用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


?>

上一个:使用PHP开发qmail邮件服务器管理系统
下一个:检查email地址格式的代码

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,