首页 > php教程 > php手册 > 正文

PHP邮件发送类【完整版】

php中文网
发布: 2016-06-07 11:42:04
原创
1137人浏览过

支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送,带附件的邮件.
<?php <br /> /**<br> * 邮件发送类<br> * 支持发送纯文本邮件和HTML格式的邮件,可以多收件人,多抄送,多秘密抄送,带附件的邮件<br> * 需要的php扩展,sockets和Fileinfo。<br> * @example<br> * $mail = new MySendMail();<br> * $mail-&gt;setServer("XXXXX", "XXXXX@XXXXX", "XXXXX"); 设置smtp服务器<br> * $mail-&gt;setFrom("XXXXX"); 设置发件人<br> * $mail-&gt;setReceiver("XXXXX"); 设置收件人,多个收件人,调用多次<br> * $mail-&gt;setCc("XXXX"); 设置抄送,多个抄送,调用多次<br> * $mail-&gt;setBcc("XXXXX"); 设置秘密抄送,多个秘密抄送,调用多次<br> * $mail-&gt;setMailInfo("test", "<b>test</b>"); 设置邮件主题、内容<br> * $mail-&gt;sendMail(); 发送<br> */<br> class MySendMail {<br>     /**<br>     * @var string 邮件传输代理用户名<br>     * @access private<br>     */<br>     private $_userName;<br><br>     /**<br>     * @var string 邮件传输代理密码<br>     * @access private<br>     */<br>     private $_password;<br><br>     /**<br>     * @var string 邮件传输代理服务器地址<br>     * @access protected<br>     */<br>     protected $_sendServer;<br><br>     /**<br>     * @var int 邮件传输代理服务器端口<br>     * @access protected<br>     */<br>     protected $_port=25;<br><br>     /**<br>     * @var string 发件人<br>     * @access protected<br>     */<br>     protected $_from;<br><br>     /**<br>     * @var string 收件人<br>     * @access protected<br>     */<br>     protected $_to;<br><br>     /**<br>     * @var string 抄送<br>     * @access protected<br>     */<br>     protected $_cc;<br><br>     /**<br>     * @var string 秘密抄送<br>     * @access protected<br>     */<br>     protected $_bcc;<br><br>     /**<br>     * @var string 主题<br>     * @access protected<br>     */<br>     protected $_subject;<br><br>     /**<br>     * @var string 邮件正文<br>     * @access protected<br>     */<br>     protected $_body;<br><br>     /**<br>     * @var string 附件<br>     * @access protected<br>     */<br>     protected $_attachment;<br><br>     /**<br>     * @var reource socket资源<br>     * @access protected<br>     */<br>     protected $_socket;<br><br>     /**<br>     * @var string 错误信息<br>     * @access protected<br>     */<br>     protected $_errorMessage;<br><br>     /**<br>     * 设置邮件传输代理,如果是可以匿名发送有邮件的服务器,只需传递代理服务器地址就行<br>     * @access public<br>     * @param string $server 代理服务器的ip或者域名<br>     * @param string $username 认证账号<br>     * @param string $password 认证密码<br>     * @param int $port 代理服务器的端口,smtp默认25号端口<br>     * @return boolean<br>     */<br>     public function setServer($server, $username="", $password="", $port=25) {<br>         $this-&gt;_sendServer = $server;<br>         $this-&gt;_port = $port;<br>         if(!empty($username)) {<br>             $this-&gt;_userName = base64_encode($username);<br>         }<br>         if(!empty($password)) {<br>             $this-&gt;_password = base64_encode($password);<br>         }<br>         return true;<br>     }<br><br>     /**<br>     * 设置发件人<br>     * @access public<br>     * @param string $from 发件人地址<br>     * @return boolean<br>     */<br>     public function setFrom($from) {<br>         $this-&gt;_from = $from;<br>         return true;<br>     }<br><br>     /**<br>     * 设置收件人,多个收件人,连续调用多次.<br>     * @access public<br>     * @param string $to 收件人地址<br>     * @return boolean<br>     */<br>     public function setReceiver($to) {<br>         if(isset($this-&gt;_to)) {<br>             if(is_string($this-&gt;_to)) {<br>                 $this-&gt;_to = array($this-&gt;_to);<br>                 $this-&gt;_to[] = $to;<br>                 return true;<br>             }<br>             elseif(is_array($this-&gt;_to)) {<br>                 $this-&gt;_to[] = $to;<br>                 return true;<br>             }<br>             else {<br>                 return false;<br>             }<br>         }<br>         else {<br>             $this-&gt;_to = $to;<br>             return true;<br>         }<br>     }<br><br>     /**<br>     * 设置抄送,多个抄送,连续调用多次.<br>     * @access public<br>     * @param string $cc 抄送地址<br>     * @return boolean<br>     */<br>     public function setCc($cc) {<br>         if(isset($this-&gt;_cc)) {<br>             if(is_string($this-&gt;_cc)) {<br>                 $this-&gt;_cc = array($this-&gt;_cc);<br>                 $this-&gt;_cc[] = $cc;<br>                 return true;<br>             }<br>             elseif(is_array($this-&gt;_cc)) {<br>                 $this-&gt;_cc[] = $cc;<br>                 return true;<br>             }<br>             else {<br>                 return false;<br>             }<br>         }<br>         else {<br>             $this-&gt;_cc = $cc;<br>             return true;<br>         }<br>     }<br><br>     /**<br>     * 设置秘密抄送,多个秘密抄送,连续调用多次<br>     * @access public<br>     * @param string $bcc 秘密抄送地址<br>     * @return boolean<br>     */<br>     public function setBcc($bcc) {<br>         if(isset($this-&gt;_bcc)) {<br>             if(is_string($this-&gt;_bcc)) {<br>                 $this-&gt;_bcc = array($this-&gt;_bcc);<br>                 $this-&gt;_bcc[] = $bcc;<br>                 return true;<br>             }<br>             elseif(is_array($this-&gt;_bcc)) {<br>                 $this-&gt;_bcc[] = $bcc;<br>                 return true;<br>             }<br>             else {<br>                 return false;<br>             }<br>         }<br>         else {<br>             $this-&gt;_bcc = $bcc;<br>             return true;<br>         }<br>     }<br><br>     /**<br>     * 设置邮件信息<br>     * @access public<br>     * @param string $body 邮件主题<br>     * @param string $subject 邮件主体内容,可以是纯文本,也可是是HTML文本<br>     * @param string $attachment 附件,文件地址<br>     * @return boolean<br>     */<br>     public function setMailInfo($subject, $body, $attachment="") {<br>         $this-&gt;_subject = $subject;<br>         $this-&gt;_body = base64_encode($body);<br>         if(!empty($attachment)) {<br>             $this-&gt;_attachment = $attachment;<br>         }<br>         return true;<br>     }<br><br>     /**<br>     * 发送邮件<br>     * @access public<br>     * @return boolean<br>     */<br>     public function sendMail() {<br>         $command = $this-&gt;getCommand();<br>         $this-&gt;socket();<br><br>         foreach ($command as $value) {<br>             if($this-&gt;sendCommand($value[0], $value[1])) {<br>                 continue;<br>             }<br>             else{<br>                 return false;<br>             }<br>         }<br><br>         //其实这里也没必要关闭,smtp命令:QUIT发出之后,服务器就关闭了连接,本地的socket资源会自动释放<br>         $this-&gt;close(); <br>         echo 'Mail OK!';<br>         return true;<br>     }<br><br>     /**<br>     * 返回错误信息<br>     * @return string<br>     */<br>     public function error(){<br>         if(!isset($this-&gt;_errorMessage)) {<br>             $this-&gt;_errorMessage = "";<br>         }<br>         return $this-&gt;_errorMessage;<br>     }<br><br>     /**<br>     * 返回mail命令<br>     * @access protected<br>     * @return array<br>     */<br>     protected function getCommand() {<br>         $command = array(<br>                 array("HELO sendmail\r\n", 250)<br>             );<br>         if(!empty($this-&gt;_userName)){<br>             $command[] = array("AUTH LOGIN\r\n", 334);<br>             $command[] = array($this-&gt;_userName . "\r\n", 334);<br>             $command[] = array($this-&gt;_password . "\r\n", 235);<br>         }<br>         $command[] = array("MAIL FROM:_from . "&gt;\r\n", 250);<br><br>         $separator = "----=_Part_" . md5($this-&gt;_from . time()) . uniqid(); //分隔符<br>         //设置发件人<br>         $header = "FROM: test_from . "&gt;\r\n";<br><br>         //设置收件人<br>         if(is_array($this-&gt;_to)) {<br>             $count = count($this-&gt;_to);<br>             for($i=0; $i                 $command[] = array("RCPT TO: _to[$i] . "&gt;\r\n", 250);<br>                 if($i == 0){<br>                     $header .= "TO: _to[$i] ."&gt;";<br>                 }<br>                 elseif($i + 1 == $count){<br>                     $header .= ",_to[$i] ."&gt;\r\n";<br>                 }<br>                 else{<br>                     $header .= ",_to[$i] ."&gt;";<br>                 }<br>             }<br>         }<br>         else{<br>             $command[] = array("RCPT TO: _to . "&gt;\r\n", 250);<br>             $header .= "TO: _to . "&gt;\r\n";<br>         }<br><br>         //设置抄送<br>         if(isset($this-&gt;_cc)) {<br>             if(is_array($this-&gt;_cc)) {<br>                 $count = count($this-&gt;_cc);<br>                 for($i=0; $i                     $command[] = array("RCPT TO: _cc[$i] . "&gt;\r\n", 250);<br>                     if($i == 0){<br>                     $header .= "CC: _cc[$i] ."&gt;";<br>                     }<br>                     elseif($i + 1 == $count){<br>                         $header .= ",_cc[$i] ."&gt;\r\n";<br>                     }<br>                     else{<br>                         $header .= ",_cc[$i] ."&gt;";<br>                     }<br>                 }<br>             }<br>             else{<br>                 $command[] = array("RCPT TO: _cc . "&gt;\r\n", 250);<br>                 $header .= "CC: _cc . "&gt;\r\n";<br>             }<br>         }<br><br>         //设置秘密抄送<br>         if(isset($this-&gt;_bcc)) {<br>             if(is_array($this-&gt;_bcc)) {<br>                 $count = count($this-&gt;_bcc);<br>                 for($i=0; $i                     $command[] = array("RCPT TO: _bcc[$i] . "&gt;\r\n", 250);<br>                     if($i == 0){<br>                     $header .= "BCC: _bcc[$i] ."&gt;";<br>                     }<br>                     elseif($i + 1 == $count){<br>                         $header .= ",_bcc[$i] ."&gt;\r\n";<br>                     }<br>                     else{<br>                         $header .= ",_bcc[$i] ."&gt;";<br>                     }<br>                 }<br>             }<br>             else{<br>                 $command[] = array("RCPT TO: _bcc . "&gt;\r\n", 250);<br>                 $header .= "BCC: _bcc . "&gt;\r\n";<br>             }<br>         }<br><br>         $header .= "Subject: " . $this-&gt;_subject ."\r\n";<br>         if(isset($this-&gt;_attachment)) {<br>             //含有附件的邮件头需要声明成这个<br>             $header .= "Content-Type: multipart/mixed;\r\n";<br>         }<br>         elseif(false){<br>             //邮件体含有图片资源的需要声明成这个<br>             $header .= "Content-Type: multipart/related;\r\n";<br>         }<br>         else{<br>             //html或者纯文本的邮件声明成这个<br>             $header .= "Content-Type: multipart/alternative;\r\n";<br>         }<br><br>         //邮件头分隔符<br>         $header .= "\t" . 'boundary="' . $separator . '"';<br>         $header .= "\r\nMIME-Version: 1.0\r\n";<br>         $header .= "\r\n--" . $separator . "\r\n";<br>         $header .= "Content-Type:text/html; charset=utf-8\r\n";<br>         $header .= "Content-Transfer-Encoding: base64\r\n\r\n";<br>         $header .= $this-&gt;_body . "\r\n";<br>         $header .= "--" . $separator . "\r\n";<br><br>         //加入附件<br>         if(isset($this-&gt;_attachment)){<br>             $header .= "\r\n--" . $separator . "\r\n";<br>             $header .= "Content-Type: " . $this-&gt;getMIMEType() . '; name="' . basename($this-&gt;_attachment) . '"' . "\r\n";<br>             $header .= "Content-Transfer-Encoding: base64\r\n";<br>             $header .= 'Content-Disposition: attachment; filename="' . basename($this-&gt;_attachment) . '"' . "\r\n";<br>             $header .= "\r\n";<br>             $header .= $this-&gt;readFile();<br>             $header .= "\r\n--" . $separator . "\r\n";<br>         }<br><br>         $header .= "\r\n.\r\n";<br><br>         $command[] = array("DATA\r\n", 354);<br>         $command[] = array($header, 250);<br>         $command[] = array("QUIT\r\n", 221);<br><br>         return $command;<br>     }<br><br>     /**<br>     * 发送命令<br>     * @access protected<br>     * @param string $command 发送到服务器的smtp命令<br>     * @param int $code 期望服务器返回的响应吗<br>     * @return boolean<br>     */<br>     protected function sendCommand($command, $code) {<br>         echo 'Send command:' . $command . ',expected code:' . $code . '<br>';<br>         //发送命令给服务器<br>         try{<br>             if(socket_write($this-&gt;_socket, $command, strlen($command))){<br><br>                 //当邮件内容分多次发送时,没有$code,服务器没有返回<br>                 if(empty($code))  {<br>                     return true;<br>                 }<br><br>                 //读取服务器返回<br>                 $data = trim(socket_read($this-&gt;_socket, 1024));<br>                 echo 'response:' . $data . '<br><br>';<br><br>                 if($data) {<br>                     $pattern = "/^".$code."/";<br>                     if(preg_match($pattern, $data)) {<br>                         return true;<br>                     }<br>                     else{<br>                         $this-&gt;_errorMessage = "Error:" . $data . "|**| command:";<br>                         return false;<br>                     }<br>                 }<br>                 else{<br>                     $this-&gt;_errorMessage = "Error:" . socket_strerror(socket_last_error());<br>                     return false;<br>                 }<br>             }<br>             else{<br>                 $this-&gt;_errorMessage = "Error:" . socket_strerror(socket_last_error());<br>                 return false;<br>             }<br>         }catch(Exception $e) {<br>             $this-&gt;_errorMessage = "Error:" . $e-&gt;getMessage();<br>         }<br>     }<br><br>     /**<br>     * 读取附件文件内容,返回base64编码后的文件内容<br>     * @access protected<br>     * @return mixed<br>     */<br>     protected function readFile() {<br>         if(isset($this-&gt;_attachment) &amp;&amp; file_exists($this-&gt;_attachment)) {<br>             $file = file_get_contents($this-&gt;_attachment);<br>             return base64_encode($file);<br>         }<br>         else {<br>             return false;<br>         }<br>     }<br><br>     /**<br>     * 获取附件MIME类型<br>     * @access protected<br>     * @return mixed<br>     */<br>     protected function getMIMEType() {<br>         if(isset($this-&gt;_attachment) &amp;&amp; file_exists($this-&gt;_attachment)) {<br>             $mime = mime_content_type($this-&gt;_attachment);<br>             if(! preg_match("/gif|jpg|png|jpeg/", $mime)){<br>                 $mime = "application/octet-stream";<br>             }<br>             return $mime;<br>         }<br>         else {<br>             return false;<br>         }<br>     }<br><br>     /**<br>     * 建立到服务器的网络连接<br>     * @access private<br>     * @return boolean<br>     */<br>     private function socket() {<br>         if(!function_exists("socket_create")) {<br>             $this-&gt;_errorMessage = "Extension sockets must be enabled";<br>             return false;<br>         }<br>         //创建socket资源<br>         $this-&gt;_socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));<br><br>         if(!$this-&gt;_socket) {<br>             $this-&gt;_errorMessage = socket_strerror(socket_last_error());<br>             return false;<br>         }<br><br>         socket_set_block($this-&gt;_socket);//设置阻塞模式<br><br>         //连接服务器<br>         if(!socket_connect($this-&gt;_socket, $this-&gt;_sendServer, $this-&gt;_port)) {<br>             $this-&gt;_errorMessage = socket_strerror(socket_last_error());<br>             return false;<br>         }<br>         socket_read($this-&gt;_socket, 1024);<br><br>         return true;<br>     }<br><br>     /**<br>     * 关闭socket<br>     * @access private<br>     * @return boolean<br>     */<br>     private function close() {<br>         if(isset($this-&gt;_socket) &amp;&amp; is_object($this-&gt;_socket)) {<br>             $this-&gt;_socket-&gt;close();<br>             return true;<br>         }<br>         $this-&gt;_errorMessage = "No resource can to be close";<br>         return false;<br>     }<br> }<br><br> /**************************** Test ***********************************/<br> $mail = new MySendMail();<br> $mail-&gt;setServer("XXXXX", "XXXXX@XXXXX", "XXXXX");<br> $mail-&gt;setFrom("XXXXX@XXXXX");<br> $mail-&gt;setReceiver("XXXXX@XXXXX");<br> //$mail-&gt;setReceiver("XXXXX@XXXXX");<br> $mail-&gt;setCc("XXXXX@XXXXX");<br> $mail-&gt;setCc("XXXXX@XXXXX");<br> $mail-&gt;setBcc("XXXXX@XXXXX");<br> $mail-&gt;setBcc("XXXXX@XXXXX");<br> $mail-&gt;setBcc("XXXXX@XXXXX");<br> $mail-&gt;setMailInfo("test", "<b>test</b>", "sms.zip");<br> $mail-&gt;sendMail();

AD:真正免费,域名+虚机+企业邮箱=0元

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号