




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
電子郵件系統(tǒng)工作原理電子郵件是因特網(wǎng)上最為流行的應(yīng)用之一,它主要包括如下組成局部:用戶代理、郵件效勞器簡(jiǎn)潔郵件傳輸協(xié)議(simpleMailTransferProtocolSMTP)郵件消息格式郵件訪問(wèn)協(xié)議。圖11.1展現(xiàn)了因特網(wǎng)電子郵件系統(tǒng)的概貌。在下文對(duì)電子郵件系統(tǒng)各組成局部的說(shuō)明中,以發(fā)信人A1ice給收信人Bob發(fā)送電子郵件消息作為例子。郵件效勞器
用戶代理
SMTP
用戶代理SMTP
郵件效勞器SMTP外出消息隊(duì)列用戶郵箱郵件效勞器用戶代理圖11.1 因特網(wǎng)電子郵件系統(tǒng)概貌用戶代理。Alice寫完Alice把這個(gè)消息放入外出消息隊(duì)列中并負(fù)責(zé)發(fā)送到Bob郵箱所在的郵件效勞器。當(dāng)Bob想閱讀電子郵2090年月后期,圖形用戶界面(GUI)當(dāng)前流行的用戶代Outlook、Foxmail等。郵件效勞器郵件效勞器構(gòu)成了電子郵件系統(tǒng)的核心。每個(gè)收信人都有一個(gè)位于某個(gè)郵件效勞器上的郵箱(mailbox)Bob信人的用戶代理開頭,經(jīng)發(fā)信人郵箱所在的郵件效勞器,中轉(zhuǎn)到收信人郵箱所在的郵件效勞器,然后投遞到收信人的郵箱中。當(dāng)Bob想查看自己的郵箱中的郵件消息時(shí),其郵箱所在的郵件效勞Alice郵箱所在郵件效勞器還必需處理Bob郵箱所在郵件效勞器出故障的狀況。假設(shè)Alice方的郵件效勞器無(wú)法把郵件消息馬上遞送到Bob方的郵件效勞器,A1ice方的效勞器就把它們存放在消息隊(duì)列(messagequeue)中,以后再嘗試遞送。這種嘗試通常每30分鐘左右執(zhí)行一次:要是過(guò)了假設(shè)干天仍未嘗試成功,該效勞器就把這個(gè)消息從消息隊(duì)列中刪除,同時(shí)以另一個(gè)郵件消息通知發(fā)信人(Alice)。SMTPSMTP是因特網(wǎng)電子郵件系統(tǒng)重要的應(yīng)用層協(xié)議TCP供給的牢靠的數(shù)據(jù)傳輸效勞把郵件消息從發(fā)信人郵箱所在郵件效勞器傳送到收信人郵箱所在郵件效勞器。SMTP是客戶-效勞器應(yīng)用模式,由發(fā)信人的郵件效勞器執(zhí)行的客戶端和收信人的郵件效勞器執(zhí)行的效勞器端組成。SMTP的客戶端和效勞器端同時(shí)運(yùn)行在每個(gè)郵件效勞器上送郵件消息時(shí),它是作為SMTP客戶端。當(dāng)一個(gè)郵件效勞器從其它郵件效勞器接收郵件消息時(shí),它是作為SMTP效勞器端。SMTPRFC821中,它的作用是把郵件消息從發(fā)信人的郵件效勞器傳送到收信人的郵件效勞器。SMTP7位ASCII字符格式。這個(gè)限制使得二進(jìn)制多媒體數(shù)據(jù)在由SMTP7ASCII文本;SMTP傳送完畢之后,再7位ASCII文本郵件消息解碼成二進(jìn)制數(shù)據(jù)。AliceBobASCII文本郵件消息的情形來(lái)說(shuō)明SMTP的根本操作:Alice調(diào)用自己的電子郵件用戶代理,給出Bob的電子郵件地址(例如bob@),寫好郵件內(nèi)容,然后讓用戶代理發(fā)送本郵件消息。Alice的用戶代理把該郵件消息發(fā)送到其郵件效勞器中息隊(duì)列中。運(yùn)行在A1ice的郵件效勞器上的SMTP個(gè)到運(yùn)行在Bob的郵件效勞器主機(jī)上的SMTP效勞器端的TCP連接。經(jīng)過(guò)最初的一些SMTP握手之后,SMTP客戶把A1ice的郵件消息發(fā)送到TCP連接上。Bob的郵件效勞器主機(jī)上,SMTP效勞器收到這個(gè)郵件消息后,把這個(gè)消息投遞到Bob的郵箱中。Bob在便利的時(shí)候調(diào)用自己的電子郵件用戶代理閱讀該郵件消息11.2展現(xiàn)了上述情形。SMTPSMTP因特網(wǎng)Alice的郵件效勞器 Bob的郵件效勞器圖11.2 A1ice的郵件效勞器把郵件消息傳送到Bob的郵件效勞器SMTPBob的郵件效勞器不工作了,那么A1ice發(fā)給Bob的郵件消息將存留在Alice的郵件效勞器中等待的嘗試,而不會(huì)存放到某個(gè)中間的郵件效勞器中。SMTP效勞器主機(jī)上的SMTP客戶,發(fā)起建立一個(gè)到運(yùn)行在接收端郵件效勞器主機(jī)上的SMTP效勞器端25之間的TCPSMTP客戶就等待一段時(shí)間后再嘗試SMTP手東西之前往往先自我介紹那樣,SMTPSMTP握手階段,SMTPSMTP使用傳輸層供給的牢靠數(shù)據(jù)傳輸效勞(TCP效勞)把該消息無(wú)過(guò)失地傳送到效勞器。假設(shè)客戶還有其它郵件消息需發(fā)送到同一個(gè)效勞器,它就在同一個(gè)TCP連接上重復(fù)上述過(guò)程;否則,它就指示TCP關(guān)閉該連接。sina。前面標(biāo)以“C:”的ASCII文本TCP套接字中的完整文本行,前面標(biāo)以“S:”的ASCII文本行是效勞器發(fā)送到它的TCP套接字中的完整文本行。一個(gè)客戶和效勞器交互的例子如下(TCP連接建立之后發(fā)生):S:220C:HELOsinaS:250Hellosina,pleasedtomeetyouC:MAILFROM:“mailto:alice@sina“<alice@sina>S:250SenderOKC:RCPTTO:“mailto:bob@“bob@S:250RecipientOKC:DATAS:354Entermail,endwith“.“onalinebyitsselfC:Doyoulikeketchup?C:Howaboutpickles?C:.S:250MessageacceptedfordeliveryC:QUITS:221closingconnection在這個(gè)例子中,客戶發(fā)送了一個(gè)從郵件效勞器主機(jī)sina的郵件消息,信體內(nèi)容為:“Doyoulikeketchup?Howaboutpickles?”5HELO命令標(biāo)識(shí)發(fā)信人自己的身份;MAILFROM命令表示懇求發(fā)送郵件,初始化郵件傳輸;RCPTTO命令標(biāo)識(shí)某電子郵件的打算接收人;DATA.完畢;QUIT命令表示退出郵件發(fā)送過(guò)程,完畢會(huì)話。(可選)構(gòu)成。SMTP使用長(zhǎng)久連接,假設(shè)發(fā)送郵件效勞器有多個(gè)郵件消息需發(fā)送到同一個(gè)接收郵件效勞器,那么全部這些消息可以在同一個(gè)TCP“HELOsina”命令開頭整個(gè)消息發(fā)送過(guò)程,但是QUIT命令要等到全部消息都發(fā)送完之后才發(fā)出。一旦SMTPAlice發(fā)給Bob的郵件消息從Alice的郵件效勞器傳送到BobBob的郵箱中。郵件消息格式當(dāng)Alice給Bob發(fā)一封一般的郵政信件時(shí),她把這封信裝入一個(gè)信封里,在信封上寫明Bob的地址和自己的回信地址,然后投入郵箱;郵政業(yè)務(wù)在遞送這封信的過(guò)程中,也會(huì)把說(shuō)明時(shí)間和地點(diǎn)的郵戳蓋在信封上。類似地,當(dāng)電子郵件消息從一個(gè)人傳送到另一個(gè)人時(shí),在信體之前會(huì)有RFC822中定義的郵件消息頭部及其值構(gòu)成。郵件消息中構(gòu)成信頭的各個(gè)頭部和信體之間以一個(gè)空行(CRLF)分割。RFC822具體說(shuō)明白各個(gè)郵件消息頭部的格式和含義。郵件消息的每個(gè)頭部都是直觀可讀的文本,由一個(gè)后跟冒號(hào)的關(guān)鍵From:頭部和To:Subject:頭部和其他頭部。這些頭部和前面爭(zhēng)論的SMTP命令不是一回事:SMTP命令是SMTP握手協(xié)議的一局部,郵件消息頭部則屬于郵件消息的一局部。下面是一個(gè)典型的電子郵件信頭:From:“mailto:alice@sina“alice@sinaTo:“mailto:bob@“bob@Subject:thisisaletter信頭之后空一行就是信體。SMTPRFC822ASCII字符形式,就是每個(gè)郵件消息的信體必需以“CRLF.CRLF”結(jié)尾,其中CRLF分別代表回車符和換行符。這種方式下,當(dāng)從同一個(gè)SMTP客戶接收一系列郵件消息時(shí),SMTP效勞器可以通過(guò)在字節(jié)流中搜尋“CRLF.CRLF”來(lái)分割每個(gè)消息。RFC822中說(shuō)明的郵件消息頭部盡管足以滿足發(fā)送一般ASCII文本郵件的要求,但是在多媒體消息(例如,包含圖像、音頻或視頻數(shù)據(jù)的消息)的描述和非ASCII文本格式(例如,非英語(yǔ)國(guó)家使用的文字)的承載上,卻明顯不夠,例如,假設(shè)信體是JPEG圖像的二進(jìn)制數(shù)據(jù),那么這些二進(jìn)制數(shù)據(jù)字節(jié)流中可能消滅“CRLF.CRLF”模式。這將導(dǎo)致SMTP效勞器誤認(rèn)為當(dāng)前郵件消息已完畢。為避開這樣的問(wèn)題,二進(jìn)制數(shù)據(jù)應(yīng)以某種方式編碼成ASCII文本,保證其中不存在特定的ASCII字符(包括點(diǎn)號(hào))ASCII部。RFC2045和RFC2046定義了這些額外的頭部,它們是針對(duì)RFC822的多用途因特網(wǎng)郵件擴(kuò)展(MultipurposeInternetMailExtensions,簡(jiǎn)稱MIME)。支持多媒體的兩個(gè)關(guān)鍵MIME頭部是Content-Type:Content-Tansfer-Encoding:Content-Type:頭部允許接收用戶代理對(duì)郵件消息實(shí)行適宜的行動(dòng)。例如,通過(guò)指出信體內(nèi)容為一個(gè)JPEG圖像,接收用戶代理可以把信件定向到某個(gè)JPEGSMTPASCII文本消息必需預(yù)先編碼成ASCII文本格式。Content-Tansfer-Encoding:頭部用于告知接收用戶代理信體已被編碼成ASCII格式,并指出具體編碼方式。這樣,當(dāng)某個(gè)用戶代理收到一個(gè)包含這兩個(gè)頭部的郵件消息時(shí),它首先使用Content-Tansfer-Encoding:ASCII文本形式,再使用Content-Type:頭部的值確定自己應(yīng)當(dāng)對(duì)信體實(shí)行什么行動(dòng)。假設(shè)Alice想給Bob發(fā)送一個(gè)JPEGBob的電子郵件地址和郵件消息的主題,并把這個(gè)JPEG圖像插入這個(gè)郵件消息的信體中(這個(gè)圖像有可能是作為該郵件消息的“附件”插入的,具體取決于Alice所用的用戶代理)。Alice填寫完郵件消息后讓用戶代理把它發(fā)送出去。Alice的用戶代理生成一個(gè)大體如下的MIME消息:From:“mailto:alice@sina“alice@sinaTo:“mailto:bob@“bob@Subject:pictureofmineMIME-Version:1.0Content-Transfer-Encoding:base64Content-Type:image/jpeg{...base64編碼數(shù)據(jù)......base64編碼數(shù)據(jù)...}Alice的用戶代理承受base64編碼格式對(duì)這個(gè)JPEG是在MIME中標(biāo)準(zhǔn)化的用于轉(zhuǎn)換成某種可承受的7位ASCII格式的編碼技術(shù)之一(定義在RFC2045中)。Base64承受了一種很簡(jiǎn)潔的編碼轉(zhuǎn)換:對(duì)于待編碼數(shù)據(jù),以36位數(shù)083×8=4×634個(gè)字節(jié)的輸出,長(zhǎng)度上增加了1/3。上面的處理還不能保證得到的字符都是可見字符,為了到達(dá)此目的,Base64制定了一個(gè)編碼表,進(jìn)展統(tǒng)一的轉(zhuǎn)換,見表11.126=64Base64名330進(jìn)展填充,相應(yīng)地,輸出字符則使用?=?占位,因此編碼后輸出的文本末尾可能會(huì)消滅12個(gè)?=?。表11.1 Base64編碼表值編碼值編碼值編碼值編碼值編碼值編碼值編碼值編碼0A8I16Q24Y32g40o48w5641B9J17R25Z33h41p49x5752C10K18S26a34i42q50y5863D11L19T27b35j43r51z5974E12M20U28c36k44s5206085F13N21V29d37l45t5316196G14O22W30e38m46u54262+7H15P23X31f39n47v55363/Bob閱讀郵件時(shí),其用戶代理所操作的是同一個(gè)MIME消息。該用戶代理看到值為base64的Content-Transfer-Encoding:image/jpeg的Content-Type:頭部,它告知Bob的用戶代理應(yīng)當(dāng)對(duì)信體進(jìn)展JPEG解壓縮。該郵件消息中的MIME-Version:頭部指示本消息所用的MIME版本。Content-Type頭部遵循MIME標(biāo)準(zhǔn)定義在RFC2046其格式為Content-Type:type/subtype;parameters。其中parameters(以及其前面的分號(hào))是可選的通過(guò)在Content-Type:頭部給出媒體類型(type)名和子類型(subtype)名來(lái)說(shuō)明MIME消息信體中數(shù)據(jù)的性質(zhì)。類型名和子類型名之后的其余局部是一組參數(shù)。類型名用于聲明數(shù)據(jù)的一般類型,子類型名用于指明這類數(shù)據(jù)中的某種具體格式。參數(shù)是對(duì)于類型的修飾說(shuō)明,取值取決于類型和子類型本身,不影響內(nèi)容性質(zhì)的指定MIME是依據(jù)可擴(kuò)展目標(biāo)認(rèn)真地設(shè)計(jì)的并預(yù)期媒體類型/子類型以及它們的相關(guān)參數(shù)會(huì)隨時(shí)間顯著增長(zhǎng)。為確保以有秩序的文檔完備公開的方式開發(fā)這些類型/子類型,MIME建立了一套注冊(cè)程式,把因特網(wǎng)安排數(shù)值權(quán)威(InternetAsignedNumbersAuthority, 簡(jiǎn)稱IANA)作為MIME各個(gè)可擴(kuò)展域的中心注冊(cè)處。RFC2048具體說(shuō)明白這些可擴(kuò)展域的注冊(cè)程式。每個(gè)MIME類型關(guān)聯(lián)一組子類型,其數(shù)量在逐年增長(zhǎng)。一些主要類型如下:text: text類型用于向接收者的用戶代理指出消息體為文本。該類型的一個(gè)普遍使用的類型/子類型對(duì)為text/plain。子類型plain指定不含任何格式定義信息的一般文本。plain文本不加任何解釋地依據(jù)原樣顯示,不需要特別的軟件,但要求支持給定的字符集。在實(shí)際的郵件消息中經(jīng)常能看到值對(duì)為text/plain;charset=gb2312或 text/plain;charset=“ISO-8859-1”的Content-Type:頭部,其中的參數(shù)指出用于產(chǎn)生相應(yīng)消息的字符集。另一個(gè)普遍使用的類/子類型對(duì)是text/html。子類型html指示接收用戶代理解釋嵌入在消息體中的html標(biāo)記,從而像Web頁(yè)面那樣顯示信件內(nèi)容,其中有可能包含各種字體的文本、超鏈接、Java小應(yīng)用程序等等。image:image類型用于向接收用戶代理指出消息體為圖像。該類型較為流行的兩個(gè)類型/子類型對(duì)為image/gifimage/jpegGIF圖像或JPEG圖像解碼并顯示。audio:audio類型需要音頻輸出設(shè)備(例如揚(yáng)聲器或)來(lái)表達(dá)內(nèi)容。這類型中常見的已標(biāo)準(zhǔn)化子類型包括basic(8u-law編碼)32kadpcm(RFC191132Kbps格式)。video: video類型的子類型包括mpeg和quicktime。application:application程序預(yù)先處理才能為用戶所見或所用的數(shù)據(jù)上。例如,當(dāng)用戶在某個(gè)電子郵件消息中附帶一個(gè)微軟wordapplication/msword;這將導(dǎo)致接收用戶代理啟動(dòng)微軟wordMIMEoctet-streamapplication/octet-stream的郵件消息后,接收用戶代理睬提示用戶是否把信體保存到硬盤中,以便稍后處理。MultiPart:MultiPartMIME個(gè)對(duì)象時(shí)例如多個(gè)圖像或ASCII文本與圖像共存,其Content-Type:頭部的值通常為multipart/mixed。這頭部向接收用戶代理指出本消息中含有多個(gè)對(duì)象。在多個(gè)對(duì)象共處同一個(gè)郵件消息中的狀況下,通過(guò)在每個(gè)對(duì)象之間放置邊界字符串,并在每個(gè)對(duì)象之前定義Content-Type:和Content-Transfer-Encoding(1(2每個(gè)非ASCII文本對(duì)象的傳送編碼方式;(3)每個(gè)對(duì)象的內(nèi)容類型。為便于理解multipart/mixedAliceBobASCIIJPEG圖像,再跟一些ASCII文本。Alice使用自己的用戶代理編輯文本并附上圖像后,該用戶代理生成一個(gè)如下的郵件消息:From:“mailto:alice@sina“alice@sinaTo:“mailto:bob@“bob@MIME-Version:1.0Content-type:multipart/mixed;Boundary=StartOfNextPart--StartOfNextPartDearbob,Pleaselookatthepicture--StartOfNextPartContent-Transfer-Encoding:base64Content-type:image/jpeg{...base64編碼的數(shù)據(jù)......base64編碼的數(shù)據(jù)...}--StartOfNextPartthereissomeacsiiletterhere從中可以看出,Content-type:頭部的Boundary參數(shù)用于指定分隔各個(gè)局部的邊界字符串。在郵件消息體中,該分隔字符串以兩個(gè)短劃線開頭,以CRLF結(jié)尾。一個(gè)電子郵件消息由多個(gè)部件構(gòu)成。信體是郵件消息的核心,它是發(fā)送者發(fā)送給接收者的真正數(shù)據(jù)。對(duì)于多局部郵件消息來(lái)說(shuō),其信體本身由多個(gè)局部組成,而每個(gè)局部又有一個(gè)或多個(gè)說(shuō)明其數(shù)據(jù)性質(zhì)的頭部。信體之前是一個(gè)空行和由多個(gè)郵件消息頭部組成的信頭。這些頭部既包括RFC822頭部,例如From:、To:和subject:,也包括MIME頭部,例如Content-type:和Content-Transfer-Encoding:SMTP接收效勞器插到每個(gè)郵件消息項(xiàng)端的Received:SMTP效勞器的主機(jī)名(“from”)SMTP效勞器的主機(jī)名(“by”):Received:fromsinaby;18Oct200709:53:37GMTFrom:“mailto:alice@sina“alice@sinaTo:“mailto:bob@“bob@MIME-Version:1.0Content-type:multipart/mixed;Boundary=StartOfNextPart--StartOfNextPartDearbob,Pleaselookatthepicture--StartOfNextPartContent-Transfer-Encoding:base64Content-type:image/jpeg{...base64編碼的數(shù)據(jù)......base64編碼的數(shù)據(jù)...}--StartOfNextPartthereissomeacsiiletterhere有時(shí)候,單個(gè)郵件消息會(huì)有多個(gè)Received:頭部,有的還會(huì)有一個(gè)較簡(jiǎn)單的Return-path:頭部。這是由于郵件消息在從發(fā)送者的主機(jī)到接收者的主機(jī)的傳送過(guò)程中,可能會(huì)被轉(zhuǎn)發(fā)到不止一個(gè)SMTP效勞器。例如,假設(shè)Bob指示他在主機(jī)上的郵件效勞器把他的全部郵件轉(zhuǎn)發(fā)到主機(jī)sohu,那么他通過(guò)其用戶代理看到的郵件消息可能以大體如下的兩行開頭:Received:frombysohu;18Oct200709:55:37GMTReceived:fromsinaby;18Oct200709:53:37GMT這些頭部給接收用戶代理供給了相應(yīng)郵件消息訪問(wèn)過(guò)的SMTP效勞器及訪問(wèn)時(shí)間的蹤跡。SMTP標(biāo)準(zhǔn)所在的RFC822具體定義丁Received:頭部的語(yǔ)法。郵件訪問(wèn)協(xié)議在前面的爭(zhēng)論中,都是假設(shè)Bob通過(guò)直接登錄到自己的郵件效勞器主機(jī)啟動(dòng)用戶代理來(lái)閱讀20世紀(jì)90年月早期,這仍舊是標(biāo)準(zhǔn)的做法。然而,當(dāng)今的用戶一般使用在本地PC機(jī)(Mac機(jī))上執(zhí)行的用戶代理來(lái)閱讀郵件,而不管是辦公室PC機(jī)、家庭PC機(jī)還是便攜機(jī)。用戶在本地PC機(jī)上執(zhí)行用戶代理可享受諸多好處,包括便利查看多媒體郵件消息和附件。郵件消息的接收者在本地PC機(jī)上執(zhí)行用戶代理時(shí),很自然的一個(gè)想法是在本地PC機(jī)上也運(yùn)行郵件效勞器,然而這種方法存在一個(gè)問(wèn)題。郵件效勞器是治理郵箱并運(yùn)行SMTP的客戶端和效勞器PCPC是不現(xiàn)實(shí)或不經(jīng)濟(jì)的做法。相反,用戶一般只在本地PC機(jī)上運(yùn)行一個(gè)用戶代理,由它遠(yuǎn)程訪問(wèn)存放在某臺(tái)共享的郵件效勞器主機(jī)上的郵箱,而該郵件效勞器主機(jī)總是連接在因特網(wǎng)上并為多個(gè)用戶所共享。該主機(jī)及其上的郵件效勞器—ISP(例如大學(xué)或公司)維護(hù)。用戶代理運(yùn)行在各個(gè)用戶的本地PCISP或機(jī)構(gòu)內(nèi)部網(wǎng)絡(luò)中的某臺(tái)效勞器主機(jī)上,用戶代理和郵件效勞器之間需要有一個(gè)相互通信的協(xié)議。先查看一下出自從Alice的PC機(jī)的某個(gè)郵件消息如何設(shè)法到達(dá)BobSMTP郵件效勞器。這個(gè)任務(wù)可簡(jiǎn)潔地由Alice的用戶代理使用SMTP直接與BobAlice的用戶代理發(fā)起建立一個(gè)到Bob郵箱所在的郵件效勞器的TCP連接,并通過(guò)該連接發(fā)出SMTP握手命令,再用DATA命令上傳郵件消息,最終關(guān)閉連接。這種方法盡管切實(shí)可行,卻很少被承受,由于它沒(méi)有給Alice的用戶代理供給任何資源來(lái)應(yīng)對(duì)目標(biāo)郵件效勞器臨時(shí)崩潰的狀況。Alice的用戶代理發(fā)起與自己郵箱所在的郵件效勞器的一個(gè)SMTP會(huì)話Alice方的郵件效勞器發(fā)起與Bob方的郵件效勞器的一次SMTP會(huì)話,把郵件消息中轉(zhuǎn)給Bob方的郵件效勞器。假設(shè)Bob方的郵件效勞器臨時(shí)不行用,Alice方的郵件效勞器就暫存該郵件消息,以后連續(xù)嘗試?,F(xiàn)在的問(wèn)題是像Bob這樣在本地PC機(jī)上運(yùn)行用戶代理的收信人該如何獵取已到達(dá)自己的郵件效勞器的郵件消息(該郵件效勞器運(yùn)行在Bob的ISP中的某臺(tái)主機(jī)上)通過(guò)引入用于從自己的郵件效勞器到本地PC機(jī)上的用戶代理傳送郵件消息的郵件訪問(wèn)協(xié)議可以解決這個(gè)問(wèn)題目前流行的郵件訪問(wèn)協(xié)議有兩個(gè):郵局協(xié)議版本3(PostOfficeProtocolVersion3,簡(jiǎn)稱POP3)和因特網(wǎng)郵件訪問(wèn)協(xié)議(InternetMailAccessProtocol, 簡(jiǎn)稱IMAP)。這兩個(gè)協(xié)議使用內(nèi)拉操作獵取郵件消息,而SMTP是一個(gè)外推協(xié)議。圖11.3匯總了因特網(wǎng)電子郵件系統(tǒng)中所用的協(xié)議:SMTP用于從發(fā)送者的郵件效勞器到接收者的郵件效勞器傳送郵件消息,也用于從發(fā)送者的用戶代理到發(fā)送者的郵件效勞器傳送郵件消息;POP3或IMAP用于從接收者的郵件效勞器到接收者的用戶代理傳送郵件消息。SMTPSMTPSMTP
IMAPPOP3
用戶代理
發(fā)送者的郵件效勞器 接收者的郵件效勞器圖11.3 電子郵件協(xié)議及它們的通信實(shí)體
用戶代理RFC1939中定義的POP3POP3開頭于用戶代理翻開一個(gè)到POP3110的TCPPOP3效勞器與郵件效勞器運(yùn)行在一樣的服務(wù)器主機(jī)上,前者從用戶的郵箱中讀取并可能刪除郵件消息,后者往用戶的郵箱中寫入郵件消息。TCP連接建立好之后,POP3依次經(jīng)受授權(quán)認(rèn)證、處理和更3個(gè)階段。在授權(quán)階段,用戶代理分別發(fā)出一個(gè)用戶名和一個(gè)口令以認(rèn)證下載郵件消息的用戶。在處理階段,用戶代理獵取郵件消息,并可以標(biāo)記待刪除的郵件消息或去掉這些標(biāo)記,獵取郵件統(tǒng)計(jì)信息。更階段發(fā)生在用戶代理發(fā)quitPOP3POP3效勞器刪除己加過(guò)刪除標(biāo)記的郵件消息。在POP3會(huì)話期間,用戶代理發(fā)出命令,POP3效勞器則對(duì)每個(gè)命令響應(yīng)以一個(gè)應(yīng)答??赡艿膽?yīng)答有兩個(gè):指出剛剛的命令執(zhí)行成功的+OK(有時(shí)后跟一個(gè)解釋性消息)和指出剛剛的命令執(zhí)行有誤的-ERR。授權(quán)階段:授權(quán)階段共有兩個(gè)根本命令:user<用戶名>和pass<口令>??梢允褂胻elnet工POP110POP3效勞器主機(jī),并發(fā)出這些命令來(lái)展現(xiàn)它們的用法。假設(shè)mailserver是郵件效勞器主機(jī)名,這個(gè)過(guò)程大致如下:telnetmailserver110+OKPOP3serverreadyuseralice+OKpasspassword+OKusersuccessfullyloggedon假設(shè)寫錯(cuò)了某個(gè)命令,POP3效勞器將返回一個(gè)-ERR應(yīng)答。處理階段:POP3的用戶代理可配置成“下載并刪除”或“下載并保存”兩種模式之一。POP3list、retr和dele命令。假設(shè)用戶的郵箱中已存有兩個(gè)郵件消息,其POP3處理階段大致如下(其中前面標(biāo)以“C:”的是用戶代理發(fā)出的命令,而標(biāo)以“S:”POP3效勞器返回的應(yīng)答):C:listS:1498S:2912S:.C:retr1S:(abcd......S:............S: )S:.C:dele1C:retr2S:(......S:...S: )S:.C:dele2C:quitS:+OKPOP3serversigningoff用戶代理首先要求POP3效勞器列出存放在自己的郵箱中的每個(gè)郵件消息的大小回并刪除每個(gè)郵件消息。授權(quán)階段完畢之后,用戶代理只能發(fā)出4個(gè)命令:list、retr、dele、quit。這些命令的具體語(yǔ)法定義在RFC1939中。quit命令后,POP312從相應(yīng)的郵箱中刪除。收信人可能期望從不止一臺(tái)主機(jī)訪問(wèn)自已的郵箱,如既能從辦公室PC機(jī)訪問(wèn),也能從家庭PC機(jī)訪問(wèn),還能從便攜機(jī)訪問(wèn)。下載并刪除模式不能滿足這種需求,例如,這種模式將導(dǎo)PC后就不能在便攜機(jī)上閱讀同一個(gè)郵件消息了。下載并保存模式則恰好相反,用戶代理把己從POP3效勞器下載的郵件消息連續(xù)保存在郵件效勞器中。在這種模式下,用戶可以在不同的時(shí)間從不同的主機(jī)訪問(wèn)同樣的郵件消息。在用戶代理和郵件效勞器之間的POP3會(huì)話期間,POP3效勞器維護(hù)肯定POP3效勞器不會(huì)跨會(huì)話保存狀態(tài)信息,例如,每次會(huì)話開頭之時(shí)沒(méi)有任何郵件消息被標(biāo)記成待刪除狀態(tài)。IMAP收信人使用POP3中,然后可以進(jìn)展刪除、跨郵件夾轉(zhuǎn)移、按發(fā)信人名字或消息主題搜尋郵件消息等操作。但是這種郵件夾和郵件消息都存放在本地機(jī)上,不能滿足游動(dòng)用戶的需求。游動(dòng)用戶更情愿在遠(yuǎn)程郵件效勞器主機(jī)上維護(hù)郵件夾,這樣從任何主機(jī)都可以訪問(wèn)它。RFC2060中定義的IMAP協(xié)議解決了上述問(wèn)題。IMAP允許用戶像對(duì)待本地郵箱那樣操縱遠(yuǎn)程郵箱,使得收信人能夠在自己的郵件效勞器主機(jī)中創(chuàng)立并維護(hù)多個(gè)存放郵件消息的郵件夾。用戶可以把郵件消息存入郵件夾,也可以從一個(gè)郵件夾到另一個(gè)郵件夾轉(zhuǎn)移郵件,還可以在這些遠(yuǎn)程郵件夾中搜尋匹配特定準(zhǔn)則的郵件消息。IMAP效勞器必需為每個(gè)用戶維護(hù)一個(gè)郵件夾層次構(gòu)造IMAP的實(shí)現(xiàn)比POP3IMAPIMAP效勞器為該用戶維護(hù)的狀態(tài)信息跨這些相繼的訪問(wèn)保持全都。POP3效勞器則相反,一旦用戶退出當(dāng)前的POP3會(huì)話,就不再為其維護(hù)狀態(tài)信息。IMAP頭,或者只獵取多局部MIME消息的某個(gè)局部。這個(gè)特征在用戶代理和郵件效勞器主機(jī)之間為低帶寬連接(例如無(wú)線連接或低速調(diào)制解調(diào)器撥號(hào)連接)時(shí)格外有用。通過(guò)低帶寬連接訪問(wèn)郵件時(shí),用戶很可能不期望下載自己的郵箱中的全部郵件消息,特別是可能含有音頻或視頻剪輯的長(zhǎng)消息。IMAPIMAP143的TCP連接;然后,效勞器返回初始問(wèn)候消息;接著,客戶與效勞器就可以交互了??蛻艉托谄鞯慕换ビ煽虸MAP效勞器在會(huì)話期間總是處于以下4(nonauthenticated)(authenticated)(selected)和注銷(1ogout)。未認(rèn)證狀態(tài)是連接剛建立時(shí)的初始狀態(tài),這種狀態(tài)下,用戶必需供給一個(gè)用戶名和口令對(duì)才能繼續(xù)下面的操作,即發(fā)出更多的命令。在已認(rèn)證狀態(tài)下,用戶必需選擇一個(gè)郵件夾才能發(fā)出作用于郵件(獵取、轉(zhuǎn)移、刪除、獵取多局部消息的某個(gè)局部等等)。最終的注銷狀態(tài)是會(huì)話?cǎi)R上終止時(shí)的狀態(tài)。郵件web掃瞄器,用戶與郵件效勞器主機(jī)上的郵箱之間的交互由協(xié)議完成。當(dāng)收信人(Bob)想要查看其郵箱中的郵件消息時(shí),這些消息通過(guò)協(xié)議(而不是POP3IMAP協(xié)議)從郵件效勞器主機(jī)傳送到他的掃瞄器(例如Alice)想要發(fā)送電子郵件消息時(shí),這些消息也是通過(guò)協(xié)議(而不是SMTP協(xié)議)從她的掃瞄器傳送到她郵箱所在的郵件效勞器主機(jī)的。但郵件消息在郵件效勞器主機(jī)之間的中轉(zhuǎn)仍舊通過(guò)SMTP協(xié)IMAPWeb的電子郵件給移動(dòng)用戶帶來(lái)了極大便利,但其主要缺乏之處在于速度比較慢,由于其效勞器主CGIHotmailYahoo!Mall,在將來(lái),它將有可能形成與POP3IMAP訪問(wèn)方法共存的局面。持續(xù)媒體電子郵件持續(xù)媒體(continuous-media,簡(jiǎn)稱CM)電子郵件是包含音頻或視頻數(shù)據(jù)的電子郵件系統(tǒng),它對(duì)于朋友之間和家庭成員之間的異步溝通很有吸引力。例如,學(xué)齡前兒童更情愿使用CM電子郵件給CMCM郵件消息的速度要比輸入文本消息的速度快很多(180個(gè)單詞,但是一般辦公室工作人員每分鐘只能輸入20-40個(gè)單詞)。CM電子郵件在某些方面類似語(yǔ)音留言,不過(guò)功能要強(qiáng)大得多。它不僅給用戶供給一個(gè)訪問(wèn)郵箱的圖形界面,而且允許用戶評(píng)注并回復(fù)CM者把CM郵件消息轉(zhuǎn)發(fā)給多個(gè)收信人。CMCM電子郵件消息比文本電子郵件消息大得多,對(duì)于端到端延遲有更嚴(yán)格的要求,對(duì)于收信人千差萬(wàn)別的因特網(wǎng)訪問(wèn)速率和本地存儲(chǔ)容量也更為敏感。當(dāng)前的電子郵件設(shè)施也存在一些阻礙CM電于郵件推廣的缺乏之處。首先,很多現(xiàn)有的郵件效勞器沒(méi)有存放大郵件消息的容量;它們一般拒絕接收或中轉(zhuǎn)CM郵件消息,因此不行能給依附它們的收信人發(fā)送這樣的消息。其次,收信人的用戶代理只在取得完整的郵件消息后才表達(dá)其內(nèi)容,對(duì)于CM電子郵件,這會(huì)導(dǎo)致網(wǎng)絡(luò)帶寬和本地主機(jī)存儲(chǔ)容量的過(guò)度鋪張。事實(shí)上,倉(cāng)儲(chǔ)的CM郵件消息往往不是完整地表達(dá)的,因此接收未作表達(dá)的數(shù)據(jù)明顯鋪張了網(wǎng)絡(luò)帶寬和本地存儲(chǔ)容量(例如,當(dāng)某人收到來(lái)自相當(dāng)嘮叨的同事的長(zhǎng)篇語(yǔ)音郵件消息后,可能只聽上前1520分鐘內(nèi)容的整個(gè)消息)。再次,當(dāng)前使用的郵件訪問(wèn)協(xié)議(POP3、IMAP、)不適合為收信人流播放CM郵件消息。這些郵件訪問(wèn)協(xié)議沒(méi)有供給這樣的功能:允許用戶暫停/恢復(fù)播放郵件消息內(nèi)容,或者在郵件消息內(nèi)重定位播放點(diǎn);另外,在TCP上實(shí)現(xiàn)流播放往往導(dǎo)致糟糕的接收效果。這些缺乏之處有望在將來(lái)的幾年內(nèi)得到解決。不過(guò)近來(lái)超大郵箱開頭流行起來(lái),如GMAIL等,郵箱容量的限制問(wèn)題正在得到解決。關(guān)鍵源代碼例如(1)郵件發(fā)送端源代碼packagemailoper;importjava.awt.GridBagLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.io.PrintStream;importjava.io.PrintWriter;import.InetAddress;import.Socket;importjava.util.Scanner;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;publicclassMailSender{privateJFrameframe;privateScannerin;privatePrintWriterout;privateJTextFieldfrom;privateJTextFieldto;privateJTextFieldsmtpServer;privateJTextAreamessage;privateJTextAreacomm;privateLoggerlogger;privatePrintWriterps;publicstaticfinalintDEFAULT_WHIDTH=300;publicstaticfinalintDEFAULT_HEIGHT=300;publicMailSender{try{ps=newPrintWriter(newFileOutputStream(“WebRoot\\ClientLog.txt“,true),true);}catch(FileNotFoundExceptione1){e1.printStackTrace;}logger=newLogger(ps);logger.log(“MailSender“,“Info“,“開頭記錄日志...“);}publicMailSender(booleanisFraem){this;initFrame;}publicvoidinitFrame{frame=newJFrame;frame.setSize(300,300);frame.setTitle(“郵件效勞器“);frame.setLayout(newGridBagLayout);frame.setLocation(200,200);frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.add(newJLabel(“From“),newGBC(0,0).setFill(GBC.HORIZONTAL));from=newJTextField(20);“mailto:shexu@163“from.setText(“shexu@163“);frame.add(from,newGBC(1,0).setFill(GBC.HORIZONTAL));frame.add(newJLabel(“To“),newGBC(0,1).setFill(GBC.HORIZONTAL));to=newJTextField(20);“mailto:liusumantian@shexu“to.setText(“l(fā)iusumantian@shexu“);frame.add(to,newGBC(1,1).setFill(GBC.HORIZONTAL).setWeight(100,0));frame.add(newJLabel(“SMTPserver:“),newGBC(0,2).setFill(GBC.HORIZONTAL));smtpServer=newJTextField(20);smtpServer.setText(“l(fā)ocalhost“);frame.add(smtpServer,newGBC(1,2).setFill(GBC.HORIZONTAL).setWeight(100,0));message=newJTextArea;message.setText(!“);frame.add(newJScrollPane(message),newGBC(0,3,2,1).setFill(GBC.BOTH).setWeight(100,100));comm=newJTextArea;frame.add(newJScrollPane(comm),newGBC(0,4,2,1).setFill(GBC.BOTH).setWeight(100,100));JPanelbuttonPanel=newJPanel;frame.add(buttonPanel,newGBC(0,5,2,1));JButtonsendButton=newJButton(“發(fā)送“);buttonPanel.add(sendButton);sendButton.addActionListener(newActionListener{publicvoidactionPerformed(ActionEvente){newThread(newRunnable{publicvoidrun{comm.setText(““);sendMail;}}).start;}});frame.validate;}publicvoidsendMail{Socketserver=null;try{server=newSocket(smtpServer.getText.trim,25);InputStreamins=server.getInputStream;OutputStreamouts=server.getOutputStream;in=newScanner(ins);out=newPrintWriter(outs);StringhostName=InetAddress.getLocalHost.getHostName;//發(fā)送郵件過(guò)程receive;send(“HELO“+hostName);receive;send(“MAILFROM:<“+from.getText.trim+“>“);receive;send(“RCPTTO:<“+to.getText.trim+“>“);receive;send(“DATA“);receive;send(message.getText);send(“.“);receive;send(“QUIT“);receive;}catch(IOExceptione){e.printStackTrace;comm.append(“Error:“+e.getMessage);}finally{try{if(server!=null){server.close;}}catch(IOExceptione){e.printStackTrace;}}}publicvoidsendMail(Stringto,Stringfrom,Stringmessage){Socketserver=null;try{server=newSocket(“l(fā)ocalhost“,25);InputStreamins=server.getInputStream;OutputStreamouts=server.getOutputStream;in=newScanner(ins);out=newPrintWriter(outs);StringhostName=InetAddress.getLocalHost.getHostName;//發(fā)送郵件過(guò)程receive;send(“HELO“+hostName);receive;send(“MAILFROM:<“+from+“>“);receive;send(“RCPTTO:<“+to+“>“);receive;send(“DATA“);receive;send(message);send(“.“);receive;send(“QUIT“);receive;}catch(IOExceptione){e.printStackTrace;// comm.append(“Error:“+e.getMessage);}finally{try{if(server!=null){server.close;}}catch(IOExceptione){e.printStackTrace;}}}/**向效勞端發(fā)送信息@paramstr*/privatevoidsend(Stringstr){logger.log(“MailSender“,“Info“,“發(fā)送信息:“+str);// comm.append(str);// comm.append(“\n“);out.print(str.replaceAll(“\n“,“\r\n“)+“\r\n“);// out.print(“\r\n“);out.flush;}/**從效勞端收到信息并顯示*/privatevoidreceive{if(in.hasNextLine){Stringline=in.nextLine;logger.log(“MailSender“,“Info“,“效勞器信息:“+line);// comm.append(line);// comm.append(“\n“);}}publicstaticvoidmain(String[]args){newMailSender(true);}}郵件接收端源代碼packagemailoper;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;import.ServerSocket;import.Socket;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Properties;/**收信端效勞器@authorshx**/publicclassMailReceiver{privateServerSocketserver;privateSocketsocket;privatePrintWriterpw;privateBufferedReaderreader;privateintcount;privateLoggerlogger;privatePrintWriterps;private PrintWriterout;privateSimpleDateFormatdf;privateDatedate;publicvoidreceiveMail{df=newSimpleDateFormat(“yyyyMMddhhmmss秒“);date=newDate;Stringstr=df.format(date);intcot=0;Propertiespr=null;try{FileInputStreamcount=newFileInputStream(“l(fā)etter\\count.data“);pr=newProperties;pr.load(count);Stringtemp=pr.getProperty(“count“);System.out.println(“Beforcot++:“+temp);cot=Integer.parseInt(temp)+1;StringfileName=“l(fā)etter\\letter“+cot+“.data“;ps=newPrintWriter(newFileOutputStream(“ServerLog.txt“,true),true);out=newPrintWriter(newFileOutputStream(fileName,true),true);}catch(FileNotFoundExceptione1){e1.printStackTrace;}catch(IOExceptione){e.printStackTrace;}logger=newLogger(ps);logger.log(“MailReceiver“,“Info“,“開頭記錄日志...“);try{server=newServerSocket(25);//寫日志文件logger.log(“MailReceiver“,“Info“,“效勞器啟動(dòng)等待連接 “);System.out.println(“效勞器啟動(dòng)等待連接 “);//啟動(dòng)效勞socket=server.accept;//寫日志文件out.println(“時(shí)間:“+str.substring(0,14)+“收到信件“);logger.log(“MailReceiver“,“Info“,“收到主機(jī)“+socket.getInetAddress+socket.getInetAddress.getHostName+“的連接懇求!“);System.out.println(“收到主機(jī)“+socket.getInetAddress+socket.getInetAddress.getHostName+“的連接懇求!“);pr.setProperty(“count“,newInteger(cot).toString);pr.store(newFileOutputStream(“l(fā)etter\\count.data“),“count“);pw=newPrintWriter(socket.getOutputStream);reader=newBufferedReader(newInputStreamReader(socket.getInputStream));send(“220smtp.shexuSMTPCSUSOFTMAIL(PostfixRules!)“+“\t\n“);receive;send(“250OKsmtp.shexu“+“\t\n“);receive;send(“250OKSender“+“\t\n“);receive;send(“250OKReceiver“+“\t\n“);receive;send(“354Startmailinput;endwith<CRLF>.<CRLF>“+“\t\n“);receiveData;//Date// receive;send(“250OK“+“\t\n“);receive;send(“221smtp.shexuServiceclosingtransmissionchannel!GoodBye...“);}catch(IOExceptione){e.printStackTrace;}finally{if(server!=null){try{server.close;}catch(IOExceptione){e.printStackTrace;}}if(socket!=null){try{socket.close;}catch(IOExceptione){e.printStackTrace;}}}}publicvoidreceive{count++;Stringstr=null;try{if(!(str=reader.readLine).trim.equals(““)){System.out.println(count+“收到客戶端信息:“+str);logger.log(“MailReceiver“,“Info“,“收到客戶端信息:“+str);}}catch(IOExceptione){e.printStackTrace;}}/***讀取正文并保存到文件*/publicvoidreceiveData{char[]temp=newchar[512];Stringstr=null;intcount=0;try{while(!(str=reader.readLine).trim.equals(“.“)){count++;System.out.println(“收到客戶端Date信息:“+str);logger.log(“MailReceiver“,“Info“,“收到客戶端信息:“+str.trim);//消退開頭換行if(count>=4&&count<=11){}else{out.println(str);}}System.out.println(“收到客戶端Date信息:“+str);logger.log(“MailReceiver“,“Info“,“收到客戶端信息:“+str.trim);}catch(IOExceptione){e.printStackTrace;}}publicvoidsend(String
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 督察崗面試題庫(kù)及答案
- 央美創(chuàng)作測(cè)試題及答案
- 音樂(lè)開學(xué)第一課教案
- 部門表態(tài)發(fā)言稿
- 軟件測(cè)試工程師年終總結(jié)
- 超市營(yíng)銷的策劃設(shè)計(jì)方案
- 2025年農(nóng)產(chǎn)品運(yùn)輸承包合同
- 解除合同起訴狀
- 2025企業(yè)與金融機(jī)構(gòu)借款合同范本
- 2025企業(yè)茶葉收購(gòu)管理經(jīng)營(yíng)承包合同模板
- 急性心肌梗死病史簡(jiǎn)介及護(hù)理查房
- MOOC 臨床生物化學(xué)檢驗(yàn)技術(shù)-杭州醫(yī)學(xué)院 中國(guó)大學(xué)慕課答案
- 燙傷的護(hù)理課件
- 酸嘢商業(yè)計(jì)劃書
- 2023-2024學(xué)年人教版小學(xué)英語(yǔ)四年級(jí)下冊(cè)期末測(cè)試卷含答案
- 《唐詩(shī)三百首》讀書分享交流會(huì)
- JTS-T 200-2023 設(shè)計(jì)使用年限50年以上港口工程結(jié)構(gòu)設(shè)計(jì)指南
- 展覽費(fèi)用預(yù)算方案
- 輸血科崗位職責(zé)、技術(shù)操作規(guī)程和管理制度
- 疼痛科護(hù)士的非藥物疼痛管理技巧
- 古典歐式風(fēng)格
評(píng)論
0/150
提交評(píng)論