eslizn 发表于 2013-10-09 09:39

分享一个直接发送邮件的代码

直接投递到邮件服务器,不需要使用smtp,建议设置spf,支持附件发送
<?php
/**
* Email Class
*
* @author eslizn <eslizn@live.cn>
* @package Vendor\Util
* @version $Id
*/

class Email{
       
        var $data;
        var $error=array();

        var $version='1.0';
        var $mailer='Xmailer';
        var $charset='UTF-8';
        var $type='text/plain';
        var $boundary='#25f9e794323b453885f5181f1b624d0b#';

        var $subject;
        var $message;
        var $attach=array();

        /**
       * 设置邮件主要信息
       * @param string $subject 邮件主题
       * @param string $message 邮件正文
       * @param string $from    邮件发送人
       * @param mixed $data   邮件正文替换数据
       */
        function __construct($subject,$message,$from,$data=null){
                $this->subject=$subject;
                $this->message=$message;
                $this->from=$from;
                $this->data=$data;
        }
       
        /**
       * 添加附件
       * @paramstring $name 附件名
       * @parambytes $data 附件数据
       * @paramstring $type 附件MIME类型
       * @return object      
       */
        function attach($name,$data,$type){
                array_push($this->attach,array(
                        'type'=>$type,
                        'name'=>$name,
                        'data'=>$data
                ));
                return $this;
        }
       
        /**
       * 增加替换数据
       * @paramstring $offset
       * @paramstring $value
       * @return object         
       */
        function assign($offset,$value){
                $this->data[$offset]=$value;
                return $this;
        }

        /**
       * 发送邮件
       * @paramstring $to 收件人
       * @return boolean
       */
        function send($to){
                $msg=array();
                if($this->version){
                        array_push($msg, "MIME-Version: {$this->version}");
                }
                if($this->mailer){
                        array_push($msg, "X-Mailer: {$this->mailer}");
                }
                $rule="/(+)\@(+)/i";

                if(!preg_match($rule,$to,$to) || !preg_match($rule,$this->from,$from)){
                        array_push($this->error,'email format error!');
                        return false;
                }

                if (!getmxrr($to,$mx)){
                        array_push($this->error,'get mx record error!');
                        return false;
                }

                array_push($msg, "From: {$from} <{$from}>");
                array_push($msg, "To: {$to} <{$to}>");
                array_push($msg, "Date: ".date("D, t F Y H:i:s O"));
                array_push($msg, "Subject: =?{$this->charset}?B?".base64_encode($this->subject)."?=");

                if($this->attach){
                        array_push($msg, "Content-Type: multipart/mixed; boundary=\"{$this->boundary}\"");
                }else{
                        array_push($msg, "Content-Type: {$this->type}; charset={$this->charset}");
                }
                array_push($msg, "Content-Transfer-Encoding: base64");
               
                if($this->data){
                        foreach ($this->data as $offset => $value) {
                                $this->message=str_replace('{.$offset.'}', $value, $this->message);
                        }
                }

                if($this->attach){
                        array_push($msg, "--{$this->boundary}");
                        array_push($msg, "Content-Type: {$this->type}; charset={$this->charset}");
                        array_push($msg, "Content-Transfer-Encoding: base64");
                        array_push($msg, "");
                        array_push($msg, base64_encode($this->message));
                }else{
                        array_push($msg, "");
                        array_push($msg, base64_encode($this->message));
                }

                if($this->attach){
                        foreach ($this->attach as $attach) {
                                array_push($msg, "--{$this->boundary}");
                                array_push($msg, "Content-Type: {$attach['type']}; name=\"{$attach['name']}\"");
                                array_push($msg, "Content-Transfer-Encoding: base64");
                                array_push($msg, "");
                                array_push($msg, base64_encode($attach['data']));
                        }
                }

                $cmds=array(
                        "HELO {$from}",
                        "MAIL FROM:<{$from}>",
                        "RCPT TO:<{$to}>",
                        "DATA",
                        implode("\r\n",$msg)."\r\n.\r\n",
                        "QUIT"
                );

                $fp=fsockopen(current($mx),25);
                foreach($cmds as $val){
                        fwrite($fp,$val."\r\n");
                        $status=fgets($fp);
                        if(preg_match('/^(\d+) ([\w\W]+)$/', $status,$status)){
                                if(!in_array($status, array(220, 354, 214, 211, 250, 251))){
                                        array_push($this->error, $status);
                                        return false;
                                }
                        }
                }
                fclose($fp);
                return true;
        }

        /**
       * 获取错误信息
       * @return
       */
        function getError(){
                return $this->error;
        }

}
页: [1]
查看完整版本: 分享一个直接发送邮件的代码