梅芳-網(wǎng)絡(luò)編程實用教程-第9章_第1頁
梅芳-網(wǎng)絡(luò)編程實用教程-第9章_第2頁
梅芳-網(wǎng)絡(luò)編程實用教程-第9章_第3頁
梅芳-網(wǎng)絡(luò)編程實用教程-第9章_第4頁
梅芳-網(wǎng)絡(luò)編程實用教程-第9章_第5頁
已閱讀5頁,還剩65頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第9章 電子郵件協(xié)議與編程 本章首先介紹電子郵件系統(tǒng)的構(gòu)成和工作原理,然后分析簡單郵件傳送協(xié)議SMTP,接著敘述RFC822規(guī)定的純文本電子郵件信件的格式,詳細(xì)說明了MIME多媒體郵件格式擴展,分析了接收電子郵件的POP3郵局協(xié)議,最后給出了兩個編程實例。通過本章的學(xué)習(xí),應(yīng)當(dāng)充分認(rèn)識應(yīng)用層協(xié)議在網(wǎng)絡(luò)編程中的重要性,可以說,網(wǎng)絡(luò)編程就是應(yīng)用層協(xié)議的實現(xiàn)。,9.1 電子郵件系統(tǒng)的工作原理 9.1.1 電子郵件的特點 電子郵件(electronic mail,簡稱e-mail)是因特網(wǎng)上使用最多的一種應(yīng)用,它為用戶在因特網(wǎng)上設(shè)立了存放郵件的電子郵箱,發(fā)信人可以隨時將電子郵件發(fā)送到收信人的電子郵箱,收

2、信人也可以隨時上網(wǎng)讀取,發(fā)信人與收信人以異步的方式通信。,9.1.2 電子郵件系統(tǒng)的構(gòu)成 一個電子郵件系統(tǒng)包括三個主要的構(gòu)件,即用戶代理,郵件消息傳輸代理,和電子郵件使用的協(xié)議。如圖9.1所示:,圖9.1 電子郵件系統(tǒng)的構(gòu)成,9.1.3 電子郵件系統(tǒng)的實現(xiàn),圖9.2 電子郵件的發(fā)送與接收過程,從以上的分析可以了解電子郵件系統(tǒng)的特點: 是一種異步的通信系統(tǒng),不像電話,通話的雙方都必須在場。 使用方便,傳輸迅速,費用低廉,不僅能傳輸文字信息,還能附上聲音和圖像。 在電子郵件系統(tǒng)的實現(xiàn)中,ISP的服務(wù)器必須7X24小時地不間斷地運行,這樣才能保證用戶可以隨時發(fā)送和接收信件,而發(fā)送或接收電子郵件的用戶

3、則隨意。,9.2 簡單郵件傳送協(xié)議SMTP 9.2.1 概述 簡單郵件傳送協(xié)議SMTP(Simple Mail Transfer Protocol)是因特網(wǎng)的正式標(biāo)準(zhǔn),最初在1982年由RFC821規(guī)定,目前它的最高版本是RFC2821。 SMTP協(xié)議采用C/S模式,專用于電子郵件的發(fā)送,規(guī)定了發(fā)信人把郵件發(fā)送到收信人的電子郵箱的全過程中,SMTP客戶與SMTP服務(wù)器這兩個相互通信的進程之間應(yīng)如何交換信息。即規(guī)定了SMTP的會話過程。用戶直接使用的是用于編寫和發(fā)送的客戶端軟件,而通常的SMTP服務(wù)器運行在遠程站點上。客戶/服務(wù)器之間的通信是通過TCP/IP協(xié)議進行的。,9.2.2 SMTP客戶

4、與SMTP服務(wù)器之間的會話 1SMTP會話 如圖9.3,說明了SMTP客戶與SMTP服務(wù)器之間的會話,圖9.3 SMTP客戶與SMTP服務(wù)器之間的會話,2SMTP命令 一般是客戶主動,首先發(fā)送。SMTP客戶發(fā)往SMTP服務(wù)器的信息稱為SMTP命令。在RFC821中,SMTP協(xié)議規(guī)定了14種命令。 SMTP命令的一般的格式是: 命令關(guān)鍵字 參數(shù) 其中,命令關(guān)鍵字一般是四個字母,是一個英文動詞的縮寫。參數(shù)隨命令而異,命令應(yīng)當(dāng)以回車換行符結(jié)束。 比如 HELO WANG ,3SMTP應(yīng)答 SMTP服務(wù)器收到命令后,返回給SMTP客戶的信息,稱為SMTP應(yīng)答??蛻裘看伟l(fā)送一條SMTP命令后,服務(wù)器給客

5、戶返回一條響應(yīng)。SMTP規(guī)定了23種響應(yīng)碼。 SMTP應(yīng)答都是以一個響應(yīng)碼開頭,后面接著響應(yīng)的描述信息,如果SMTP服務(wù)器不一樣,響應(yīng)的描述信息可能不一樣,SMTP應(yīng)答的一般格式是: 響應(yīng)碼 響應(yīng)的文本描述信息 其中,響應(yīng)碼為3位數(shù)字,與描述信息文本之間有一個空格,,9.2.3 常用的SMTP命令 1SMTP客戶問候SMTP服務(wù)器 命令格式:HELO 發(fā)送方的主機名 2郵件來自何處,說明發(fā)信人的電子郵件地址 命令格式:MAIL FROM:發(fā)信人的電子郵件地址 3說明收信人的電子郵件地址 命令格式:RCPT TO:收信人的電子郵箱地址 4請求發(fā)送郵件內(nèi)容 命令格式:DATA ,5空操作 命令格式

6、:NOOP 6驗證電子信箱是否合法 命令格式:VRFY 電子信箱地址 7復(fù)位SMTP服務(wù)器 命令格式:RSET 8請求服務(wù)器發(fā)回幫助信息 命令格式:HELP 或者 HELP 命令關(guān)鍵字 9退出會話 命令格式:QUIT ,9.2.4 常用的SMTP響應(yīng)碼 211 系統(tǒng)狀態(tài)或系統(tǒng)幫助應(yīng)答。 214 幫助信息 220 服務(wù)就緒。 221 服務(wù)器關(guān)閉傳輸通道。 250 請求的郵件操作已經(jīng)完成。 251 用戶不是本地的,將按照前向路徑(forwaed-path)轉(zhuǎn)發(fā)。 354 啟動郵件輸入,要求郵件文本要用兩個結(jié)束。 421 服務(wù)不可使用,關(guān)閉傳輸通道。 450 沒有執(zhí)行請求的郵箱操作,因為信箱不可用。

7、,451 請求的操作已經(jīng)終止,因為在處理的過程中出現(xiàn)了錯誤。 452 請求的操作沒有發(fā)生,因為系統(tǒng)的存儲空間不夠, 500 語法錯誤,命令不可識別。 501 參數(shù)或變元中存在著語法錯誤。 502 命令不能實現(xiàn)。 503 錯誤的命令序列 504 命令的參數(shù)不能實現(xiàn)。 550 請求的操作不能發(fā)生,信箱不可用。 551 用戶不在本地,請嘗試發(fā)送到前向路徑(forwaed-path)。 552 請求的郵件操作終止,超出存儲分配。 553 請求的操作不能執(zhí)行,因為信箱語法錯誤。 554 事務(wù)失敗。,9.2.5 SMTP的會話過程 SMTP客戶與SMTP服務(wù)器的會話過程分為三個階段,先舉例說明。以下每行前

8、面的C代表SMTP客戶發(fā)送的命令,S代表服務(wù)器發(fā)回的響應(yīng)。每行/后面的內(nèi)容是注釋。 C:HELO YE /你好!我是YE。 S:250 YE HELLO ,nice to meet you /你好!YE,很高興見到你,有事嗎? C:MAIL FROM:YE163.COM /我想發(fā)信,我的地址是YE163.COM。 S:250 ,Sender, accepted /行!有信你就發(fā)吧。,/我的信要發(fā)給ZHANG。 C:RCPT ZHANG /行!已經(jīng)準(zhǔn)備好。 S:250 , Recipient ok C:DATA /我要發(fā)信件的內(nèi)容了。 /發(fā)吧!結(jié)尾標(biāo)志是兩個回車換行符夾個英文句點。 S:354

9、Enter mail, end with . C:(客戶端按照電子郵件的格式發(fā)送郵件內(nèi)容) /我的信已經(jīng)發(fā)完了 C:(郵件內(nèi)容發(fā)送完畢,發(fā)送結(jié)束標(biāo)志crlf Charset = “gb2312” 此字段說明特定的MIME實體中所包含數(shù)據(jù)的類型,類型不同,郵件體的內(nèi)部結(jié)構(gòu)也隨之不同。它也說明了郵件的性質(zhì),是MIME中的主要字段,在9.4.3節(jié)中詳述。,5內(nèi)容傳送編碼方式信頭字段 格式:Content-Transfer-Encoding: 編碼方式標(biāo)識符 指定在傳送郵件時,如何對郵件的主體進行編碼。在9.4.4節(jié)中詳述。,9.4.3 MIME郵件的內(nèi)容類型 1概述 Content-Type是MIM

10、E對RFC822擴展的最主要的信頭字段,用于指定MIME郵件內(nèi)容的類型,包含豐富的信息。Content-Type信頭字段的目的是充分地描述包含在信體中的數(shù)據(jù),使得接收用戶代理能夠選擇適當(dāng)?shù)拇砘驒C制來將這些數(shù)據(jù)呈現(xiàn)給用戶,或者,用正確的方法處理這些數(shù)據(jù)。這個字段的值叫做媒體類型(media type)。本節(jié)對這個字段進行詳細(xì)的說明。它的一般格式是: Content-Type:郵件內(nèi)容媒體主類型名/子類型名;參數(shù)列表 ,這個字段由三部分組成, 第一部分是關(guān)鍵字 第二部分是郵件內(nèi)容媒體主類型名(media type identifiers)和子類型名(subtype identifiers),說明

11、郵件內(nèi)容的媒體類型 第三部分,是一個以分號隔開的參數(shù)列表,格式是: ;參數(shù)名 = 參數(shù)值;參數(shù)名 = 參數(shù)值;. 例如,Content-Type:text/HTML;charset = “GB2312” 在RFC2046中定義了7個基本的內(nèi)容主類型(top-level media types),每一種都有一個或多個子類型,共計15個子類型,表9.1列出了它們的標(biāo)識符,,表9.1 RFC2046中定義的郵件內(nèi)容類型和子類型,2Text媒體類型 3image媒體類型 4Audio媒體類型 5Video媒體類型 6Application媒體類型 7Message媒體類型 8Message/exter

12、nal-body媒體類型的參數(shù)及使用 9Multipart媒體類型,9.4.4 MIME郵件的編碼方式 1MIME編碼概述 (1)7bit編碼方式 Content-Transfer-Encoding: 7bit (2)8bit編碼方式 Content-Transfer-Encoding: 8bit (3)binary編碼方式 Content-Transfer-Encoding: binary (4)Base64編碼方式 (5)Quoted-printable編碼方式,2BASE64編碼算法 在進行Base64的編碼時,首先要將被編碼的數(shù)據(jù)看成一個字節(jié)序列,不分行。然后按照以下三個步驟反復(fù)進行編

13、碼。 第一步:順次從要編碼的字節(jié)序列數(shù)據(jù)中,取出3個字節(jié),作為一組,該組包含24bit。 第二步:將一組的24個bit,再順次分為四個6bit的小組。并在每小組的前面補兩個零,形成四個字節(jié)。顯然這4個字節(jié)的值都在0-63范圍內(nèi)。 第三步:根據(jù)小組的每個字節(jié)的數(shù)值,按照表9.2的對應(yīng)關(guān)系,將它們分別轉(zhuǎn)換為對應(yīng)的可打印ASCII字符。 順次對要編碼的數(shù)據(jù)字節(jié)序列,重復(fù)進行以上處理,直到所有的數(shù)據(jù)編碼完成為止。,表9.2 Base64編碼,此外,編碼過程中還需要注意兩點: (1)如何將編碼后的文本行控制在76個字符以內(nèi)? 按照RFC822的要求,應(yīng)當(dāng)將編碼后的文本行控制在76個字符以內(nèi)。這只需要在編

14、碼后的字符序列中,每76個字符插入一組CRLF(回車換行),然后就可以發(fā)送,在接受端譯碼時,應(yīng)首先將碰到的CRLF符刪除,再按照Base64的方法譯碼。在原來要編碼的數(shù)據(jù)中可能有CR(0A)和LF(0D)字符,但它們經(jīng)過編碼后,變成了“K”和“N”,不會與后來插入的CRLF字符相混。,(2)編碼時最后一組不滿三個字節(jié)怎么辦? Base64編碼時,按照三個字節(jié)一組進行,最后一組就有可能剩下1個或2個字節(jié)。編碼時,一方面對有效的數(shù)據(jù)要進行編碼,另一方面要讓接收端能判斷出最后一組剩下的有效數(shù)據(jù)究竟有幾個字節(jié)。方法是:首先補充全零的填充字節(jié),將最后一組補夠3個字節(jié),然后按照上述方法進行編碼,在第三步映

15、射成字符后,要將編碼后的末尾一個或兩個字節(jié)替換為“=”字符。,如果最后一組只剩一個數(shù)據(jù)字節(jié),那么產(chǎn)生的4個編碼數(shù)據(jù)中,只有前兩個帶有剩余數(shù)據(jù)字節(jié)的位,就應(yīng)將4個編碼數(shù)據(jù)的后兩個字節(jié)都替換成等號。如果最后一組剩下兩個字節(jié),那么產(chǎn)生的4個編碼數(shù)據(jù)中,前三個帶有剩余數(shù)據(jù)字節(jié)的位,這時就將4個編碼數(shù)據(jù)的最后一個字節(jié)替換成等號。注意到,等號并不包含在上面的轉(zhuǎn)換表中,接收端根據(jù)等號的數(shù)目,就可以判知最后一組中有效的字節(jié)數(shù),從而正確地譯碼。,3Quoted-printable編碼算法 這種編碼稱為可打印的引用編碼(Quoted-printable encoding),被編碼的數(shù)據(jù)以8BIT的字節(jié)為單位,這種

16、編碼方法的要點就是對于所有可打印的ASCII碼,除了特殊符號“=”以外,都不改變。編碼算法的要點是: (1)如果被編碼數(shù)據(jù)字節(jié)的值在33到60之間(字符!至字符至字符),這部分字符是可打印的,則該數(shù)據(jù)字節(jié)編碼為7bit的對應(yīng)ASCII字符,實際就是將最高位去掉。,(2)其他的數(shù)據(jù),包括“=”字符,空格,ASCII碼在0-32的不可打印字符,以及非ASCII碼的數(shù)據(jù),都必須進行編碼。被編碼的數(shù)據(jù)以8bit的字節(jié)為單位,先將每個字節(jié)的二進制代碼用兩個16進制數(shù)字表示,然后在前面加上一個等號“=”,就是該字節(jié)的編碼。例如,字節(jié)值12被編碼為 “=0C”,字節(jié)值61被編碼為 “=3D”。再比如,漢字“

17、系統(tǒng)”的二進制代碼是:11001111 10110101 11001101 10110011,其16進制數(shù)字表示為:CFB5CDB3,相應(yīng)的Quoted-printable編碼表示為:=CF=B5=CD=B3。等號的二進制代碼是00111101,它的Quoted-printable編碼是=3D?;剀嚪痪幋a為=0D,換行符被編碼為=0A。要注意,16進制數(shù)據(jù)的表示用字母表 “0 1 2 3 4 5 6 7 8 9 A B C D E F”,即必須用大寫字母。,(3)如果要將編碼后的數(shù)據(jù)分割成76字符的行,可以在分割處插入等號“=”和CRLF。此等號也要計算在76個字符中。例如, ABCDEFG

18、HEJKLMNOPQRSTUVWXYZ 經(jīng)過編碼后將此行變成較短的形式: ABCDEFG= HEJKLMNOPQRSTUV= WXYZ 容易看出,接收端只要將插入的分割字符刪掉,就很容易將它們恢復(fù)成原來的樣子。,9.5 POP3與接收電子郵件 9.5.1 POP3協(xié)議 用來接收電子郵件的POP郵局協(xié)議最初是在1984年發(fā)表的RFC918中定義的,1985年的RFC937發(fā)表了它的第二個版本。隨著POP協(xié)議的廣泛使用,1988年的RFC1081又發(fā)表了它的第三版本,簡稱POP3,這個版本又在RFC1225,RFC1460,RFC1725,RFC1939中幾經(jīng)修訂,其中RFC1939是當(dāng)前的POP

19、3標(biāo)準(zhǔn)。,9.5.2 POP3的會話過程,圖9.5 POP3會話,POP也使用客戶/服務(wù)器工作模式,在接收郵件的用戶的PC機中,運行POP客戶程序,在用戶所連接的ISP的郵件服務(wù)器中,運行POP服務(wù)程序,二者之間按照POP協(xié)議相互發(fā)送信息,POP客戶發(fā)送給POP服務(wù)器的消息稱為POP命令,POP服務(wù)器返回的消息稱為POP響應(yīng)。交互的過程稱為POP會話。例如: (Connect to the POP3 Server .) /首先連接到POP3服務(wù)器 S: +OK POP3 server ready /服務(wù)器已經(jīng)準(zhǔn)備好 C: USER Wang /用戶名是Wang,S: +OK C: PASS v

20、egetables /口令是vegetables S: +OK login successful /客戶登錄成功了 C: LIST /請列出信箱中的信件清單 S: 1 AAAA /第一封信 S: 2 BBBB /第二封信 S: 3 CCCC /第三封信 C: RETR 1 /取回第一封信 S: +OK (send message 1) /好,(發(fā)送第一封信),C: DELE 1 /刪除第一封信 S: +OK /好的 C: RETR 2 S: +OK (send message 2) C: DELE 2 S: +OK C: QUIT /結(jié)束會話,再見 S: +OK POP3 server dis

21、connecting /好,POP3服務(wù)器斷開連接,在上面的對話過程中,C:后面是接收郵件的客戶端軟件發(fā)送的命令,S:后面是POP服務(wù)器的應(yīng)答,/后面是注釋。 從這個例子中可以看出POP會話的特點: 會話采用交互的請求應(yīng)答模式,會話過程通過相互發(fā)送文本來完成。 客戶發(fā)送的文本命令也采用命令字 參數(shù)的形式。 服務(wù)器對于客戶的命令總是返回一定的響應(yīng)碼,表示客戶端的請求是否被正確處理。 會話過程所發(fā)送的命令有一定的順序,9.5.3 POP3會話的三個狀態(tài) POP3會話一共有3個狀態(tài):驗證狀態(tài),事務(wù)狀態(tài)和更新狀態(tài)。每個狀態(tài)都是會話過程中的特定階段。 當(dāng)連接服務(wù)器后,POP3會話首先進入驗證狀態(tài),在這個階段里,可以使用USER Pass Quit這三個POP3命令,客戶段送交用戶名和口令,服務(wù)器驗證是否合法。,通過服務(wù)器驗證后,服務(wù)器鎖定該用戶的信箱,從而防止多個POP客戶端同時對此郵箱進行郵件操作,比如刪除,取信等。但是可以讓新的郵件加入。這時會話過程轉(zhuǎn)變?yōu)槭聞?wù)狀態(tài),在事務(wù)狀態(tài)客戶端可用的POP3命令有

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論