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


Posted in PHP onOctober 09, 2006

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 (log_file">!@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 = "jack@knowsky.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);

?>

PHP 相关文章推荐
php jquery 实现新闻标签分类与无刷新分页
Dec 18 PHP
PHP 创建文件(文件夹)以及目录操作代码
Mar 04 PHP
如何利用PHP执行.SQL文件
Jul 05 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
Aug 05 PHP
基于递归实现的php树形菜单代码
Nov 19 PHP
使用PHP Socket 编程模拟Http post和get请求
Nov 25 PHP
学习php设计模式 php实现适配器模式
Dec 07 PHP
PHP实现文件上传下载实例
Oct 18 PHP
PHP创建多级目录的两种方法
Oct 28 PHP
Laravel下生成验证码的类
Nov 15 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
Dec 18 PHP
laravel框架实现后台登录、退出功能示例
Oct 31 PHP
PHP5.0正式发布 不完全兼容PHP4 新增多项功能
Oct 09 #PHP
动态网站web开发 PHP、ASP还是ASP.NET
Oct 09 #PHP
WINDOWS服务器安装多套PHP的另类解决方案
Oct 09 #PHP
在同一窗体中使用PHP来处理多个提交任务
Oct 09 #PHP
使用MaxMind 根据IP地址对访问者定位
Oct 09 #PHP
Zend公司全球首推PHP认证
Oct 09 #PHP
真正面向对象编程:PHP5.01发布
Oct 09 #PHP
You might like
咖啡的化学
2021/03/03 咖啡文化
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
用函数读出数据表内容放入二维数组
2006/10/09 PHP
php和javascript之间变量的传递实现代码
2012/12/19 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
js实例属性和原型属性示例详解
2014/11/23 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
2015/01/02 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
JavaScript组件开发之输入框加候选框
2017/03/10 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
JavaScript模板引擎应用场景及实现原理详解
2018/12/14 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
2019/05/12 Javascript
vue双向绑定数据限制长度的方法
2019/11/04 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
[47:45]Liquid vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python解析发往本机的数据包示例 (解析数据包)
2014/01/16 Python
python实现无证书加密解密实例
2014/10/27 Python
python中星号变量的几种特殊用法
2016/09/07 Python
Django1.9 加载通过ImageField上传的图片方法
2018/05/25 Python
Linux下python3.7.0安装教程
2018/07/30 Python
html5 Canvas画图教程(7)—canvas里画曲线之quadraticCurveTo方法
2013/01/09 HTML / CSS
升职自荐信
2013/11/28 职场文书
优秀学生干部推荐材料
2014/02/03 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
python Django框架快速入门教程(后台管理)
2021/07/21 Python
SQL IDENTITY_INSERT作用案例详解
2021/08/23 MySQL