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 相关文章推荐
mysql5写入和读出乱码解决
Nov 25 PHP
php笔记之:AOP的应用
Apr 24 PHP
迅速确定php多维数组的深度的方法
Jan 07 PHP
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
May 08 PHP
php中current、next与reset函数用法实例
Nov 17 PHP
Codeigniter校验ip地址的方法
Mar 21 PHP
php 在线导入mysql大数据程序
Jun 11 PHP
PHP实现事件机制实例分析
Jun 26 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
Dec 18 PHP
php基于闭包实现函数的自调用(递归)实例分析
Nov 11 PHP
PHP实现函数内修改外部变量值的方法示例
Dec 28 PHP
PHP实现的敏感词过滤方法示例
Mar 06 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
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
Javascript实例教程(19) 使用HoTMetal(2)
2006/12/23 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
JS密码生成与强度检测完整实例(附demo源码下载)
2016/04/06 Javascript
微信支付 JS API支付接口详解
2016/07/11 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
2019/06/18 jQuery
基于JS实现父组件的请求服务过程解析
2019/10/14 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
Python使用MONGODB入门实例
2015/05/11 Python
使用Python3编写抓取网页和只抓网页图片的脚本
2015/08/20 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
为什么你还不懂得怎么使用Python协程
2019/05/13 Python
基于Python实现剪切板实时监控方法解析
2019/09/11 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
python使用rsa非对称加密过程解析
2019/12/28 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
解决Django no such table: django_session的问题
2020/04/07 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
天巡全球:Skyscanner Global
2017/06/20 全球购物
小学教师的个人自我鉴定
2013/10/26 职场文书
欢送退休感言
2014/02/08 职场文书
校园文明倡议书
2014/05/16 职场文书
小学生春游活动方案
2014/08/20 职场文书
团代会闭幕词
2015/01/28 职场文书
年底个人总结范文
2015/03/10 职场文书
消费者理赔投诉书
2015/07/02 职场文书
成本低的5个创业项目:投资小、赚钱快
2019/08/20 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript