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 相关文章推荐
php中serialize序列化与json性能测试的示例分析
Apr 27 PHP
PHP的preg_match匹配字符串长度问题解决方法
May 03 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
Sep 16 PHP
自己写的php curl库实现整站克隆功能
Feb 12 PHP
详解PHP的Yii框架中自带的前端资源包的使用
Mar 31 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
Jun 21 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
Feb 10 PHP
PHP控制反转(IOC)和依赖注入(DI)
Mar 13 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
php7函数,声明,返回值等新特性介绍
May 25 PHP
php压缩文件夹最新版
Jul 18 PHP
PHP7 整型处理机制修改
Mar 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
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
php xml文件操作代码(一)
2009/03/20 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
PHP 加密 Password Hashing API基础知识点
2020/03/02 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
javascript add event remove event
2008/04/07 Javascript
js获取图片长和宽度的代码
2009/11/24 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
Vue-router 切换组件页面时进入进出动画方法
2018/09/01 Javascript
vue中datepicker的使用教程实例代码详解
2019/07/08 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
python开发的小球完全弹性碰撞游戏代码
2013/10/15 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
python三方库之requests的快速上手
2019/03/04 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
Django权限设置及验证方式
2020/05/13 Python
解决python运行启动报错问题
2020/06/01 Python
基于opencv实现简单画板功能
2020/08/02 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
利用CSS3实现自定义滚动条代码分享
2016/08/18 HTML / CSS
canvas实现手机的手势解锁的步骤详细
2020/03/16 HTML / CSS
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
C和C++经典笔试题附答案解析
2014/08/18 面试题
农村结婚典礼司仪主持词
2014/03/14 职场文书
商品陈列协议书
2014/09/29 职场文书
2015年村计划生育工作总结
2015/04/28 职场文书
入党转正申请书范文
2019/05/20 职场文书
golang日志包logger的用法详解
2021/05/05 Golang
MySQL 查询速度慢的原因
2021/05/25 MySQL