本文实例讲述了php基于socket实现SMTP发送邮件的方法。分享给大家供大家参考。具体分析如下:

php采用socket通过SMTP发送邮件。用的是php的php-sockets扩展,可以发送纯文本和html格式的邮件。代码如下:复制代码 代码如下:<?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=false;    /**    * @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";            $mail .= "Content-type:text/html;charset=utf-8";            $mail .= "FROM:test<" . $this->_from . ">";            $mail .= "TO:<" . $this->_to . ">";            $mail .= "Subject:" . $this->_subject ."";            $mail .= $this->_body . ".";        }        else{            $mail = "FROM:test<" . $this->_from . ">";            $mail .= "TO:<" . $this->_to . ">";            $mail .= "Subject:" . $this->_subject ."";            $mail .= $this->_body . ".";        }        $command = array(                array("HELO sendmail", 250),                array("AUTH LOGIN", 334),                array(base64_encode($this->_userName) . "", 334),                array(base64_encode($this->_password) . "", 235),                array("MAIL FROM:<" . $this->_from . ">", 250),                array("RCPT TO:<" . $this->_to . ">", 250),                array("DATA", 354),                array($mail, 250),                array("QUIT", 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" => "XXXXX",        "to" => "XXXXX",        "subject" => "test",        "body" => "<b>test</b>",        "username" => "XXXXX",        "password" => "******",        //"isHTML" => true    );$mail = new MySendMail();$mail->setServer("smtp.126.com");$mail->setMailInfo($config);if(!$mail->sendMail()) {    echo $mail->error();    return 1;}

希望本文所述对大家的php程序设计有所帮助。