php中通过smtp发邮件的类,测试通过
2018-09-07 12:34
smtp.php
复制代码 代码如下:
<?php
classsmtp
{
/*PublicVariables*/
var$smtp_port;
var$time_out;
var$host_name;
var$log_file;
var$relay_host;
var$debug;
var$auth;
var$user;
var$pass;
/*PrivateVariables*/
var$sock;
/*Constractor*/
functionsmtp($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;//isusedinfsockopen()
$this->auth=$auth;//auth
$this->user=$user;
$this->pass=$pass;
$this->host_name=localhost;//isusedinHELOcommand
$this->log_file=;
$this->sock=FALSE;
}
/*MainFunction*/
functionsendmail($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:ByRedhat(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($TOas$rcpt_to)
{
$rcpt_to=$this->get_address($rcpt_to);
if(!$this->smtp_sockopen($rcpt_to))
{
$this->log_write(Error:Cannotsendemailto.$rcpt_to.\n);
$sent=FALSE;
continue;
}
if($this->smtp_send($this->host_name,$mail_from,$rcpt_to,$header,$body))
{
$this->log_write(E-mailhasbeensentto<.$rcpt_to.>\n);
}
else
{
$this->log_write(Error:Cannotsendemailto<.$rcpt_to.>\n);
$sent=FALSE;
}
fclose($this->sock);
$this->log_write(Disconnectedfromremotehost\n);
}
return$sent;
}
/*PrivateFunctions*/
functionsmtp_send($helo,$from,$to,$header,$body=)
{
if(!$this->smtp_putcmd(HELO,$helo))
{
return$this->smtp_error(sendingHELOcommand);
}
#auth
if($this->auth)
{
if(!$this->smtp_putcmd(AUTHLOGIN,base64_encode($this->user)))
{
return$this->smtp_error(sendingHELOcommand);
}
if(!$this->smtp_putcmd(,base64_encode($this->pass)))
{
return$this->smtp_error(sendingHELOcommand);
}
}
if(!$this->smtp_putcmd(MAIL,FROM:<.$from.>))
{
return$this->smtp_error(sendingMAILFROMcommand);
}
if(!$this->smtp_putcmd(RCPT,TO:<.$to.>))
{
return$this->smtp_error(sendingRCPTTOcommand);
}
if(!$this->smtp_putcmd(DATA))
{
return$this->smtp_error(sendingDATAcommand);
}
if(!$this->smtp_message($header,$body))
{
return$this->smtp_error(sendingmessage);
}
if(!$this->smtp_eom())
{
return$this->smtp_error(sending<CR><LF>.<CR><LF>[EOM]);
}
if(!$this->smtp_putcmd(QUIT))
{
return$this->smtp_error(sendingQUITcommand);
}
returnTRUE;
}
functionsmtp_sockopen($address)
{
if($this->relay_host==)
{
return$this->smtp_sockopen_mx($address);
}
else
{
return$this->smtp_sockopen_relay();
}
}
functionsmtp_sockopen_relay()
{
$this->log_write(Tryingto.$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:Cannotconnencttorelayhost.$this->relay_host.\n);
$this->log_write(Error:.$errstr.(.$errno.)\n);
returnFALSE;
}
$this->log_write(Connectedtorelayhost.$this->relay_host.\n);
returnTRUE;;
}
functionsmtp_sockopen_mx($address)
{
$domain=ereg_replace(^.+@([^@]+)$,\1,$address);
if(!@getmxrr($domain,$MXHOSTS))
{
$this->log_write(Error:CannotresolveMX\.$domain.\\n);
returnFALSE;
}
foreach($MXHOSTSas$host)
{
$this->log_write(Tryingto.$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:Cannotconnecttomxhost.$host.\n);
$this->log_write(Error:.$errstr.(.$errno.)\n);
continue;
}
$this->log_write(Connectedtomxhost.$host.\n);
returnTRUE;
}
$this->log_write(Error:Cannotconnecttoanymxhosts(.implode(,,$MXHOSTS).)\n);
returnFALSE;
}
functionsmtp_message($header,$body)
{
fputs($this->sock,$header.\r\n.$body);
$this->smtp_debug(>.str_replace(\r\n,\n.>,$header.\n>.$body.\n>));
returnTRUE;
}
functionsmtp_eom()
{
fputs($this->sock,\r\n.\r\n);
$this->smtp_debug(.[EOM]\n);
return$this->smtp_ok();
}
functionsmtp_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:Remotehostreturned\.$response.\\n);
returnFALSE;
}
returnTRUE;
}
functionsmtp_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();
}
functionsmtp_error($string)
{
$this->log_write(Error:Erroroccurredwhile.$string..\n);
returnFALSE;
}
functionlog_write($message)
{
$this->smtp_debug($message);
if($this->log_file==)
{
returnTRUE;
}
$message=date(MdH:i:s).get_current_user().[.getmypid().]:.$message;
if(!@file_exists($this->log_file)!($fp=@fopen($this->log_file,a)))
{
$this->smtp_debug(Warning:Cannotopenlogfile\.$this->log_file.\\n);
returnFALSE;;
}
flock($fp,LOCK_EX);
fputs($fp,$message);
fclose($fp);
returnTRUE;
}
functionstrip_comment($address)
{
$comment=\([^()]*\);
while(ereg($comment,$address))
{
$address=ereg_replace($comment,,$address);
}
return$address;
}
functionget_address($address)
{
$address=ereg_replace(([\t\r\n])+,,$address);
$address=ereg_replace(^.*<(.+)>.*$,\1,$address);
return$address;
}
functionsmtp_debug($message)
{
if($this->debug)
{
echo$message;
}
}
}
?>
测试程序
复制代码 代码如下:
<?php
/*
这是一个测试程序!!!
*/
require(smtp.php);
##########################################
$smtpserverport=25;//SMTP服务器端口
$smtpemailto=dxytools@gmail.com;//发送给谁
$smtpuser=reterry123;//SMTP服务器的用户帐号
$smtppass=014040001;//SMTP服务器的用户密码
$mailsubject=中文;//邮件主题
$mailbody=<h1>中文</h1>测试下能淤泥新年感;//邮件内容
$mailtype=HTML;//邮件格式(HTML/TXT),TXT为文本邮件
##########################################
$smtp=newsmtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.
$smtp->debug=TRUE;//是否显示发送的调试信息
$smtp->sendmail($smtpemailto,$smtpusermail,$mailsubject,$mailbody,$mailtype);
?>