当前位置:首页 > PHP教程 > php应用 > 列表

php基于socket实现SMTP发送邮件的方法

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-15 17:22:55 浏览: 评论:0 

这篇文章主要介绍了php基于socket实现SMTP发送邮件的方法,实例分析了php采用socket实现smtp发送邮件的原理与技巧,具有一定参考借鉴价值,需要的朋友可以参考下

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

php采用socket通过SMTP发送邮件。

用的是php的php-sockets扩展,可以发送纯文本和html格式的邮件,代码如下:

  1. <?php 
  2. /** 
  3. * 邮件发送类 
  4. * 支持发送纯文本邮件和HTML格式的邮件 
  5. * @example 
  6. * $config = array( 
  7. *       "from" => "*****", 
  8. *       "to" => "***", 
  9. *       "subject" => "test", 
  10. *       "body" => "<b>test</b>", 
  11. *       "username" => "***", 
  12. *       "password" => "****", 
  13. *       "isHTML" => true 
  14. *   ); 
  15. * 
  16. * $mail = new MySendMail(); 
  17. * 
  18. * $mail->setServer("smtp.126.com"); 
  19. * 
  20. * $mail->setMailInfo($config); 
  21. * if(!$mail->sendMail()) { 
  22. *   echo $mail->error(); 
  23. *   return 1; 
  24. * } 
  25. */ 
  26. class MySendMail { 
  27.     /** 
  28.     * @var 邮件传输代理用户名 
  29.     * @access private 
  30.     */ 
  31.     private $_userName
  32.     /** 
  33.     * @var 邮件传输代理密码 
  34.     * @access private 
  35.     */ 
  36.     private $_password
  37.     /** 
  38.     * @var 邮件传输代理服务器地址 
  39.     * @access protected 
  40.     */ 
  41.     protected $_sendServer
  42.     /** 
  43.     * @var 邮件传输代理服务器端口 
  44.     * @access protected 
  45.     */ 
  46.     protected $_port=25; 
  47.     /** 
  48.     * @var 发件人 
  49.     * @access protected 
  50.     */ 
  51.     protected $_from
  52.     /** 
  53.     * @var 收件人 
  54.     * @access protected 
  55.     */ 
  56.     protected $_to
  57.     /** 
  58.     * @var 主题 
  59.     * @access protected 
  60.     */ 
  61.     protected $_subject
  62.     /** 
  63.     * @var 邮件正文 
  64.     * @access protected 
  65.     */ 
  66.     protected $_body
  67.     /** 
  68.     * @var 是否是HTML格式的邮件 
  69.     * @access protected 
  70.     */ 
  71.     protected $_isHTML=false; 
  72.     /** 
  73.     * @var socket资源 
  74.     * @access protected 
  75.     */ 
  76.     protected $_socket
  77.     /** 
  78.     * @var 错误信息 
  79.     * @access protected 
  80.     */ 
  81.     protected $_errorMessage
  82.     public function __construct($from=""$to=""$subject=""$body=""$server=""$username=""$password="",$isHTML=""$port="") { 
  83.         if(!emptyempty($from)){ 
  84.             $this->_from = $from
  85.         } 
  86.         if(!emptyempty($to)){ 
  87.             $this->_to = $to
  88.         } 
  89.         if(!emptyempty($subject)){ 
  90.             $this->_subject = $subject
  91.         } 
  92.         if(!emptyempty($body)){ 
  93.             $this->_body = $body
  94.         } 
  95.         if(!emptyempty($isHTML)){ 
  96.             $this->_isHTML = $isHTML
  97.         } 
  98.         if(!emptyempty($server)){ 
  99.             $this->_sendServer = $server
  100.         } 
  101.         if(!emptyempty($port)){ 
  102.             $this->_port = $port
  103.         } 
  104.         if(!emptyempty($username)){ 
  105.             $this->_userName = $username
  106.         } 
  107.         if(!emptyempty($password)){ 
  108.             $this->_password = $password
  109.         } 
  110.     } 
  111.     /** 
  112.     * 设置邮件传输代理 
  113.     * @param string $server 代理服务器的ip或者域名 
  114.     * @param int $port 代理服务器的端口,smtp默认25号端口 
  115.     * @param int $localPort 本地端口 
  116.     * @return boolean 
  117.     */ 
  118.     public function setServer($server$port=25) { 
  119.         if(!isset($server) || emptyempty($server) || !is_string($server)) { 
  120.             $this->_errorMessage = "first one is an invalid parameter"
  121.             return false; 
  122.         } 
  123.         if(!is_numeric($port)){ 
  124.             $this->_errorMessage = "first two is an invalid parameter"
  125.             return false; 
  126.         } 
  127.         $this->_sendServer = $server
  128.         $this->_port = $port
  129.         return true; 
  130.     } 
  131.     /** 
  132.     * 设置邮件 
  133.     * @access public 
  134.     * @param array $config 邮件配置信息 
  135.     * 包含邮件发送人、接收人、主题、内容、邮件传输代理的验证信息 
  136.     * @return boolean 
  137.     */ 
  138.     public function setMailInfo($config) { 
  139.         if(!is_array($config) || count($config) < 6){ 
  140.             $this->_errorMessage = "parameters are required"
  141.             return false; 
  142.         } 
  143.         $this->_from = $config['from']; 
  144.         $this->_to = $config['to']; 
  145.         $this->_subject = $config['subject']; 
  146.         $this->_body = $config['body']; 
  147.         $this->_userName = $config['username']; 
  148.         $this->_password = $config['password']; 
  149.         if(isset($config['isHTML'])){ 
  150.             $this->_isHTML = $config['isHTML']; 
  151.         } 
  152.         return true; 
  153.     } 
  154.     /** 
  155.     * 发送邮件 
  156.     * @access public 
  157.     * @return boolean 
  158.     */ 
  159.     public function sendMail() { 
  160.         $command = $this->getCommand(); 
  161.         $this->socket(); 
  162.         foreach ($command as $value) { 
  163.             if($this->sendCommand($value[0], $value[1])) { 
  164.                 continue
  165.             } 
  166.             else
  167.                 return false; 
  168.             } 
  169.         } 
  170.         $this->close(); //其实这里也没必要关闭,smtp命令:QUIT发出之后,服务器就关闭了连接,本地的socket资源会自动释放 
  171.         echo 'Mail OK!'
  172.         return true; 
  173.     } 
  174.     /** 
  175.     * 返回错误信息 
  176.     * @return string 
  177.     */ 
  178.     public function error(){ 
  179.         if(!isset($this->_errorMessage)) { 
  180.             $this->_errorMessage = ""
  181.         } 
  182.         return $this->_errorMessage; 
  183.     } 
  184.     /** 
  185.     * 返回mail命令 
  186.     * @access protected 
  187.     * @return array 
  188.     */ 
  189.     protected function getCommand() { 
  190.         if($this->_isHTML) { 
  191.             $mail = "MIME-Version:1.0\r\n"
  192.             $mail .= "Content-type:text/html;charset=utf-8\r\n"
  193.             $mail .= "FROM:test<" . $this->_from . ">\r\n"
  194.             $mail .= "TO:<" . $this->_to . ">\r\n"
  195.             $mail .= "Subject:" . $this->_subject ."\r\n\r\n"
  196.             $mail .= $this->_body . "\r\n.\r\n"
  197.         } 
  198.         else
  199.             $mail = "FROM:test<" . $this->_from . ">\r\n"
  200.             $mail .= "TO:<" . $this->_to . ">\r\n"
  201.             $mail .= "Subject:" . $this->_subject ."\r\n\r\n"
  202.             $mail .= $this->_body . "\r\n.\r\n"
  203.         } 
  204.         $command = array
  205.                 array("HELO sendmail\r\n", 250), 
  206.                 array("AUTH LOGIN\r\n", 334), 
  207.                 array(base64_encode($this->_userName) . "\r\n", 334), 
  208.                 array(base64_encode($this->_password) . "\r\n", 235), 
  209.                 array("MAIL FROM:<" . $this->_from . ">\r\n", 250), 
  210.                 array("RCPT TO:<" . $this->_to . ">\r\n", 250), 
  211.                 array("DATA\r\n", 354), 
  212.                 array($mail, 250), 
  213.                 array("QUIT\r\n", 221) 
  214.         ); 
  215.         return $command
  216.     } 
  217.     /** 
  218.     * @access protected 
  219.     * @param string $command 发送到服务器的smtp命令 
  220.     * @param int $code 期望服务器返回的响应吗 
  221.     * @param boolean 
  222.     */ 
  223.     protected function sendCommand($command$code) { 
  224.         echo 'Send command:' . $command . ',expected code:' . $code . '<br />'
  225.         //发送命令给服务器 
  226.         try{ 
  227.             if(socket_write($this->_socket, $commandstrlen($command))){ 
  228.                 //读取服务器返回 
  229.                 $data = trim(socket_read($this->_socket, 1024)); 
  230.                 echo 'response:' . $data . '<br /><br />'
  231.                 if($data) { 
  232.                     $pattern = "/^".$code."/"
  233.                     if(preg_match($pattern$data)) { 
  234.                         return true; 
  235.                     } 
  236.                     else
  237.                         $this->_errorMessage = "Error:" . $data . "|**| command:"
  238.                         return false; 
  239.                     } 
  240.                 } 
  241.                 else
  242.                     $this->_errorMessage = "Error:" . socket_strerror(socket_last_error()); 
  243.                     return false; 
  244.                 } 
  245.             } 
  246.             else
  247.                 $this->_errorMessage = "Error:" . socket_strerror(socket_last_error()); 
  248.                 return false; 
  249.             } 
  250.         }catch(Exception $e) { 
  251.             $this->_errorMessage = "Error:" . $e->getMessage(); 
  252.         } 
  253.     } 
  254.     /** 
  255.     * 建立到服务器的网络连接 
  256.     * @access private 
  257.     * @return boolean 
  258.     */ 
  259.     private function socket() { 
  260.         if(!function_exists("socket_create")) { 
  261.             $this->_errorMessage = "extension php-sockets must be enabled"
  262.             return false; 
  263.         } 
  264.         //创建socket资源 
  265.         $this->_socket = socket_create(AF_INET, SOCK_STREAM, getprotobyname('tcp')); 
  266.         if(!$this->_socket) { 
  267.             $this->_errorMessage = socket_strerror(socket_last_error()); 
  268.             return false; 
  269.         } 
  270.         //连接服务器 
  271.         if(!socket_connect($this->_socket, $this->_sendServer, $this->_port)) { 
  272.             $this->_errorMessage = socket_strerror(socket_last_error()); 
  273.             return false; 
  274.         } 
  275.         socket_read($this->_socket, 1024); 
  276.         return true; 
  277.     } 
  278.     /** 
  279.     * 关闭socket 
  280.     * @access private 
  281.     * @return boolean 
  282.     */ 
  283.     private function close() { 
  284.         if(isset($this->_socket) && is_object($this->_socket)) { 
  285.             $this->_socket->close(); 
  286.             return true; 
  287.         } 
  288.         $this->_errorMessage = "no resource can to be close"
  289.         return false; 
  290.     } 
  291. /**************************** Test ***********************************/ 
  292. $config = array
  293.         "from" => "XXXXX"
  294.         "to" => "XXXXX"
  295.         "subject" => "test"
  296.         "body" => "<b>test</b>"
  297.         "username" => "XXXXX"
  298.         "password" => "******"
  299.         //"isHTML" => true 
  300.     ); 
  301. $mail = new MySendMail(); 
  302. $mail->setServer("smtp.126.com"); 
  303. $mail->setMailInfo($config); 
  304. if(!$mail->sendMail()) { 
  305.     echo $mail->error(); 
  306.     return 1; 
  307. }

Tags: socket SMTP发送邮件

分享到: