明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

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

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

類的成員變量

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

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

類的構(gòu)造


--------------------------------------------------------------------------------
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";
}
--------------------------------------------------------------------------------
  這個(gè)構(gòu)造函數(shù)主要完成一些初始值的判定及設(shè)置。$welcome用于HELO指令中,告訴服務(wù)器用戶的名字。HELO指令要求為機(jī)器名,但是不用也可以。如果用戶沒有給出$welcome,則自動(dòng)查找本地的機(jī)器名。

顯示調(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 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 }
--------------------------------------------------------------------------------
  這個(gè)函數(shù)用來顯示調(diào)試信息?梢栽$inout中指定是上傳的指令還是返回的響應(yīng),如果為上傳指令,則使用"out";如果為返回的響應(yīng)則使用"in"。

第3行,判斷是否要輸出調(diào)試信息。
第5行,判斷是否為響應(yīng)信息,如果是,則在第7行將信息的前面加上"<< "來區(qū)別信息;否則在第10行加上">> "來區(qū)別上傳指令。
第11-12行,判斷信息串最后是否為換行符,如不是則加上HTML換行標(biāo)記。第13行將所以的換行符轉(zhuǎn)成HTML的換行標(biāo)記。
第14行,輸出整條信息,同時(shí)將信息顏色置為灰色以示區(qū)別。執(zhí)行一個(gè)命令

--------------------------------------------------------------------------------
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處理部分發(fā)現(xiàn),一些命令的處理很相似,如HELO,MAIL FROM,RCPT TO,QUIT,DATA命令,都要求根據(jù)是否顯示調(diào)試信息將相關(guān)內(nèi)容顯示出來,同時(shí)對(duì)于返回的響應(yīng)碼,如果是期望的,則應(yīng)繼續(xù)處理,如果不是期望的,則應(yīng)中斷出理。所以為了清晰與簡(jiǎn)化,專門對(duì)這些命令的處理編寫了一個(gè)通用處理函數(shù)。函數(shù)的參數(shù)中$code為期望的響應(yīng)碼,如果響應(yīng)碼與之相同則表示處理成功,否則出錯(cuò)。

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

  這樣,這個(gè)函數(shù)一方面完成指令及信息的發(fā)送顯示功能,別一方面對(duì)返回的響應(yīng)判斷是否成功。