回 帖 发 新 帖 刷新版面

主题:各位高手看看那里有错误

此文件名:smtp.php
<?php   
class   smtp   
{   
/*   Public   Variables   */   
var   $smtp_port;   
var   $time_out;   
var   $host_name;   
var   $log_file;   
var   $relay_host;   
var   $debug;   
var   $auth;   
var   $user;   
var   $pass;   

/*   Private   Variables   */     
var   $sock;   

/*   Constractor   */   
function   smtp($relay_host   =   "",   $smtp_port   =   25,$auth   =   false,$user,$pass)   
{   
$this->debug   =   FALSE;   
$this->smtp_port   =   $smtp_port;   
$this->relay_host   =   $relay_host;   
$this->time_out   =   30;   //is   used   in   fsockopen()     
$this->auth   =   $auth;//auth   
$this->user   =   $user;   
$this->pass   =   $pass;   
$this->host_name   =   "localhost";   //is   used   in   HELO   command     
$this->log_file   =   "";   
$this->sock   =   FALSE;   
}   

/*   Main   Function   */   
function   sendmail($to,   $from,   $subject   =   "",   $body   =   "",   $mailtype,   $cc   =   "",   $bcc   =   "",   $additional_headers   =   "")   
{   
$mail_from   =   $this->get_address($this->strip_comment($from));   
$body   =   ereg_replace("(^|(\r\n))(\.)",   "\1.\3",   $body);   
$header   .=   "MIME-Version:1.0\r\n";   
if($mailtype=="HTML")   
{   
$header   .=   "Content-Type:text/html\r\n";   
}   
$header   .=   "To:   ".$to."\r\n";   
if   ($cc   !=   "")     
{   
$header   .=   "Cc:   ".$cc."\r\n";   
}   
$header   .=   "From:   $from<".$from.">\r\n";   
$header   .=   "Subject:   ".$subject."\r\n";   
$header   .=   $additional_headers;   
$header   .=   "Date:   ".date("r")."\r\n";   
$header   .=   "X-Mailer:By   Redhat   (PHP/".phpversion().")\r\n";   
list($msec,   $sec)   =   explode("   ",   microtime());   
$header   .=   "Message-ID:   <".date("YmdHis",   $sec).".".($msec*1000000).".".$mail_from.">\r\n";   
$TO   =   explode(",",   $this->strip_comment($to));   

if   ($cc   !=   "")     
{   
$TO   =   array_merge($TO,   explode(",",   $this->strip_comment($cc)));   
}   
if   ($bcc   !=   "")     
{   
$TO   =   array_merge($TO,   explode(",",   $this->strip_comment($bcc)));   
}   
$sent   =   TRUE;   
foreach   ($TO   as   $rcpt_to)     
{   
$rcpt_to   =   $this->get_address($rcpt_to);   
if   (!$this->smtp_sockopen($rcpt_to))     
{   
$this->log_write("Error:   Cannot   send   email   to   ".$rcpt_to."\n");   
$sent   =   FALSE;   
continue;   
}   
if   ($this->smtp_send($this->host_name,   $mail_from,   $rcpt_to,   $header,   $body))     
{   
$this->log_write("E-mail   has   been   sent   to   <".$rcpt_to.">\n");   
}     
else     
{   
$this->log_write("Error:   Cannot   send   email   to   <".$rcpt_to.">\n");   
$sent   =   FALSE;   
}   
fclose($this->sock);   
$this->log_write("Disconnected   from   remote   host\n");   
}   
return   $sent;   
}   

/*   Private   Functions   */   
function   smtp_send($helo,   $from,   $to,   $header,   $body   =   "")   
{   
if   (!$this->smtp_putcmd("HELO",   $helo))     
{   
return   $this->smtp_error("sending   HELO   command");   
}   

#auth   
if($this->auth)   
{   
if   (!$this->smtp_putcmd("AUTH   LOGIN",   base64_encode($this->user)))     
{   
return   $this->smtp_error("sending   HELO   command");   
}   
if   (!$this->smtp_putcmd("",   base64_encode($this->pass)))     
{   
return   $this->smtp_error("sending   HELO   command");   
}   
}   
if   (!$this->smtp_putcmd("MAIL",   "FROM:<".$from.">"))     
{   
return   $this->smtp_error("sending   MAIL   FROM   command");   
}   
if   (!$this->smtp_putcmd("RCPT",   "TO:<".$to.">"))     
{   
return   $this->smtp_error("sending   RCPT   TO   command");   
}   
if   (!$this->smtp_putcmd("DATA"))   
{   
return   $this->smtp_error("sending   DATA   command");   
}   
if   (!$this->smtp_message($header,   $body))     
{   
return   $this->smtp_error("sending   message");   
}   
if   (!$this->smtp_eom())   
{   
return   $this->smtp_error("sending   <CR><LF>.<CR><LF>   [EOM]");   
}   
if   (!$this->smtp_putcmd("QUIT"))     
{   
return   $this->smtp_error("sending   QUIT   command");   
}   
return   TRUE;   
}   

function   smtp_sockopen($address)   
{   
if   ($this->relay_host   ==   "")     
{   
return   $this->smtp_sockopen_mx($address);   
}     
else   
{   
return   $this->smtp_sockopen_relay();   
}   
}   

function   smtp_sockopen_relay()   
{   
$this->log_write("Trying   to   ".$this->relay_host.":".$this->smtp_port."\n");   
$this->sock   =   @fsockopen($this->relay_host,   $this->smtp_port,   $errno,   $errstr,   $this->time_out);   
if   (!($this->sock   &&   $this->smtp_ok()))     
{   
$this->log_write("Error:   Cannot   connenct   to   relay   host   ".$this->relay_host."\n");   
$this->log_write("Error:   ".$errstr."   (".$errno.")\n");   
return   FALSE;   
}   
$this->log_write("Connected   to   relay   host   ".$this->relay_host."\n");   
return   TRUE;;   
}   

function   smtp_sockopen_mx($address)   
{   
$domain   =   ereg_replace("^.+@([^@]+)$",   "\1",   $address);   
if   (!@getmxrr($domain,   $MXHOSTS))     
{   
$this->log_write("Error:   Cannot   resolve   MX   \"".$domain."\"\n");   
return   FALSE;   
}   
foreach   ($MXHOSTS   as   $host)     
{   
$this->log_write("Trying   to   ".$host.":".$this->smtp_port."\n");   
$this->sock   =   @fsockopen($host,   $this->smtp_port,   $errno,   $errstr,   $this->time_out);   
if   (!($this->sock   &&   $this->smtp_ok()))     
{   
$this->log_write("Warning:   Cannot   connect   to   mx   host   ".$host."\n");   
$this->log_write("Error:   ".$errstr."   (".$errno.")\n");   
continue;   
}   
$this->log_write("Connected   to   mx   host   ".$host."\n");   
return   TRUE;   
}   
$this->log_write("Error:   Cannot   connect   to   any   mx   hosts   (".implode(",   ",   $MXHOSTS).")\n");   
return   FALSE;   
}   

function   smtp_message($header,   $body)   
{   
fputs($this->sock,   $header."\r\n".$body);   
$this->smtp_debug(">   ".str_replace("\r\n",   "\n".">   ",   $header."\n>   ".$body."\n>   "));   
return   TRUE;   
}   

function   smtp_eom()   
{   
fputs($this->sock,   "\r\n.\r\n");   
$this->smtp_debug(".   [EOM]\n");   
return   $this->smtp_ok();   
}   

function   smtp_ok()   
{   
$response   =   str_replace("\r\n",   "",   fgets($this->sock,   512));   
$this->smtp_debug($response."\n");   
if   (!ereg("^[23]",   $response))     
{   
fputs($this->sock,   "QUIT\r\n");   
fgets($this->sock,   512);   
$this->log_write("Error:   Remote   host   returned   \"".$response."\"\n");   
return   FALSE;   
}   
return   TRUE;   
}   

function   smtp_putcmd($cmd,   $arg   =   "")   
{   
if   ($arg   !=   "")     
{   
if($cmd=="")     
{   
$cmd   =   $arg;   
}   
else   
{   
$cmd   =   $cmd."   ".$arg;   
}   
}   
fputs($this->sock,   $cmd."\r\n");   
$this->smtp_debug(">   ".$cmd."\n");   
return   $this->smtp_ok();   
}   

function   smtp_error($string)   
{   
$this->log_write("Error:   Error   occurred   while   ".$string.".\n");   
return   FALSE;   
}   

function   log_write($message)   
{   
$this->smtp_debug($message);   
if   ($this->log_file   ==   "")   
{   
return   TRUE;   
}   
$message   =   date("M   d   H:i:s   ").get_current_user()."[".getmypid()."]:   ".$message;   
if   (!@file_exists($this->log_file)   ||   !($fp   =   @fopen($this->log_file,   "a")))     
{   
$this->smtp_debug("Warning:   Cannot   open   log   file   \"".$this->log_file."\"\n");   
return   FALSE;;   
}   
flock($fp,   LOCK_EX);   
fputs($fp,   $message);   
fclose($fp);   
return   TRUE;   
}   

function   strip_comment($address)   
{   
$comment   =   "\([^()]*\)";   
while   (ereg($comment,   $address))     
{   
$address   =   ereg_replace($comment,   "",   $address);   
}   
return   $address;   
}   

function   get_address($address)   
{   
$address   =   ereg_replace("([   \t\r\n])+",   "",   $address);   
$address   =   ereg_replace("^.*<(.+)>.*$",   "\1",   $address);   
return   $address;   
}   

function   smtp_debug($message)   
{   
if   ($this->debug)     
{   
echo   $message;   
}   
}   

}   
?>



<?php   
/*   
这是一个测试程序!!!   
*/   
require("smtp.php");  
##########################################   
$smtpserver   =   "smtp.163.com";//SMTP服务器   
$smtpserverport   =   25;//SMTP服务器端口   
$smtpusermail   =   "zhang@163.com";//SMTP服务器的用户邮箱   
$smtpemailto   =   "abcde@163.com";//发送给谁   
$smtpuser   =   "7758258";//SMTP服务器的用户帐号   
$smtppass   =   "123456";//SMTP服务器的用户密码   
$mailsubject   =   "中文";//邮件主题   
$mailbody   =   "<h1>中文</h1>";//邮件内容   
$mailtype   =   "HTML";//邮件格式(HTML/TXT),TXT为文本邮件   
##########################################   
$smtp   =   new   smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.   
$smtp->debug   =   false;//是否显示发送的调试信息   
$smtp->sendmail($smtpemailto,   $smtpusermail,   $mailsubject,   $mailbody,   $mailtype);   
?>

运行没有错误提示
就是abcde@163.com邮箱接收不到任何信件!
环境:php+iis+xp

求解

回复列表 (共3个回复)

沙发

板凳

【5】Win32下mail()不能发送电子邮件
  
    在linux下配置好的sendmail可以发送,在win32下需要调用smtp服务器来发送电子邮件,修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到)
  
    php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器。

3 楼

谢谢楼上的.

<? 
  /******************************************/ 
  /* Php webmail sender */ 
  /* www.ebugs.org */ 
  /* Copyright 富翁 in im286.com 2005.03.07 */ 
  /* 转载请注明出处 */ 
  /******************************************/ 
   
  //使用前请首先按照提示进行配置发信认证的用户名、密码以及smtp服务器地址、发件人信箱等。 
  //注意将#替换成#,落伍(www.im286.com)负翁版权所有,可随意使用,但保留版权信息 
   
  //例子 
  echo send_mail('fuweng#im286.com','发信标题','发信内容'); 
   
   
  function send_mail($to, $subject = 'No subject', $body) { 
   $loc_host = "im286"; //发信计算机名,可随意 
   $smtp_acc = "fuweng#im286.com"; //Smtp认证的用户名,类似fuweng@im286.com,或者fuweng 
   $smtp_pass="password"; //Smtp认证的密码,一般等同pop3密码 
   $smtp_host="smtp.im286.com"; //SMTP服务器地址,类似 smtp.tom.com 
   $from="fuweng#im286.com"; //发信人Email地址,你的发信信箱地址 
   $headers = "Content-Type: text/plain; charset=\"gb2312\"\r\nContent-Transfer-Encoding: base64"; 
   $lb="\r\n"; //linebreak 
   
   $hdr = explode($lb,$headers); //解析后的hdr 
   if($body) {$bdy = preg_replace("/^\./","..",explode($lb,$body));}//解析后的Body 
   
   $smtp = array( 
   //1、EHLO,期待返回220或者250 
   array("EHLO ".$loc_host.$lb,"220,250","HELO error: "), 
   //2、发送Auth Login,期待返回334 
   array("AUTH LOGIN".$lb,"334","AUTH error:"), 
   //3、发送经过Base64编码的用户名,期待返回334 
   array(base64_encode($smtp_acc).$lb,"334","AUTHENTIFICATION error : "), 
   //4、发送经过Base64编码的密码,期待返回235 
   array(base64_encode($smtp_pass).$lb,"235","AUTHENTIFICATION error : ")); 
   //5、发送Mail From,期待返回250 
   $smtp[] = array("MAIL FROM: <".$from.">".$lb,"250","MAIL FROM error: "); 
   //6、发送Rcpt To。期待返回250 
   $smtp[] = array("RCPT TO: <".$to.">".$lb,"250","RCPT TO error: "); 
   //7、发送DATA,期待返回354 
   $smtp[] = array("DATA".$lb,"354","DATA error: "); 
   //8.0、发送From 
   $smtp[] = array("From: ".$from.$lb,"",""); 
   //8.2、发送To 
   $smtp[] = array("To: ".$to.$lb,"",""); 
   //8.1、发送标题 
   $smtp[] = array("Subject: ".$subject.$lb,"",""); 
   //8.3、发送其他Header内容 
   foreach($hdr as $h) {$smtp[] = array($h.$lb,"","");} 
   //8.4、发送一个空行,结束Header发送 
   $smtp[] = array($lb,"",""); 
   //8.5、发送信件主体 
   if($bdy) {foreach($bdy as $b) {$smtp[] = array(base64_encode($b.$lb).$lb,"","");}} 
   //9、发送“.”表示信件结束,期待返回250 
   $smtp[] = array(".".$lb,"250","DATA(end)error: "); 
   //10、发送Quit,退出,期待返回221 
   $smtp[] = array("QUIT".$lb,"221","QUIT error: "); 
   
   //打开smtp服务器端口 
   $fp = @fsockopen($smtp_host, 25); 
   if (!$fp) echo "<b>Error:</b> Cannot conect to ".$smtp_host."<br>"; 
   while($result = @fgets($fp, 1024)){if(substr($result,3,1) == " ") { break; }} 
   
   $result_str=""; 
   //发送smtp数组中的命令/数据 
   foreach($smtp as $req){ 
   //发送信息 
   @fputs($fp, $req[0]); 
   //如果需要接收服务器返回信息,则 
   if($req[1]){ 
   //接收信息 
   while($result = @fgets($fp, 1024)){ 
   if(substr($result,3,1) == " ") { break; } 
   }; 
   if (!strstr($req[1],substr($result,0,3))){ 
   $result_str.=$req[2].$result."<br>"; 
   } 
   } 
   } 
   //关闭连接 
   @fclose($fp); 
   return $result_str; 
  } 
  ?>

已经解决问题

我来回复

您尚未登录,请登录后再回复。点此登录或注册