php基于socket實現SMTP發送郵件的方法_PHP教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:php計算兩個整數的最大公約數常用算法小結
      這篇文章主要介紹了php計算兩個整數的最大公約數常用算法,實例總結了求最大公約數的三種常用方法,具有一定參考借鑒價值,需要的朋友可以參考下 本文實例講述了php計算兩個整數的最大公約數常用算法。分享給大家供大家參考。具體如下: 代碼如下:?php //計時,返回秒 fun

       這篇文章主要介紹了php基于socket實現SMTP發送郵件的方法,實例分析了php采用socket實現smtp發送郵件的原理與技巧,具有一定參考借鑒價值,需要的朋友可以參考下

         

      本文實例講述了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\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" => "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 使用memcached簡單示例分享
      在很多場合,我們都會聽到 memcached 這個名字,但很多同學只是聽過,并沒有用過或實際了解過,只知道它是一個很不錯的東東。這里簡單介紹一下,memcached 是高效、快速的分布式內存對象緩存系統,主要用于加速WEB動態應用程序。今天我們就先來簡單探討下memcached的用

      來源:模板無憂//所屬分類:PHP教程/更新時間:2015-03-07
      相關PHP教程