




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
電子郵件系統(tǒng)工作原理電子郵件是因特網(wǎng)上最為流行的應(yīng)用之一,它主要包括如下組成局部:用戶代理、郵件效勞器簡潔郵件傳輸協(xié)議(simpleMailTransferProtocolSMTP)郵件消息格式郵件訪問協(xié)議。圖11.1展現(xiàn)了因特網(wǎng)電子郵件系統(tǒng)的概貌。在下文對電子郵件系統(tǒng)各組成局部的說明中,以發(fā)信人A1ice給收信人Bob發(fā)送電子郵件消息作為例子。郵件效勞器
用戶代理
SMTP
用戶代理SMTP
郵件效勞器SMTP外出消息隊列用戶郵箱郵件效勞器用戶代理圖11.1 因特網(wǎng)電子郵件系統(tǒng)概貌用戶代理。Alice寫完Alice把這個消息放入外出消息隊列中并負責(zé)發(fā)送到Bob郵箱所在的郵件效勞器。當Bob想閱讀電子郵2090年月后期,圖形用戶界面(GUI)當前流行的用戶代Outlook、Foxmail等。郵件效勞器郵件效勞器構(gòu)成了電子郵件系統(tǒng)的核心。每個收信人都有一個位于某個郵件效勞器上的郵箱(mailbox)Bob信人的用戶代理開頭,經(jīng)發(fā)信人郵箱所在的郵件效勞器,中轉(zhuǎn)到收信人郵箱所在的郵件效勞器,然后投遞到收信人的郵箱中。當Bob想查看自己的郵箱中的郵件消息時,其郵箱所在的郵件效勞Alice郵箱所在郵件效勞器還必需處理Bob郵箱所在郵件效勞器出故障的狀況。假設(shè)Alice方的郵件效勞器無法把郵件消息馬上遞送到Bob方的郵件效勞器,A1ice方的效勞器就把它們存放在消息隊列(messagequeue)中,以后再嘗試遞送。這種嘗試通常每30分鐘左右執(zhí)行一次:要是過了假設(shè)干天仍未嘗試成功,該效勞器就把這個消息從消息隊列中刪除,同時以另一個郵件消息通知發(fā)信人(Alice)。SMTPSMTP是因特網(wǎng)電子郵件系統(tǒng)重要的應(yīng)用層協(xié)議TCP供給的牢靠的數(shù)據(jù)傳輸效勞把郵件消息從發(fā)信人郵箱所在郵件效勞器傳送到收信人郵箱所在郵件效勞器。SMTP是客戶-效勞器應(yīng)用模式,由發(fā)信人的郵件效勞器執(zhí)行的客戶端和收信人的郵件效勞器執(zhí)行的效勞器端組成。SMTP的客戶端和效勞器端同時運行在每個郵件效勞器上送郵件消息時,它是作為SMTP客戶端。當一個郵件效勞器從其它郵件效勞器接收郵件消息時,它是作為SMTP效勞器端。SMTPRFC821中,它的作用是把郵件消息從發(fā)信人的郵件效勞器傳送到收信人的郵件效勞器。SMTP7位ASCII字符格式。這個限制使得二進制多媒體數(shù)據(jù)在由SMTP7ASCII文本;SMTP傳送完畢之后,再7位ASCII文本郵件消息解碼成二進制數(shù)據(jù)。AliceBobASCII文本郵件消息的情形來說明SMTP的根本操作:Alice調(diào)用自己的電子郵件用戶代理,給出Bob的電子郵件地址(例如bob@),寫好郵件內(nèi)容,然后讓用戶代理發(fā)送本郵件消息。Alice的用戶代理把該郵件消息發(fā)送到其郵件效勞器中息隊列中。運行在A1ice的郵件效勞器上的SMTP個到運行在Bob的郵件效勞器主機上的SMTP效勞器端的TCP連接。經(jīng)過最初的一些SMTP握手之后,SMTP客戶把A1ice的郵件消息發(fā)送到TCP連接上。Bob的郵件效勞器主機上,SMTP效勞器收到這個郵件消息后,把這個消息投遞到Bob的郵箱中。Bob在便利的時候調(diào)用自己的電子郵件用戶代理閱讀該郵件消息11.2展現(xiàn)了上述情形。SMTPSMTP因特網(wǎng)Alice的郵件效勞器 Bob的郵件效勞器圖11.2 A1ice的郵件效勞器把郵件消息傳送到Bob的郵件效勞器SMTPBob的郵件效勞器不工作了,那么A1ice發(fā)給Bob的郵件消息將存留在Alice的郵件效勞器中等待的嘗試,而不會存放到某個中間的郵件效勞器中。SMTP效勞器主機上的SMTP客戶,發(fā)起建立一個到運行在接收端郵件效勞器主機上的SMTP效勞器端25之間的TCPSMTP客戶就等待一段時間后再嘗試SMTP手東西之前往往先自我介紹那樣,SMTPSMTP握手階段,SMTPSMTP使用傳輸層供給的牢靠數(shù)據(jù)傳輸效勞(TCP效勞)把該消息無過失地傳送到效勞器。假設(shè)客戶還有其它郵件消息需發(fā)送到同一個效勞器,它就在同一個TCP連接上重復(fù)上述過程;否則,它就指示TCP關(guān)閉該連接。sina。前面標以“C:”的ASCII文本TCP套接字中的完整文本行,前面標以“S:”的ASCII文本行是效勞器發(fā)送到它的TCP套接字中的完整文本行。一個客戶和效勞器交互的例子如下(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在這個例子中,客戶發(fā)送了一個從郵件效勞器主機sina的郵件消息,信體內(nèi)容為:“Doyoulikeketchup?Howaboutpickles?”5HELO命令標識發(fā)信人自己的身份;MAILFROM命令表示懇求發(fā)送郵件,初始化郵件傳輸;RCPTTO命令標識某電子郵件的打算接收人;DATA.完畢;QUIT命令表示退出郵件發(fā)送過程,完畢會話。(可選)構(gòu)成。SMTP使用長久連接,假設(shè)發(fā)送郵件效勞器有多個郵件消息需發(fā)送到同一個接收郵件效勞器,那么全部這些消息可以在同一個TCP“HELOsina”命令開頭整個消息發(fā)送過程,但是QUIT命令要等到全部消息都發(fā)送完之后才發(fā)出。一旦SMTPAlice發(fā)給Bob的郵件消息從Alice的郵件效勞器傳送到BobBob的郵箱中。郵件消息格式當Alice給Bob發(fā)一封一般的郵政信件時,她把這封信裝入一個信封里,在信封上寫明Bob的地址和自己的回信地址,然后投入郵箱;郵政業(yè)務(wù)在遞送這封信的過程中,也會把說明時間和地點的郵戳蓋在信封上。類似地,當電子郵件消息從一個人傳送到另一個人時,在信體之前會有RFC822中定義的郵件消息頭部及其值構(gòu)成。郵件消息中構(gòu)成信頭的各個頭部和信體之間以一個空行(CRLF)分割。RFC822具體說明白各個郵件消息頭部的格式和含義。郵件消息的每個頭部都是直觀可讀的文本,由一個后跟冒號的關(guān)鍵From:頭部和To:Subject:頭部和其他頭部。這些頭部和前面爭論的SMTP命令不是一回事:SMTP命令是SMTP握手協(xié)議的一局部,郵件消息頭部則屬于郵件消息的一局部。下面是一個典型的電子郵件信頭:From:“mailto:alice@sina“alice@sinaTo:“mailto:bob@“bob@Subject:thisisaletter信頭之后空一行就是信體。SMTPRFC822ASCII字符形式,就是每個郵件消息的信體必需以“CRLF.CRLF”結(jié)尾,其中CRLF分別代表回車符和換行符。這種方式下,當從同一個SMTP客戶接收一系列郵件消息時,SMTP效勞器可以通過在字節(jié)流中搜尋“CRLF.CRLF”來分割每個消息。RFC822中說明的郵件消息頭部盡管足以滿足發(fā)送一般ASCII文本郵件的要求,但是在多媒體消息(例如,包含圖像、音頻或視頻數(shù)據(jù)的消息)的描述和非ASCII文本格式(例如,非英語國家使用的文字)的承載上,卻明顯不夠,例如,假設(shè)信體是JPEG圖像的二進制數(shù)據(jù),那么這些二進制數(shù)據(jù)字節(jié)流中可能消滅“CRLF.CRLF”模式。這將導(dǎo)致SMTP效勞器誤認為當前郵件消息已完畢。為避開這樣的問題,二進制數(shù)據(jù)應(yīng)以某種方式編碼成ASCII文本,保證其中不存在特定的ASCII字符(包括點號)ASCII部。RFC2045和RFC2046定義了這些額外的頭部,它們是針對RFC822的多用途因特網(wǎng)郵件擴展(MultipurposeInternetMailExtensions,簡稱MIME)。支持多媒體的兩個關(guān)鍵MIME頭部是Content-Type:Content-Tansfer-Encoding:Content-Type:頭部允許接收用戶代理對郵件消息實行適宜的行動。例如,通過指出信體內(nèi)容為一個JPEG圖像,接收用戶代理可以把信件定向到某個JPEGSMTPASCII文本消息必需預(yù)先編碼成ASCII文本格式。Content-Tansfer-Encoding:頭部用于告知接收用戶代理信體已被編碼成ASCII格式,并指出具體編碼方式。這樣,當某個用戶代理收到一個包含這兩個頭部的郵件消息時,它首先使用Content-Tansfer-Encoding:ASCII文本形式,再使用Content-Type:頭部的值確定自己應(yīng)當對信體實行什么行動。假設(shè)Alice想給Bob發(fā)送一個JPEGBob的電子郵件地址和郵件消息的主題,并把這個JPEG圖像插入這個郵件消息的信體中(這個圖像有可能是作為該郵件消息的“附件”插入的,具體取決于Alice所用的用戶代理)。Alice填寫完郵件消息后讓用戶代理把它發(fā)送出去。Alice的用戶代理生成一個大體如下的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編碼格式對這個JPEG是在MIME中標準化的用于轉(zhuǎn)換成某種可承受的7位ASCII格式的編碼技術(shù)之一(定義在RFC2045中)。Base64承受了一種很簡潔的編碼轉(zhuǎn)換:對于待編碼數(shù)據(jù),以36位數(shù)083×8=4×634個字節(jié)的輸出,長度上增加了1/3。上面的處理還不能保證得到的字符都是可見字符,為了到達此目的,Base64制定了一個編碼表,進展統(tǒng)一的轉(zhuǎn)換,見表11.126=64Base64名330進展填充,相應(yīng)地,輸出字符則使用?=?占位,因此編碼后輸出的文本末尾可能會消滅12個?=?。表11.1 Base64編碼表值編碼值編碼值編碼值編碼值編碼值編碼值編碼值編碼0A8I16Q24Y32g40o48w5641B9J17R25Z33h41p49x5752C10K18S26a34i42q50y5863D11L19T27b35j43r51z5974E12M20U28c36k44s5206085F13N21V29d37l45t5316196G14O22W30e38m46u54262+7H15P23X31f39n47v55363/Bob閱讀郵件時,其用戶代理所操作的是同一個MIME消息。該用戶代理看到值為base64的Content-Transfer-Encoding:image/jpeg的Content-Type:頭部,它告知Bob的用戶代理應(yīng)當對信體進展JPEG解壓縮。該郵件消息中的MIME-Version:頭部指示本消息所用的MIME版本。Content-Type頭部遵循MIME標準定義在RFC2046其格式為Content-Type:type/subtype;parameters。其中parameters(以及其前面的分號)是可選的通過在Content-Type:頭部給出媒體類型(type)名和子類型(subtype)名來說明MIME消息信體中數(shù)據(jù)的性質(zhì)。類型名和子類型名之后的其余局部是一組參數(shù)。類型名用于聲明數(shù)據(jù)的一般類型,子類型名用于指明這類數(shù)據(jù)中的某種具體格式。參數(shù)是對于類型的修飾說明,取值取決于類型和子類型本身,不影響內(nèi)容性質(zhì)的指定MIME是依據(jù)可擴展目標認真地設(shè)計的并預(yù)期媒體類型/子類型以及它們的相關(guān)參數(shù)會隨時間顯著增長。為確保以有秩序的文檔完備公開的方式開發(fā)這些類型/子類型,MIME建立了一套注冊程式,把因特網(wǎng)安排數(shù)值權(quán)威(InternetAsignedNumbersAuthority, 簡稱IANA)作為MIME各個可擴展域的中心注冊處。RFC2048具體說明白這些可擴展域的注冊程式。每個MIME類型關(guān)聯(lián)一組子類型,其數(shù)量在逐年增長。一些主要類型如下:text: text類型用于向接收者的用戶代理指出消息體為文本。該類型的一個普遍使用的類型/子類型對為text/plain。子類型plain指定不含任何格式定義信息的一般文本。plain文本不加任何解釋地依據(jù)原樣顯示,不需要特別的軟件,但要求支持給定的字符集。在實際的郵件消息中經(jīng)常能看到值對為text/plain;charset=gb2312或 text/plain;charset=“ISO-8859-1”的Content-Type:頭部,其中的參數(shù)指出用于產(chǎn)生相應(yīng)消息的字符集。另一個普遍使用的類/子類型對是text/html。子類型html指示接收用戶代理解釋嵌入在消息體中的html標記,從而像Web頁面那樣顯示信件內(nèi)容,其中有可能包含各種字體的文本、超鏈接、Java小應(yīng)用程序等等。image:image類型用于向接收用戶代理指出消息體為圖像。該類型較為流行的兩個類型/子類型對為image/gifimage/jpegGIF圖像或JPEG圖像解碼并顯示。audio:audio類型需要音頻輸出設(shè)備(例如揚聲器或)來表達內(nèi)容。這類型中常見的已標準化子類型包括basic(8u-law編碼)32kadpcm(RFC191132Kbps格式)。video: video類型的子類型包括mpeg和quicktime。application:application程序預(yù)先處理才能為用戶所見或所用的數(shù)據(jù)上。例如,當用戶在某個電子郵件消息中附帶一個微軟wordapplication/msword;這將導(dǎo)致接收用戶代理啟動微軟wordMIMEoctet-streamapplication/octet-stream的郵件消息后,接收用戶代理睬提示用戶是否把信體保存到硬盤中,以便稍后處理。MultiPart:MultiPartMIME個對象時例如多個圖像或ASCII文本與圖像共存,其Content-Type:頭部的值通常為multipart/mixed。這頭部向接收用戶代理指出本消息中含有多個對象。在多個對象共處同一個郵件消息中的狀況下,通過在每個對象之間放置邊界字符串,并在每個對象之前定義Content-Type:和Content-Transfer-Encoding(1(2每個非ASCII文本對象的傳送編碼方式;(3)每個對象的內(nèi)容類型。為便于理解multipart/mixedAliceBobASCIIJPEG圖像,再跟一些ASCII文本。Alice使用自己的用戶代理編輯文本并附上圖像后,該用戶代理生成一個如下的郵件消息: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ù)用于指定分隔各個局部的邊界字符串。在郵件消息體中,該分隔字符串以兩個短劃線開頭,以CRLF結(jié)尾。一個電子郵件消息由多個部件構(gòu)成。信體是郵件消息的核心,它是發(fā)送者發(fā)送給接收者的真正數(shù)據(jù)。對于多局部郵件消息來說,其信體本身由多個局部組成,而每個局部又有一個或多個說明其數(shù)據(jù)性質(zhì)的頭部。信體之前是一個空行和由多個郵件消息頭部組成的信頭。這些頭部既包括RFC822頭部,例如From:、To:和subject:,也包括MIME頭部,例如Content-type:和Content-Transfer-Encoding:SMTP接收效勞器插到每個郵件消息項端的Received:SMTP效勞器的主機名(“from”)SMTP效勞器的主機名(“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有時候,單個郵件消息會有多個Received:頭部,有的還會有一個較簡單的Return-path:頭部。這是由于郵件消息在從發(fā)送者的主機到接收者的主機的傳送過程中,可能會被轉(zhuǎn)發(fā)到不止一個SMTP效勞器。例如,假設(shè)Bob指示他在主機上的郵件效勞器把他的全部郵件轉(zhuǎn)發(fā)到主機sohu,那么他通過其用戶代理看到的郵件消息可能以大體如下的兩行開頭:Received:frombysohu;18Oct200709:55:37GMTReceived:fromsinaby;18Oct200709:53:37GMT這些頭部給接收用戶代理供給了相應(yīng)郵件消息訪問過的SMTP效勞器及訪問時間的蹤跡。SMTP標準所在的RFC822具體定義丁Received:頭部的語法。郵件訪問協(xié)議在前面的爭論中,都是假設(shè)Bob通過直接登錄到自己的郵件效勞器主機啟動用戶代理來閱讀20世紀90年月早期,這仍舊是標準的做法。然而,當今的用戶一般使用在本地PC機(Mac機)上執(zhí)行的用戶代理來閱讀郵件,而不管是辦公室PC機、家庭PC機還是便攜機。用戶在本地PC機上執(zhí)行用戶代理可享受諸多好處,包括便利查看多媒體郵件消息和附件。郵件消息的接收者在本地PC機上執(zhí)行用戶代理時,很自然的一個想法是在本地PC機上也運行郵件效勞器,然而這種方法存在一個問題。郵件效勞器是治理郵箱并運行SMTP的客戶端和效勞器PCPC是不現(xiàn)實或不經(jīng)濟的做法。相反,用戶一般只在本地PC機上運行一個用戶代理,由它遠程訪問存放在某臺共享的郵件效勞器主機上的郵箱,而該郵件效勞器主機總是連接在因特網(wǎng)上并為多個用戶所共享。該主機及其上的郵件效勞器—ISP(例如大學(xué)或公司)維護。用戶代理運行在各個用戶的本地PCISP或機構(gòu)內(nèi)部網(wǎng)絡(luò)中的某臺效勞器主機上,用戶代理和郵件效勞器之間需要有一個相互通信的協(xié)議。先查看一下出自從Alice的PC機的某個郵件消息如何設(shè)法到達BobSMTP郵件效勞器。這個任務(wù)可簡潔地由Alice的用戶代理使用SMTP直接與BobAlice的用戶代理發(fā)起建立一個到Bob郵箱所在的郵件效勞器的TCP連接,并通過該連接發(fā)出SMTP握手命令,再用DATA命令上傳郵件消息,最終關(guān)閉連接。這種方法盡管切實可行,卻很少被承受,由于它沒有給Alice的用戶代理供給任何資源來應(yīng)對目標郵件效勞器臨時崩潰的狀況。Alice的用戶代理發(fā)起與自己郵箱所在的郵件效勞器的一個SMTP會話Alice方的郵件效勞器發(fā)起與Bob方的郵件效勞器的一次SMTP會話,把郵件消息中轉(zhuǎn)給Bob方的郵件效勞器。假設(shè)Bob方的郵件效勞器臨時不行用,Alice方的郵件效勞器就暫存該郵件消息,以后連續(xù)嘗試?,F(xiàn)在的問題是像Bob這樣在本地PC機上運行用戶代理的收信人該如何獵取已到達自己的郵件效勞器的郵件消息(該郵件效勞器運行在Bob的ISP中的某臺主機上)通過引入用于從自己的郵件效勞器到本地PC機上的用戶代理傳送郵件消息的郵件訪問協(xié)議可以解決這個問題目前流行的郵件訪問協(xié)議有兩個:郵局協(xié)議版本3(PostOfficeProtocolVersion3,簡稱POP3)和因特網(wǎng)郵件訪問協(xié)議(InternetMailAccessProtocol, 簡稱IMAP)。這兩個協(xié)議使用內(nèi)拉操作獵取郵件消息,而SMTP是一個外推協(xié)議。圖11.3匯總了因特網(wǎng)電子郵件系統(tǒng)中所用的協(xié)議:SMTP用于從發(fā)送者的郵件效勞器到接收者的郵件效勞器傳送郵件消息,也用于從發(fā)送者的用戶代理到發(fā)送者的郵件效勞器傳送郵件消息;POP3或IMAP用于從接收者的郵件效勞器到接收者的用戶代理傳送郵件消息。SMTPSMTPSMTP
IMAPPOP3
用戶代理
發(fā)送者的郵件效勞器 接收者的郵件效勞器圖11.3 電子郵件協(xié)議及它們的通信實體
用戶代理RFC1939中定義的POP3POP3開頭于用戶代理翻開一個到POP3110的TCPPOP3效勞器與郵件效勞器運行在一樣的服務(wù)器主機上,前者從用戶的郵箱中讀取并可能刪除郵件消息,后者往用戶的郵箱中寫入郵件消息。TCP連接建立好之后,POP3依次經(jīng)受授權(quán)認證、處理和更3個階段。在授權(quán)階段,用戶代理分別發(fā)出一個用戶名和一個口令以認證下載郵件消息的用戶。在處理階段,用戶代理獵取郵件消息,并可以標記待刪除的郵件消息或去掉這些標記,獵取郵件統(tǒng)計信息。更階段發(fā)生在用戶代理發(fā)quitPOP3POP3效勞器刪除己加過刪除標記的郵件消息。在POP3會話期間,用戶代理發(fā)出命令,POP3效勞器則對每個命令響應(yīng)以一個應(yīng)答。可能的應(yīng)答有兩個:指出剛剛的命令執(zhí)行成功的+OK(有時后跟一個解釋性消息)和指出剛剛的命令執(zhí)行有誤的-ERR。授權(quán)階段:授權(quán)階段共有兩個根本命令:user<用戶名>和pass<口令>。可以使用telnet工POP110POP3效勞器主機,并發(fā)出這些命令來展現(xiàn)它們的用法。假設(shè)mailserver是郵件效勞器主機名,這個過程大致如下:telnetmailserver110+OKPOP3serverreadyuseralice+OKpasspassword+OKusersuccessfullyloggedon假設(shè)寫錯了某個命令,POP3效勞器將返回一個-ERR應(yīng)答。處理階段:POP3的用戶代理可配置成“下載并刪除”或“下載并保存”兩種模式之一。POP3list、retr和dele命令。假設(shè)用戶的郵箱中已存有兩個郵件消息,其POP3處理階段大致如下(其中前面標以“C:”的是用戶代理發(fā)出的命令,而標以“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效勞器列出存放在自己的郵箱中的每個郵件消息的大小回并刪除每個郵件消息。授權(quán)階段完畢之后,用戶代理只能發(fā)出4個命令:list、retr、dele、quit。這些命令的具體語法定義在RFC1939中。quit命令后,POP312從相應(yīng)的郵箱中刪除。收信人可能期望從不止一臺主機訪問自已的郵箱,如既能從辦公室PC機訪問,也能從家庭PC機訪問,還能從便攜機訪問。下載并刪除模式不能滿足這種需求,例如,這種模式將導(dǎo)PC后就不能在便攜機上閱讀同一個郵件消息了。下載并保存模式則恰好相反,用戶代理把己從POP3效勞器下載的郵件消息連續(xù)保存在郵件效勞器中。在這種模式下,用戶可以在不同的時間從不同的主機訪問同樣的郵件消息。在用戶代理和郵件效勞器之間的POP3會話期間,POP3效勞器維護肯定POP3效勞器不會跨會話保存狀態(tài)信息,例如,每次會話開頭之時沒有任何郵件消息被標記成待刪除狀態(tài)。IMAP收信人使用POP3中,然后可以進展刪除、跨郵件夾轉(zhuǎn)移、按發(fā)信人名字或消息主題搜尋郵件消息等操作。但是這種郵件夾和郵件消息都存放在本地機上,不能滿足游動用戶的需求。游動用戶更情愿在遠程郵件效勞器主機上維護郵件夾,這樣從任何主機都可以訪問它。RFC2060中定義的IMAP協(xié)議解決了上述問題。IMAP允許用戶像對待本地郵箱那樣操縱遠程郵箱,使得收信人能夠在自己的郵件效勞器主機中創(chuàng)立并維護多個存放郵件消息的郵件夾。用戶可以把郵件消息存入郵件夾,也可以從一個郵件夾到另一個郵件夾轉(zhuǎn)移郵件,還可以在這些遠程郵件夾中搜尋匹配特定準則的郵件消息。IMAP效勞器必需為每個用戶維護一個郵件夾層次構(gòu)造IMAP的實現(xiàn)比POP3IMAPIMAP效勞器為該用戶維護的狀態(tài)信息跨這些相繼的訪問保持全都。POP3效勞器則相反,一旦用戶退出當前的POP3會話,就不再為其維護狀態(tài)信息。IMAP頭,或者只獵取多局部MIME消息的某個局部。這個特征在用戶代理和郵件效勞器主機之間為低帶寬連接(例如無線連接或低速調(diào)制解調(diào)器撥號連接)時格外有用。通過低帶寬連接訪問郵件時,用戶很可能不期望下載自己的郵箱中的全部郵件消息,特別是可能含有音頻或視頻剪輯的長消息。IMAPIMAP143的TCP連接;然后,效勞器返回初始問候消息;接著,客戶與效勞器就可以交互了??蛻艉托谄鞯慕换ビ煽虸MAP效勞器在會話期間總是處于以下4(nonauthenticated)(authenticated)(selected)和注銷(1ogout)。未認證狀態(tài)是連接剛建立時的初始狀態(tài),這種狀態(tài)下,用戶必需供給一個用戶名和口令對才能繼續(xù)下面的操作,即發(fā)出更多的命令。在已認證狀態(tài)下,用戶必需選擇一個郵件夾才能發(fā)出作用于郵件(獵取、轉(zhuǎn)移、刪除、獵取多局部消息的某個局部等等)。最終的注銷狀態(tài)是會話馬上終止時的狀態(tài)。郵件web掃瞄器,用戶與郵件效勞器主機上的郵箱之間的交互由協(xié)議完成。當收信人(Bob)想要查看其郵箱中的郵件消息時,這些消息通過協(xié)議(而不是POP3IMAP協(xié)議)從郵件效勞器主機傳送到他的掃瞄器(例如Alice)想要發(fā)送電子郵件消息時,這些消息也是通過協(xié)議(而不是SMTP協(xié)議)從她的掃瞄器傳送到她郵箱所在的郵件效勞器主機的。但郵件消息在郵件效勞器主機之間的中轉(zhuǎn)仍舊通過SMTP協(xié)IMAPWeb的電子郵件給移動用戶帶來了極大便利,但其主要缺乏之處在于速度比較慢,由于其效勞器主CGIHotmailYahoo!Mall,在將來,它將有可能形成與POP3IMAP訪問方法共存的局面。持續(xù)媒體電子郵件持續(xù)媒體(continuous-media,簡稱CM)電子郵件是包含音頻或視頻數(shù)據(jù)的電子郵件系統(tǒng),它對于朋友之間和家庭成員之間的異步溝通很有吸引力。例如,學(xué)齡前兒童更情愿使用CM電子郵件給CMCM郵件消息的速度要比輸入文本消息的速度快很多(180個單詞,但是一般辦公室工作人員每分鐘只能輸入20-40個單詞)。CM電子郵件在某些方面類似語音留言,不過功能要強大得多。它不僅給用戶供給一個訪問郵箱的圖形界面,而且允許用戶評注并回復(fù)CM者把CM郵件消息轉(zhuǎn)發(fā)給多個收信人。CMCM電子郵件消息比文本電子郵件消息大得多,對于端到端延遲有更嚴格的要求,對于收信人千差萬別的因特網(wǎng)訪問速率和本地存儲容量也更為敏感。當前的電子郵件設(shè)施也存在一些阻礙CM電于郵件推廣的缺乏之處。首先,很多現(xiàn)有的郵件效勞器沒有存放大郵件消息的容量;它們一般拒絕接收或中轉(zhuǎn)CM郵件消息,因此不行能給依附它們的收信人發(fā)送這樣的消息。其次,收信人的用戶代理只在取得完整的郵件消息后才表達其內(nèi)容,對于CM電子郵件,這會導(dǎo)致網(wǎng)絡(luò)帶寬和本地主機存儲容量的過度鋪張。事實上,倉儲的CM郵件消息往往不是完整地表達的,因此接收未作表達的數(shù)據(jù)明顯鋪張了網(wǎng)絡(luò)帶寬和本地存儲容量(例如,當某人收到來自相當嘮叨的同事的長篇語音郵件消息后,可能只聽上前1520分鐘內(nèi)容的整個消息)。再次,當前使用的郵件訪問協(xié)議(POP3、IMAP、)不適合為收信人流播放CM郵件消息。這些郵件訪問協(xié)議沒有供給這樣的功能:允許用戶暫停/恢復(fù)播放郵件消息內(nèi)容,或者在郵件消息內(nèi)重定位播放點;另外,在TCP上實現(xiàn)流播放往往導(dǎo)致糟糕的接收效果。這些缺乏之處有望在將來的幾年內(nèi)得到解決。不過近來超大郵箱開頭流行起來,如GMAIL等,郵箱容量的限制問題正在得到解決。關(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ā)送郵件過程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ā)送郵件過程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“,“效勞器啟動等待連接 “);System.out.println(“效勞器啟動等待連接 “);//啟動效勞socket=server.accept;//寫日志文件out.println(“時間:“+str.substring(0,14)+“收到信件“);logger.log(“MailReceiver“,“Info“,“收到主機“+socket.getInetAddress+socket.getInetAddress.getHostName+“的連接懇求!“);System.out.println(“收到主機“+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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 內(nèi)科學(xué)考試試題及答案
- 汽車修理主要管理制度
- 網(wǎng)絡(luò)設(shè)計的國際標準與本土慣例試題及答案
- 三工人員管理制度
- 上海小區(qū)管理制度
- 建筑機電安全管理制度
- 注塑模具備用件管理制度
- 醫(yī)藥公司保健品管理制度
- 廣發(fā)基金內(nèi)部管理制度
- 恒大公司招聘管理制度
- 農(nóng)場轉(zhuǎn)讓合同協(xié)議書模板
- 2025-2030中國共享單車服務(wù)行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 安徽省合肥一中2025屆高三最后一卷英語試題及答案
- 2025年法律職業(yè)資格(客觀題)重點考點大全
- 2025年組織行為學(xué)專業(yè)考試試題及答案
- 2024年直播電商高質(zhì)量發(fā)展報告
- 客訴處理培訓(xùn)課件
- 浙江專升本免試題目及答案
- 吉林省長春市2025屆高三質(zhì)量監(jiān)測(四)英語試卷+答案
- 中等職業(yè)學(xué)校英語課程標準
- 北京市海淀區(qū)2023-2024學(xué)年五年級下學(xué)期語文期末考試試卷(含答案)
評論
0/150
提交評論