php中通过smtp发邮件的类,测试通过


Posted in PHP onJanuary 22, 2007

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 = "reterry123@163.com";//SMTP服务器的用户邮箱 
$smtpemailto = "dxytools@gmail.com";//发送给谁 
$smtpuser = "reterry123";//SMTP服务器的用户帐号 
$smtppass = "014040001";//SMTP服务器的用户密码 
$mailsubject = "中文";//邮件主题 
$mailbody = "<h1>中文</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 相关文章推荐
一个oracle+PHP的查询的例子
Oct 09 PHP
dedecms采集中可以过滤多行代码的正则表达式
Mar 17 PHP
ajax php 实现写入数据库
Sep 02 PHP
ThinkPHP3.1新特性之对分组支持的改进与完善概述
Jun 19 PHP
php中Ctype函数用法详解
Dec 09 PHP
php获取当月最后一天函数分享
Feb 02 PHP
thinkphp实现图片上传功能
Jan 13 PHP
php使用pear_smtp发送邮件
Apr 15 PHP
利用phpexcel对数据库数据的导入excel(excel筛选)、导出excel
Apr 27 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
phpcms配置列表页以及获得文章发布时间
Jul 04 PHP
PHP大文件分割分片上传实现代码
Dec 09 PHP
php5.2.0内存管理改进
Jan 22 #PHP
php中截取字符串支持utf-8
Jan 18 #PHP
php中的登陆login
Jan 18 #PHP
php中的时间显示
Jan 18 #PHP
解决phpmyadmin中文乱码问题。。。
Jan 18 #PHP
php批量删除数据
Jan 18 #PHP
mysql 的 like 问题,超强毕杀记!!!
Jan 18 #PHP
You might like
历史证明,懒惰才是推动科学发展技术进步的动力
2021/03/02 无线电
有关php运算符的知识大全
2011/11/03 PHP
详解PHP中strlen和mb_strlen函数的区别
2014/03/07 PHP
PHP实现四种基础排序算法的运行时间比较(推荐)
2016/08/11 PHP
JavaScript语句可以不以;结尾的烦恼
2007/03/08 Javascript
引用外部js乱码问题分析及解决方案
2013/04/12 Javascript
谈谈JavaScript中的函数与闭包
2013/04/14 Javascript
jqGrid表格应用之新增与删除数据附源码下载
2015/12/02 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
几种经典排序算法的JS实现方法
2016/03/25 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
JavaScript实现Java中Map容器的方法
2016/10/09 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
js经验分享 JavaScript反调试技巧
2018/03/10 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
微信小程序scroll-view横向滑动嵌套for循环的示例代码
2018/09/20 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
深入解读VUE中的异步渲染的实现
2020/06/19 Javascript
vue setInterval 定时器失效的解决方式
2020/07/30 Javascript
在Python程序中进行文件读取和写入操作的教程
2015/04/28 Python
Python编写登陆接口的方法
2017/07/10 Python
python实现祝福弹窗效果
2019/04/07 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
python多进程重复加载的解决方式
2019/12/13 Python
前端canvas水印快速制作(附完整代码)
2019/09/19 HTML / CSS
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
介绍一下HTTP、HTTPS和SSL
2012/12/16 面试题
信息管理专业学生自荐信格式
2013/09/22 职场文书
英语道歉信范文
2014/01/09 职场文书
餐饮投资计划书
2014/04/25 职场文书
教师政风行风自查自纠报告
2014/10/21 职场文书
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
2021/04/06 Oracle
Python图片验证码降噪和8邻域降噪
2021/08/30 Python
MySQL修改默认引擎和字符集详情
2021/09/25 MySQL