一个基于SMTP的邮件发送类
PHP自带的Mail函数使用起来不怎么灵活,而且不支持SMTP。
参考网上的一些资料写了一个SMTP邮件类,花了半天时间,不过可惜不支持基于SSL的GMail,群发、附件及MIME邮件功能接下来继续扩充。
源文件:
点击下载此文件
[code]
/*
* SMTP 邮件发送类
* Akon @ 2007/02/01
*/
class SMTPMail {
var $_mailFrom;
var $_mailTo;
var $_mailSubject;
var $_mailBody;
var $_host;
var $_user;
var $_pass;
var $_port;
var $_socket;
var $_request;
var $_conn;
var $_debug;
var $_log;
function SMTPMail($host, $user, $pass, $port=25, $debug=false) {
$this->_host = $host;
$this->_user = base64_encode($user);
$this->_pass = base64_encode($pass);
$this->_port = $port;
$this->_debug = $debug;
$this->_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($this->_socket) $this->Output(1001);
else $this->Output(2001);
$this->_conn = socket_connect($this->_socket, $this->_host, $this->_port);
if ($this->_conn) $this->Output(1002);
else $this->Output(2002);
$this->Output(1003);
}
function SendMail($mailFrom, $mailTo, $mailSubject, $mailBody) {
if (!$this->CheckMail($mailFrom)) $this->Output(2003);
elseif (empty($mailTo)) $this->Output(2004);
elseif (empty($mailSubject)) $this->Output(2005);
elseif (empty($mailBody)) $this->Output(2006);
else {
$this->_mailFrom = $mailFrom;
$this->_mailTo = $mailTo;
$this->_mailSubject = $mailSubject;
$this->_mailBody = $mailBody;
$SendContent = “From:{$this->_mailFrom}\r\n”;
$SendContent .= “To:{$this->_mailTo}\r\n”;
$SendContent .= “Subject:{$this->_mailSubject}\r\n”;
$SendContent .= $this->_mailBody;
$this->docommand(”EHLO HELO\r\n”);
$this->docommand(”AUTH LOGIN\r\n”);
$this->docommand($this->_user . “\r\n”);
$this->docommand($this->_pass . “\r\n”);
$this->docommand(”MAIL FROM: <" . $this->_mailFrom. “>\r\n”);
$this->docommand(”RCPT TO: <" . $this->_mailTo . “>\r\n”);
$this->docommand(”DATA\r\n”);
$this->docommand($SendContent .”\r\n.\r\n”);
$this->docommand(”QUIT\r\n”);
socket_close($this->_socket);
}
}
function CheckMail($email) {
return (ereg( “^[^@ ]+@([a-zA-Z0-9-]+.)+([a-zA-Z0-9-]{2}|net|com|gov|mil|org|edu|int)$”, $email));
}
function docommand($request) {
$this->_request = $request;
socket_write ($this->_socket, $this->_request, strlen ($this->_request));
$this->Output(1004);
$this->Output(1003);
}
function Output($msgcode) {
switch ($msgcode) {
case 1001 :
$msg = “SOCKET Create: ” . socket_strerror(socket_last_error()) . “”;
break;
case 1002 :
$msg = “SOCKET Connection: ” . socket_strerror(socket_last_error()) . “”;
break;
case 1003 :
$msg = “BACK: ” . socket_read ($this->_socket, 1024) . ““;
break;
case 1004 :
$msg = “CWD: ” . htmlentities($this->_request) . ““;
break;
case 2001 :
$msg = “SOKET initialization failure, please check your network connections and parameters.”;
break;
case 2002 :
$msg = “SOKET failure to establish links, please check your network connections and parameters.”;
break;
case 2003 :
$msg = “Error : Mail FROM is invalid mail format.”;
break;
case 2004 :
$msg = “Error : Mail TO is null.”;
break;
case 2005 :
$msg = “Error : Mail Subject is null.”;
break;
case 2006 :
$msg = “Error : Mail Body is null.”;
break;
case 2007 :
$msg = “Error : “;
break;
default :
$msg = $msgcode;
break;
}
if ($this->_debug) $this->_log .= “{$msg}”;
}
}
$SMTPMail = new SMTPMail(”smtp.163.com”, “toale”, '******', 25 ,true);
$SMTPMail->SendMail(”toale@163.com”, “aultoale@126.com”, “this is mail title”, “this is mail body”);
echo nl2br($SMTPMail->_log);
?>[/code]

02月 4th, 2007 at 01:46:37
为什么你用ASP的BLOG呢?呵呵。偶是PHP爱好者,属于正在学习PHP的菜鸟。自己开了个个人网站,是关于前台的。很喜欢看你写的文章。以后会常来的,有机会多交流啊。
02月 9th, 2007 at 14:43:54
你好,请问在您blog上购买文字链接的每个月价格是多少,如果能合作的话请发价格到advertising@alleffort.com,希望合作愉快:)
03月 4th, 2007 at 09:12:51
不知道博主有没有测试过自己的代码,事实上,上面的代码并不会向我们预期那样工作。
回顾一下Http协议,无论是Response 还是Request, http-header 和内容主体之间都要求
流一个空行。这个空行非常重要,用来标明,请求头已经结束,接下来是请求的主体部分了。
其实smtp协议有同样的要求 http://www.ietf.org/rfc/rfc0821.txt
否则的话,是不会看到信的内容的 (测试环境 outlook express)
所以:
$SendContent .= “Subject:{$this->_mailSubject}\r\n”;
应该改为:
$SendContent .= “Subject:{$this->_mailSubject}\r\n\r\n”;
罗嗦一下:
并非所有的mail服务器都支持 EHLO 命令,一些老的系统就不认识,要用 helo
不过如果要用身份认证,一般用EHLO。
代码中SendMail(”toale@163.com”, “aultoale@126.com”, “this is mail title”, “this is mail body”);
邮件的标题和内容这样直接”裸” 着出去, 似乎不太保险,如果是中文,在收件端看到的很可能是乱码。最好还是
用base64编码比较安全。
我以前都是弄 asp的,对PHP还不是很熟悉,以后多向博主学习学习PHP.
我的Blog http://ashun.cnblogs.com/
03月 4th, 2007 at 10:20:21
帮你改了一下: SendMail函数
修改这几句
$this->_mailSubject =”=?gb2312?B?”.base64_encode($mailSubject).”?=”;
$this->_mailBody = base64_encode($mailBody);
$SendContent = “From:{$this->_mailFrom}\r\n”;
$SendContent .= “To:{$this->_mailTo}\r\n”;
$SendContent .= “Subject:{$this->_mailSubject}\r\n”;
$SendContent .= “MIME-Version: 1.0\r\n”;
$SendContent .= “Content-Type: text/plain; charset=\”gb2312\”\r\n”;
$SendContent .= “Content-Transfer-Encoding: base64\r\n\r\n”;
$SendContent .= $this->_mailBody;
这样标题,内容发中文,英文都安全了
03月 6th, 2007 at 21:11:13
就是啊,很搞笑啊!你致力于PHP,却用ASP的Blog程序,呵呵
但是你的DIV+CSS对我入门帮助很大,正准备改写站点,如果有时间的话
http://www.vipmedia.cn
http://www.vipmedia.cn/drupal/
03月 7th, 2007 at 12:12:51
[quote=sintian]就是啊,很搞笑啊!你致力于PHP,却用ASP的Blog程序,呵呵
但是你的DIV+CSS对我入门帮助很大,正准备改写站点,如果有时间的话
http://www.vipmedia.cn
http://www.vipmedia.cn/drupal/
以前我是PJBLOG的团队成员,而且PJBLOG的作者舜子给了我非常大的帮助,人不能忘本,况且PJBLOG本身就是一个非常好的程序,所以我们也还是要支持他的。
03月 26th, 2007 at 22:20:19
帮你改了一下: SendMail函数http://www.cnmarketiva.com
修改这几句
$this->_mailSubject =”=?gb2312?B?”.base64_encode($mailSubject).”?=”;
$this->_mailBody = base64_encode($mailBody);
$SendContent = “From:{$this->_mailFrom}\r\n”;
$SendContent .= “To:{$this->_mailTo}\r\n”;
$SendContent .= “Subject:{$this->_mailSubject}\r\n”;
$SendContent .= “MIME-Version: 1.0\r\n”;
$SendContent .= “Content-Type: text/plain; charset=\”gb2312\”\r\n”;
$SendContent .= “Content-Transfer-Encoding: base64\r\n\r\n”;
$SendContent .= $this->_mailBody;
这样标题,内容发中文,英文都安全了
04月 6th, 2007 at 13:33:07
本当然是不能忘的,但是别忘了你的本质工作,要研究php。
你可以用php开发出来一个呀。
Always ASP 。
06月 27th, 2007 at 10:22:24
http://www.eyesonchina.cn是个人网站。想跟你做个友情链接。
呵呵