<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      在PHP中用Socket發送電子郵件(二)

      [摘要]send_mail類的實現  現在開始介紹我所編寫的發送郵件類。有了上面的預備知識了,下面就是實現了。 類的成員變量 var lastmessage; //記錄最后返回的響應信息 ...
      send_mail類的實現
        現在開始介紹我所編寫的發送郵件類。有了上面的預備知識了,下面就是實現了。

      類的成員變量

      var $lastmessage; //記錄最后返回的響應信息
      var $lastact; //最后的動作,字符串形式
      var $welcome; //用在HELO后面,歡迎用戶
      var $debug; //是否顯示調試信息
      var $smtp; //smtp服務器
      var $port; //smtp端口號
      var $fp; //socket句柄

        其中,$lastmessage和$lastact用于記錄最后一次響應信息及執行的命令,當出錯時,用戶可以使用它們。為了測試需要,我還定義了$debug變量,當其值為true時,會在運行過程中顯示一些執行信息,否則無任何輸出。$fp用于保存打開后的socket句柄。

      類的構造


      --------------------------------------------------------------------------------
      function send_mail($smtp, $welcome="", $debug=false)
      {
      if(empty($smtp)) die("SMTP cannt be NULL!");
      $this->smtp=$smtp;
      if(empty($welcome))
      {
      $this->welcome=gethostbyaddr("localhost");
      }
      else
      $this->welcome=$welcome;
      $this->debug=$debug;
      $this->lastmessage="";
      $this->lastact="";
      $this->port="25";
      }
      --------------------------------------------------------------------------------
        這個構造函數主要完成一些初始值的判定及設置。$welcome用于HELO指令中,告訴服務器用戶的名字。HELO指令要求為機器名,但是不用也可以。如果用戶沒有給出$welcome,則自動查找本地的機器名。

      顯示調試信息

      --------------------------------------------------------------------------------
      1 function show_debug($message, $inout)
      2 {
      3 if ($this->debug)
      4 {
      5 if($inout=="in") //響應信息
      6 {
      7 $m='<< ';
      8 }
      9 else
      10 $m='>> ';
      11 if(!ereg("\n$", $message))
      12 $message .= "<br>";
      13 $message=nl2br($message);
      14 echo "<font color=#999999>${m}${message}</font>";
      15 }
      16 }
      --------------------------------------------------------------------------------
        這個函數用來顯示調試信息?梢栽$inout中指定是上傳的指令還是返回的響應,如果為上傳指令,則使用"out";如果為返回的響應則使用"in"。

      第3行,判斷是否要輸出調試信息。
      第5行,判斷是否為響應信息,如果是,則在第7行將信息的前面加上"<< "來區別信息;否則在第10行加上">> "來區別上傳指令。
      第11-12行,判斷信息串最后是否為換行符,如不是則加上HTML換行標記。第13行將所以的換行符轉成HTML的換行標記。
      第14行,輸出整條信息,同時將信息顏色置為灰色以示區別。執行一個命令

      --------------------------------------------------------------------------------
      1 function do_command($command, $code)
      2 {
      3 $this->lastact=$command;
      4 $this->show_debug($this->lastact, "out");
      5 fputs ( $this->fp, $this->lastact );
      6 $this->lastmessage = fgets ( $this->fp, 512 );
      7 $this->show_debug($this->lastmessage, "in");
      8 if(!ereg("^$code", $this->lastmessage))
      9 {
      10 return false;
      11 }
      12 else
      13 return true;
      14 }
      --------------------------------------------------------------------------------
        在編寫socket處理部分發現,一些命令的處理很相似,如HELO,MAIL FROM,RCPT TO,QUIT,DATA命令,都要求根據是否顯示調試信息將相關內容顯示出來,同時對于返回的響應碼,如果是期望的,則應繼續處理,如果不是期望的,則應中斷出理。所以為了清晰與簡化,專門對這些命令的處理編寫了一個通用處理函數。函數的參數中$code為期望的響應碼,如果響應碼與之相同則表示處理成功,否則出錯。

      第3行,記錄最后執行命令。
      第4行,將上傳命令顯示出來。
      第5行,則使用fputs真正向服務器傳換指令。
      第6行,從服務器接收響應信息將放在最后響應消息變量中。
      第7行,將響應信息顯示出來。
      第8行,判斷響應信息是否期待的,如果是則第13行返回成功(true),否則在第10行返回失敗(false)。

        這樣,這個函數一方面完成指令及信息的發送顯示功能,別一方面對返回的響應判斷是否成功。





      日韩精品一区二区三区高清