亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 用socket發送電子郵件.txt

?? 學習(編程技巧_編程知識_程序代碼),是學習編程不可多得的學習精驗
?? TXT
字號:
用Socket發送電子郵件
 

--------------------------------------------------------------------------------
 
第八軍團 時間:2004-1-17 21:29:05 
   
在作者所申請的幾個PHP 主頁空間中,能夠提供mail功能的實在不多,總是調用完mail()函數之后就毫無下文了。但是電子郵件在網上生活中的作用越來越大。想一想網蟲上網不收郵件能叫真正的網蟲嗎?郵件的作用我不想再說了,但是如果主頁空間不支持mail()發送那么怎么辦呢?我也想過通過socket來實現郵件發送,但無奈對用php 進行socket編程不熟悉,再加上發送郵件要用到SMTP協議,又要讀不少的英文了,所以一直也沒有去研究過。終于有一天我發現了一篇文章,關于用socket編程發送郵件。我如獲至寶般將其拷貝下來,并且將其改造成了一個php 可用的類,供大家使用。原來的文章只是一個簡單的例子,而且還有一些錯誤,在我經過多次的實驗、改造終于將其改成了一個直接使用socket,向指定的郵箱發送郵件的類,如果大家和前面關于發送MIME的文章結合起來,就可以實現在不支持mail()函數的網站上發送郵件了。因為發送郵件的過程需要時間,可能與mail()的處理機制還不完全一樣,所以速度要慢一些,但是可以解決需要發送郵件功能的燃眉之急,同時你也可以學習用php 進行socket編程。下面就將這個類的實現原理介紹給大家,同時向大家講解一些關于SMTP的基本知識。 

Socket編程介紹

  向大家申明,本人不是一個TCP/IP編程專家,故在此只是講出了我的一點理解和體會。 

  使用fsockopen函數打開一個Internet連接,函數語法格式: 

int fsockopen(string hostname, int port, int [errno], string [errstr], int [timeout]); 

  參數的意思我想不用講了,這里由于要使用SMTP協議,所以端口號為25。在打開連接成功后,會返回一個socket句柄,使用它就可以象使用文件句柄一樣的??墒褂玫牟僮饔衒puts(),fgets(),feof(),fclose()等。 

  很簡單地介紹就到這里吧。 
SMTP的基礎
  基于TCP/IP的因特網協議一般的命令格式都是通過請求/ 應答方式實現的,采用的都是文本信息,所以處理起來要容易一些。SMTP是簡單郵件傳輸協議的簡稱,它可以實現客戶端向服務器發送郵件的功能。所以下面所講的命令是指客戶端向服務器發出請求指令,而響應則是指服務器返回給客戶端的信息。 

  SMTP分為命令頭和信息體兩部分。命令頭主要完成客戶端與服務器的連接,驗證等。整個過程由多條命令組成。每個命令發到服務器后,由服務器給出響應信息,一般為3 位數字的響應碼和響應文本。不同的服務器返回的響應碼是遵守協議的,但是響應正文本則不必。每個命令及響應的最后都有一個回車符,這樣使用fputs()和fgets()就可以進行命令與響應的處理了。SMTP的命令及響應信息都是單行的。信息體則是郵件的正文部分,最后的結束行應以單獨的"."作為結束行。 

  客戶端一些常用的SMTP指令為: 

HELO hostname: 與服務器打招呼并告知客戶端使用的機器名字,可以隨便填寫 
MAIL FROM: sender_id : 告訴服務器發信人的地址 
RCPT TO: receiver_id : 告訴服務器收信人的地址 
DATA : 下面開始傳輸信件內容,且最后要以只含有.的特殊行結束 
RESET: 取消剛才的指令,從新開始 
VERIFY userid: 校驗帳號是否存在(此指令為可選指令,服務器可能不支持) 
QUIT : 退出連接,結束 
  服務器返回的響應信息為(格式為:響應碼+空格+解釋): 

220 服務就緒(在socket連接成功時,會返回此信息) 
221 正在處理 
250 請求郵件動作正確,完成(HELO,MAIL FROM,RCPT TO,QUIT指令執行成功會返回此信息) 
354 開始發送數據,結束以 .(DATA指令執行成功會返回此信息,客戶端應發送信息) 
500 語法錯誤,命令不能識別 
550 命令不能執行,郵箱無效 
552 中斷處理:用戶超出文件空間   下面給出一個簡單的命令頭(這是在打開socket之后做的),是我向stmp.263.net發郵件的測試結果: 

HELO limodou 
250 smtp.263.net 
MAIL FROM: chatme@263.net 
250 Ok 
RCPT TO: chatme@263.net 
250 Ok 
DATA 
354 End data with . 
To: chatme@263.net 
From: chatme@263.net 
Subject: test 
From: chatme@263.net 
test 
. 
QUIT 
250 Ok: queued as C46411C5097E0 

  這就是一些SMTP的簡單知識。相關內容可以查閱RFC。 

RFC 821定義了收/發電子郵件的相關指令。 
RFC 822則制定了郵件?容的格式。 
RFC 2045-2048制定了多媒體郵件?容的格式, 
RFC 1113, 1422-1424則是討論如何增進電子郵件的保密性。 
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-$#@62;smtp=$smtp; 
if(empty($welcome)) 
{ 
$this-$#@62;welcome=gethostbyaddr("localhost"); 
} 
else 
$this-$#@62;welcome=$welcome; 
$this-$#@62;debug=$debug; 
$this-$#@62;lastmessage=""; 
$this-$#@62;lastact=""; 
$this-$#@62;port="25"; 
} 

  這個構造函數主要完成一些初始值的判定及設置。$welcome用于HELO指令中,告訴服務器用戶的名字。 
  HELO指令要求為機器名,但是不用也可以。如果用戶沒有給出$welcome,則自動查找本地的機器名。 
顯示調試信息

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

第3行,判斷是否要輸出調試信息。 

第5行,判斷是否為響應信息,如果是,則在第7行將信息的前面加上"$#@60;$#@60; "來區別信息;否則在第10行加上 "$#@62;$#@62; "來區別上傳指令。 

第11-12行,判斷信息串最后是否為換行符,如不是則加上HTML換行標記。第13行將所以的換行符轉成HTML的換行標記。 

第14行,輸出整條信息,同時將信息顏色置為灰色以示區別。 執行一個命令 

1 function do_command($command, $code) 
2 { 
3 $this-$#@62;lastact=$command; 
4 $this-$#@62;show_debug($this-$#@62;lastact, "out"); 
5 fputs ( $this-$#@62;fp, $this-$#@62;lastact ); 
6 $this-$#@62;lastmessage = fgets ( $this-$#@62;fp, 512 ); 
7 $this-$#@62;show_debug($this-$#@62;lastmessage, "in"); 
8 if(!ereg("^$code", $this-$#@62;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)。 

  這樣,這個函數一方面完成指令及信息的發送顯示功能,別一方面對返回的響應判斷是否成功。 
b>郵件發送處理 
  下面是真正的秘密了,可要看仔細了。:) 
1 function send( $to,$from,$subject,$message) 
2 { 
3 //連接服務器 
4 $this-$#@62;lastact="connect"; 
5 $this-$#@62;show_debug("Connect to SMTP server : ".$this-$#@62;smtp, "out"); 
6 $this-$#@62;fp = fsockopen ( $this-$#@62;smtp, $this-$#@62;port ); 
7 if ( $this-$#@62;fp ) 
8 { 
9 set_socket_blocking( $this-$#@62;fp, true ); 
10 $this-$#@62;lastmessage=fgets($this-$#@62;fp,512); 
11 $this-$#@62;show_debug($this-$#@62;lastmessage, "in"); 
12 if (! ereg ( "^220", $this-$#@62;lastmessage ) ) 
13 { 
14 return false; 
15 } 
16 else 
17 { 
18 $this-$#@62;lastact="HELO " . $this-$#@62;welcome . "\n"; 
19 if(!$this-$#@62;do_command($this-$#@62;lastact, "250")) 
20 { 
21 fclose($this-$#@62;fp); 
22 return false; 
23 } 
24 $this-$#@62;lastact="MAIL FROM: $from" . "\n"; 
25 if(!$this-$#@62;do_command($this-$#@62;lastact, "250")) 
26 { 
27 fclose($this-$#@62;fp); 
28 return false; 
29 } 
30 $this-$#@62;lastact="RCPT TO: $to" . "\n"; 
31 if(!$this-$#@62;do_command($this-$#@62;lastact, "250")) 
32 { 
33 fclose($this-$#@62;fp); 
34 return false; 
35 } 
36 //發送正文 
37 $this-$#@62;lastact="DATA\n"; 
38 if(!$this-$#@62;do_command($this-$#@62;lastact, "354")) 
39 { 
40 fclose($this-$#@62;fp); 
41 return false; 
42 } 
43 //處理Subject頭 
44 $head="Subject: $subject\n"; 
45 if(!empty($subject) && !ereg($head, $message)) 
46 { 
47 $message = $head.$message; 
48 } 
49 //處理From頭 
50 $head="From: $from\n"; 
51 if(!empty($from) && !ereg($head, $message)) 
52 { 
53 $message = $head.$message; 
54 } 
55 //處理To頭 
56 $head="To: $to\n"; 
57 if(!empty($to) && !ereg($head, $message)) 
58 { 
59 $message = $head.$message; 
60 } < 61 //加上結束串 
62 if(!ereg("\n\.\n", $message)) 
63 $message .= "\n.\n"; 
64 $this-$#@62;show_debug($message, "out"); 
65 fputs($this-$#@62;fp, $message); 
66 
67 $this-$#@62;lastact="QUIT\n"; 
68 if(!$this-$#@62;do_command($this-$#@62;lastact, "250")) 
69 { 
70 fclose($this-$#@62;fp); 
71 return false; 
72 } 
73 } 
74 return true; 
75 } 
76 else 
77 { 
78 $this-$#@62;show_debug("Connect failed!", "in"); 
79 return false; 
80 } 
81 }
  有些意思很清楚的我就不說了。   
 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产三级国产普通话蜜臀 | 成人性生交大片免费看中文网站| 一区二区欧美精品| 国产精品网友自拍| 国产精品久久久一本精品| 国产嫩草影院久久久久| 欧美激情一区二区三区四区| 欧美国产禁国产网站cc| 综合欧美一区二区三区| 一区二区在线观看免费视频播放| 日韩理论在线观看| 一二三区精品视频| 亚洲自拍偷拍av| 午夜精品123| 免费美女久久99| 国产一区二区免费视频| 国产成人啪午夜精品网站男同| 国产一区二区精品在线观看| 国产麻豆成人传媒免费观看| 成人在线视频首页| 欧美日韩卡一卡二| 欧美成人三级在线| 国产精品伦理在线| 亚洲成av人综合在线观看| 美女网站在线免费欧美精品| 国产激情精品久久久第一区二区 | 国产精品一二三在| 91婷婷韩国欧美一区二区| 91免费国产在线| 欧美一区二区三区免费视频 | 不卡一区二区三区四区| 欧美色老头old∨ideo| 精品91自产拍在线观看一区| 中文字幕在线观看不卡| 亚洲成人激情自拍| 国产成人一级电影| 欧美在线观看视频一区二区 | 久久久五月婷婷| 亚洲靠逼com| 奇米一区二区三区av| 国产一区二区三区香蕉| 欧美影院午夜播放| 国产精品福利影院| 美女视频第一区二区三区免费观看网站 | 欧美日韩精品一二三区| 国产精品久久久久久久久免费相片| 午夜激情久久久| 91色在线porny| 26uuu亚洲综合色| 视频一区二区三区中文字幕| www.欧美色图| 久久先锋影音av鲁色资源| 午夜免费久久看| 色悠悠久久综合| 日本一区二区不卡视频| 久久精品国产一区二区三区免费看| 成人a级免费电影| 久久久久国产精品麻豆ai换脸 | 成人黄色网址在线观看| 日韩欧美在线综合网| 夜夜嗨av一区二区三区中文字幕 | 久久精品亚洲精品国产欧美 | 久久婷婷综合激情| 男男视频亚洲欧美| 欧美日韩一区 二区 三区 久久精品| 国产欧美日韩精品a在线观看| 图片区日韩欧美亚洲| 色偷偷久久一区二区三区| 国产色产综合色产在线视频| 麻豆成人久久精品二区三区小说| 在线免费观看视频一区| 专区另类欧美日韩| 成人一级黄色片| 国产三区在线成人av| 国产在线国偷精品免费看| 欧美成人高清电影在线| 美女mm1313爽爽久久久蜜臀| 日韩一区二区免费高清| 免费看黄色91| 久久综合五月天婷婷伊人| 美女国产一区二区三区| 精品乱码亚洲一区二区不卡| 国产综合久久久久久鬼色| 欧美精品一区二区精品网| 久久精工是国产品牌吗| 久久综合99re88久久爱| 国产成人免费视频网站高清观看视频| 日韩亚洲欧美在线观看| 日韩中文字幕区一区有砖一区 | 久久66热偷产精品| 精品国产乱码久久久久久闺蜜| 麻豆91免费看| 久久久久久久av麻豆果冻| 国产91精品精华液一区二区三区 | 日韩欧美美女一区二区三区| 老司机免费视频一区二区三区| 久久综合久色欧美综合狠狠| 国产成人av网站| 亚洲国产精品久久艾草纯爱| 91精品午夜视频| 国产69精品久久久久777| 成人免费在线播放视频| 欧美日韩国产一级片| 狠狠色丁香久久婷婷综合_中| 欧美国产国产综合| 欧美日韩一区不卡| 国产一二精品视频| 一区二区激情小说| 精品成人私密视频| 色94色欧美sute亚洲线路一ni| 日本欧洲一区二区| 中文字幕在线视频一区| 欧美一级艳片视频免费观看| 不卡的av电影| 蜜臀a∨国产成人精品| 中文字幕人成不卡一区| 欧美一区二区国产| 91丨国产丨九色丨pron| 韩日av一区二区| 一区二区三区产品免费精品久久75| 日韩一区二区三区电影在线观看 | 午夜精品123| 亚洲欧美日韩一区二区三区在线观看| 717成人午夜免费福利电影| 国产福利91精品一区二区三区| 一区二区在线观看视频| 久久精品日产第一区二区三区高清版| 在线免费观看不卡av| 成人av免费观看| 极品少妇一区二区| 日韩精品视频网| 亚洲伊人伊色伊影伊综合网| 欧美激情中文字幕一区二区| 日韩手机在线导航| 在线免费观看日本欧美| 99久久er热在这里只有精品66| 久久激情五月婷婷| 日韩一区精品视频| 午夜精品福利在线| 夜夜嗨av一区二区三区网页 | 精品一区二区成人精品| 丝袜诱惑制服诱惑色一区在线观看| 国产精品污网站| 久久久九九九九| 亚洲精品一线二线三线无人区| 欧美日韩一区二区三区不卡 | 精品国产乱码久久久久久图片| 欧美精品丝袜中出| 在线观看亚洲a| 色哟哟一区二区三区| 99国产精品久久久久久久久久久| 国产成人精品亚洲日本在线桃色 | 国产美女精品在线| 国产美女精品在线| 国产自产视频一区二区三区| 国产在线精品免费| 国产·精品毛片| 99国产一区二区三精品乱码| 国产精品99久久久久久有的能看| 久久精品久久综合| 国产成人在线色| 91免费小视频| 欧美综合亚洲图片综合区| 色综合色狠狠天天综合色| 在线观看免费成人| 欧美日韩国产精品成人| 欧美一级片在线观看| 精品伦理精品一区| 国产精品毛片a∨一区二区三区| 欧美激情自拍偷拍| 亚洲一区二区精品视频| 麻豆精品新av中文字幕| 国产一区二区免费视频| 91在线视频免费91| 欧美日韩高清在线| 亚洲精品一区二区三区香蕉| 国产精品乱人伦中文| 亚洲国产一区在线观看| 美女网站色91| 色婷婷亚洲一区二区三区| 欧美精品九九99久久| 精品91自产拍在线观看一区| 中文字幕视频一区| 青青草91视频| 97se亚洲国产综合自在线不卡| 欧美系列日韩一区| 久久先锋资源网| 亚洲精品视频一区| 精品午夜一区二区三区在线观看| 成人免费视频视频在线观看免费| 欧美色综合网站| 亚洲精品一区二区在线观看| 一区二区三区日韩精品| 韩国女主播一区| 在线观看日韩av先锋影音电影院| 精品福利一二区| 亚洲3atv精品一区二区三区| 国产成人免费视频一区| 在线成人av网站| 亚洲欧美另类图片小说|