現在開始介紹我所編寫的發送郵件類。有了上面的預備知識了,下面就是實現了。 類的成員變量 var $lastmessage; //記錄最后返回的響應信息 var $lastact; //最后的動作,字符串形式 var $welcome; //用在HELO后面,歡迎用戶 var $debug; //是否顯示調試信息 var $smtp; //smtp服務器 var $port; //smtp端口號 var $fp; //socket句柄 其中,$lastmessage和$lastact用于記錄最后一次響應信息及執行的命令,當出錯時,用戶可以使用它們。為了測試需要,我還定義了$debug變量,當其值為true時,會在運行過程中顯示一些執行信息,否則無任何輸出。$fp用于保存打開后的socket句柄。 類的構造
這個構造函數主要完成一些初始值的判定及設置。$welcome用于HELO指令中,告訴服務器用戶的名字。HELO指令要求為機器名,但是不用也可以。如果用戶沒有給出$welcome,則自動查找本地的機器名。 顯示調試信息
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"; }
這個函數用來顯示調試信息。可以在$inout中指定是上傳的指令還是返回的響應,如果為上傳指令,則使用"out";如果為返回的響應則使用"in"。 第3行,判斷是否要輸出調試信息。
1 function show_debug($message, $inout)2 {3 if ($this->debug)4 {5 if($inout=="in") //響應信息6 {7 $m='<< ';8 }9 else10 $m='>> ';11 if(!ereg("/n$", $message))12 $message .= "<br>";13 $message=nl2br($message);14 echo "<font color=#999999>${m}${message}</font>";15 }16 }
在編寫socket處理部分發現,一些命令的處理很相似,如HELO,MAIL FROM,RCPT TO,QUIT,DATA命令,都要求根據是否顯示調試信息將相關內容顯示出來,同時對于返回的響應碼,如果是期望的,則應繼續處理,如果不是期望的,則應中斷出理。所以為了清晰與簡化,專門對這些命令的處理編寫了一個通用處理函數。函數的參數中$code為期望的響應碼,如果響應碼與之相同則表示處理成功,否則出錯。 第3行,記錄最后執行命令。
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 else13 return true;14 }
新聞熱點
疑難解答
圖片精選