我的一亩三分地 我就喜欢!
13fen  设为主页
 收藏本站
 
当前位置: > 一亩三分地:首页 > 网络学院 > 网络编程 > PHP专区 > php深入/精通 > 用SMTP传送邮件时的问题
热门文章排行
热门文章排行 检查email地址格式的代码(01-11)
PHP操作文件问答(01-11)
PHP安装攻略:安装并配置PHP(10-23)
PHP的十个高级技巧 4(10-23)
PHP控制语句(10-12)
精采文章排行
精采文章排行 PHP连接MYSQL的两种方法(11-15)
PHP和MySQL开发的8个技巧(10-23)
PHP安装攻略:安装并配置PHP(10-23)
php+mysql扎实个人基本功(10-23)
PHP编程常用技巧四则(10-23)
技术专题推荐
网管论坛交流
 

用SMTP传送邮件时的问题 

作者:佚名   来源:本站教程   点击:   日期:2007-01-11

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


?>


文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【论坛讨论

   相关文章:
·将OICQ数据转成MYSQL数据 ·用PHP实现ODBC数据分页显示一例
·php生成WAP页面 ·PHP与Javascript的两种交互方式
·PHP+Javascript模拟Matrix画面 ·WHOIS类的修改版

   文章评论:(条)
  
 请留名: 匿名评论   点击查看所有评论 网管论坛
 

  责任编辑:一分  声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。