PHP支持發送HTML格式郵件的發送類

mmxn 10年前發布 | 2K 次閱讀 PHP

    <?php
/**

* 郵件發送類 
* 支持發送純文本郵件和HTML格式的郵件 
* @example 
* $config = array( 
*       "from" => "*****", 
*       "to" => "***", 
*       "subject" => "test", 
*       "body" => "<b>test</b>", 
*       "username" => "***", 
*       "password" => "****", 
*       "isHTML" => true 
*   ); 
* 
* $mail = new MySendMail(); 
* 
* $mail->setServer("smtp.126.com"); 
* 
* $mail->setMailInfo($config); 
* if(!$mail->sendMail()) { 
*   echo $mail->error(); 
*   return 1; 
* } 
*/  
class MySendMail{  
    /** 
    * @var 郵件傳輸代理用戶名 
    * @access private 
    */  
    private $_userName;  

    /** 
    * @var 郵件傳輸代理密碼 
    * @access private 
    */  
    private $_password;  

    /** 
    * @var 郵件傳輸代理服務器地址 
    * @access protected 
    */  
    protected $_sendServer;  

    /** 
    * @var 郵件傳輸代理服務器端口 
    * @access protected 
    */  
    protected $_port=25;  

    /** 
    * @var 發件人 
    * @access protected 
    */  
    protected $_from;  

    /** 
    * @var 收件人 
    * @access protected 
    */  
    protected $_to;  

    /** 
    * @var 主題 
    * @access protected 
    */  
    protected $_subject;  

    /** 
    * @var 郵件正文 
    * @access protected 
    */  
    protected $_body;  

    /** 
    * @var 是否是HTML格式的郵件 
    * @access protected 
    */  
    protected $_isHTML=true;  

    /** 
    * @var socket資源 
    * @access protected 
    */  
    protected $_socket;  

    /** 
    * @var 錯誤信息 
    * @access protected 
    */  
    protected $_errorMessage;  

    public function __construct($from="", $to="", $subject="", $body="", $server="", $username="", $password="",$isHTML="", $port="") {  
        if(!empty($from)){  
            $this->_from = $from;  
        }  
        if(!empty($to)){  
            $this->_to = $to;  
        }  
        if(!empty($subject)){  
            $this->_subject = $subject;  
        }  
        if(!empty($body)){  
            $this->_body = $body;  
        }  
        if(!empty($isHTML)){  
            $this->_isHTML = $isHTML;  
        }  
        if(!empty($server)){  
            $this->_sendServer = $server;  
        }  
        if(!empty($port)){  
            $this->_port = $port;  
        }  
        if(!empty($username)){  
            $this->_userName = $username;  
        }  
        if(!empty($password)){  
            $this->_password = $password;  
        }  
    }  

    /** 
    * 設置郵件傳輸代理 
    * @param string $server 代理服務器的ip或者域名 
    * @param int $port 代理服務器的端口,smtp默認25號端口 
    * @param int $localPort 本地端口 
    * @return boolean 
    */  
    public function setServer($server, $port=25) {  
        if(!isset($server) || empty($server) || !is_string($server)) {  
            $this->_errorMessage = "first one is an invalid parameter";  
            return false;  
        }  
        if(!is_numeric($port)){  
            $this->_errorMessage = "first two is an invalid parameter";  
            return false;  
        }  
        $this->_sendServer = $server;  
        $this->_port = $port;  
        return true;  
    }  

    /** 
    * 設置郵件 
    * @access public 
    * @param array $config 郵件配置信息 
    * 包含郵件發送人、接收人、主題、內容、郵件傳輸代理的驗證信息 
    * @return boolean 
    */  
    public function setMailInfo($config) {  
        if(!is_array($config) || count($config) < 6){  
            $this->_errorMessage = "parameters are required";  
            return false;  
        }  

        $this->_from = $config['from'];  
        $this->_to = $config['to'];  
        $this->_subject = $config['subject'];  
        $this->_body = $config['body'];  
        $this->_userName = $config['username'];  
        $this->_password = $config['password'];  
        if(isset($config['isHTML'])){  
            $this->_isHTML = $config['isHTML'];  
        }  

        return true;  
    }  

    /** 
    * 發送郵件 
    * @access public 
    * @return boolean 
    */  
    public function sendMail() {  
        $command = $this->getCommand();  
        $this->socket();  

        foreach ($command as $value) {  
            if($this->sendCommand($value[0], $value[1])) {  
                continue;  
            }  
            else{  
                return false;  
            }  
        }  

        $this->close(); //其實這里也沒必要關閉,smtp命令:QUIT發出之后,服務器就關閉了連接,本地的socket資源會自動釋放  
        echo 'Mail OK!';  
        return true;  
    }  

    /** 
    * 返回錯誤信息 
    * @return string 
    */  
    public function error(){  
        if(!isset($this->_errorMessage)) {  
            $this->_errorMessage = "";  
        }  
        return $this->_errorMessage;  
    }  

    /** 
    * 返回mail命令 
    * @access protected 
    * @return array 
    */  
    protected function getCommand() {  
        if($this->_isHTML) {  
            $mail = "MIME-Version:1.0\r\n";  
            $mail .= "Content-type:text/html;charset=utf-8\r\n";  
            $mail .= "FROM:test<" . $this->_from . ">\r\n";  
            $mail .= "TO:<" . $this->_to . ">\r\n";  
            $mail .= "Subject:" . $this->_subject ."\r\n\r\n";  
            $mail .= $this->_body . "\r\n.\r\n";  
        }  
        else{  
            $mail = "FROM:test<" . $this->_from . ">\r\n";  
            $mail .= "TO:<" . $this->_to . ">\r\n";  
            $mail .= "Subject:" . $this->_subject ."\r\n\r\n";  
            $mail .= $this->_body . "\r\n.\r\n";  
        }  
        $command = array(  
                array("HELO sendmail\r\n", 250),  
                array("AUTH LOGIN\r\n", 334),  
                array(base64_encode($this->_userName) . "\r\n", 334),  
                array(base64_encode($this->_password) . "\r\n", 235),  
                array("MAIL FROM:<" . $this->_from . ">\r\n", 250),  
                array("RCPT TO:<" . $this->_to . ">\r\n", 250),  
                array("DATA\r\n", 354),  
                array($mail, 250),  
                array("QUIT\r\n", 221)  
        );  
        return $command;  
    }  

    /** 
    * @access protected 
    * @param string $command 發送到服務器的smtp命令 
    * @param int $code 期望服務器返回的響應嗎 
    * @param boolean 
    */  
    protected function sendCommand($command, $code) {  
        echo 'Send command:' . $command . ',expected code:' . $code . '<br />';  
        //發送命令給服務器  
        try{  
            if(socket_write($this->_socket, $command, strlen($command))){  
                //讀取服務器返回  
                $data = trim(socket_read($this->_socket, 1024));  
                echo 'response:' . $data . '<br /><br />';  
                if($data) {  
                    $pattern = "/^".$code."/";  
                    if(preg_match($pattern, $data)) {  
                        return true;  
                    }  
                    else{  
                        $this->_errorMessage = "Error:" . $data . "|**| command:";  
                        return false;  
                    }  
                }  
                else{  
                    $this->_errorMessage = "Error:" . socket_strerror(socket_last_error());  
                    return false;  
                }  
            }  
            else{  
                $this->_errorMessage = "Error:" . socket_strerror(socket_last_error());  
                return false;  
            }  
        }catch(Exception $e) {  
            $this->_errorMessage = "Error:" . $e->getMessage();  
        }  
    }  

    /** 
    * 建立到服務器的網絡連接 
    * @access private 
    * @return boolean 
    */  
    private function socket() {  
        if(!function_exists("socket_create")) {  
            $this->_errorMessage = "extension php-sockets must be enabled";  
            return false;  
        }  
        //創建socket資源  
        $this->_socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp'));  

        if(!$this->_socket) {  
            $this->_errorMessage = socket_strerror(socket_last_error());  
            return false;  
        }  

        //連接服務器  
        if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) {  
            $this->_errorMessage = socket_strerror(socket_last_error());  
            return false;  
        }  
        socket_read($this->_socket, 1024);  

        return true;  
    }  

    /** 
    * 關閉socket 
    * @access private 
    * @return boolean 
    */  
    private function close() {  
        if(isset($this->_socket) && is_object($this->_socket)) {  
            $this->_socket->close();  
            return true;  
        }  
        $this->_errorMessage = "no resource can to be close";  
        return false;  
    }  
}  


/**************************** Test ***********************************/  
$config = array(  
        "from" => "********@163.com",  
        "to" => "******@163.com",  
        "subject" => "test",  
        "body" => "<b style='font-size:30px;'>test</b>",  
        "username" => "******",  
        "password" => "password",  
    );  

$mail = new MySendMail();  

$mail->setServer("smtp.163.com");  

$mail->setMailInfo($config);  
if(!$mail->sendMail()){  
    echo $mail->error();  
    return 1;  
}  </pre> 


 本文由用戶 mmxn 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!