php基于socket实现SMTP发送邮件的方法
发布时间:2020-12-13 02:26:56 所属栏目:PHP教程 来源:网络整理
导读:《PHP实战:php基于socket实现SMTP发送邮件的方法》要点: 本文介绍了PHP实战:php基于socket实现SMTP发送邮件的方法,希望对您有用。如果有疑问,可以联系我们。 本篇章节讲解php基于socket实现SMTP发送邮件的方法.供大家参考研究.具体分析如下: P
《PHP实战:php基于socket实现SMTP发送邮件的方法》要点: 本篇章节讲解php基于socket实现SMTP发送邮件的方法.分享给大家供大家参考.具体分析如下:PHP实例 php采用socket通过SMTP发送邮件.
代码如下:
<?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.0rn"; ??????????? $mail .= "Content-type:text/html;charset=utf-8rn"; ??????????? $mail .= "FROM:test<" . $this->_from . ">rn"; ??????????? $mail .= "TO:<" . $this->_to . ">rn"; ??????????? $mail .= "Subject:" . $this->_subject ."rnrn"; ??????????? $mail .= $this->_body . "rn.rn"; ??????? } ??????? else{ ??????????? $mail = "FROM:test<" . $this->_from . ">rn"; ??????????? $mail .= "TO:<" . $this->_to . ">rn"; ??????????? $mail .= "Subject:" . $this->_subject ."rnrn"; ??????????? $mail .= $this->_body . "rn.rn"; ??????? } ??????? $command = array( ??????????????? array("HELO sendmailrn",250), ??????????????? array("AUTH LOGINrn",334), ??????????????? array(base64_encode($this->_userName) . "rn", ??????????????? array(base64_encode($this->_password) . "rn",235), ??????????????? array("MAIL FROM:<" . $this->_from . ">rn", ??????????????? array("RCPT TO:<" . $this->_to . ">rn", ??????????????? array("DATArn",354), ??????????????? array($mail, ??????????????? array("QUITrn",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程序设计有所帮助.PHP实例 欢迎参与《PHP实战:php基于socket实现SMTP发送邮件的方法》讨论,分享您的想法,编程之家 52php.cn为您提供专业教程。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |