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

來源:互聯網
上載者:User
關鍵字 電子郵件 發送 資訊 響應 顯示 var 是否 命令 返回
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 .= \"
\";
13 $message=nl2br($message);
14 echo \"${m}${message}\";
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)。

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

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.