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