同城约会| 杂志期刊| 小说| 两性论坛| 军事电影| 两性知识| 电脑知识| 汽车| 旅游| 收藏

PHP的一个完整SMTP类(解决当mail()遇上邮件服务器需要验证时的问题)

来源: 作者: 出处:综艺读书 2006-05-22 
关 键 词:邮件服务器  php  os  html  



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;

}

}

}

?>











test.php

<?php

/*

这是一个测试程序!!!

请按照说明设置好以下的参数,以下是以tom.com的用户为例设置好的.

*/

require("sm.php");

##########################################

$smtpserver = "smtp.tom.com";//SMTP服务器

$smtpserverport =25;//SMTP服务器端口

$smtpusermail = "someone@tom.com";//SMTP服务器的用户邮箱

$smtpemailto = "someone@hotmail.com";//发送给谁

$smtpuser = "someone";//SMTP服务器的用户帐号

$smtppass = "someonepass";//SMTP服务器的用户密码

$mailsubject = "Test Subject";//邮件主题

$mailbody = "<h1>This is a test mail</h1>";//邮件内容

$mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件

##########################################

$smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.

$smtp->debug = TRUE;//是否显示发送的调试信息

$smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);

?>


更多文章 更多内容请看FTP服务器  IIS服务器应用技巧  IMail服务器专题,或进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
综艺读书宗旨
相关专题
·FTP服务器 (5038篇文章)
·双核服务器技术 (5531篇文章)
·PHP问答篇 (81篇文章)
·SMTP协议 (152篇文章)
·网站服务器的选型 (6594篇文章)
·网吧流媒体服务器 (5307篇文章)
·刀片服务器专题 (4612篇文章)
·网吧服务器专栏 (4528篇文章)
·服务器配置专栏 (8803篇文章)
·IIS服务器应用技巧 (5099篇文章)
热点标签: 邮件服务器  php  os  html  
最新技术文档
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
百度推荐,商机无限
搜索您感兴趣的内容
Web 全站
综艺电脑频道编辑信箱  告诉我们您想看的专题或文章

Google

友情互链 | 收藏本站 | 联系我们 | 在线留言 | 京ICP备08008424号|