電子郵件的發(fā)送和接收_第1頁
電子郵件的發(fā)送和接收_第2頁
電子郵件的發(fā)送和接收_第3頁
電子郵件的發(fā)送和接收_第4頁
電子郵件的發(fā)送和接收_第5頁
已閱讀5頁,還剩101頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第13章電子郵件的發(fā)送和接收電子郵件(electronicmail,簡稱e-mail)是因特網(wǎng)上使用最多的一種應(yīng)用,它為用戶在因特網(wǎng)上設(shè)立了存放郵件的電子郵箱,發(fā)信人可以隨時將電子郵件發(fā)送到收信人的電子郵箱,收信人也可以隨時上網(wǎng)讀取,發(fā)信人與收信人以異步的方式通信。NetworkProgramminga第13章電子郵件的發(fā)送和接收郵件傳輸原理1、電子郵件系統(tǒng)的構(gòu)成一個電子郵件系統(tǒng)包括三個主要的構(gòu)件,即用戶代理,郵件消息傳輸代理(郵件服務(wù)器),和電子郵件使用的協(xié)議。如圖所示:NetworkProgramminga第13章電子郵件的發(fā)送和接收

2、電子郵件系統(tǒng)的實現(xiàn)NetworkProgramminga13.1E-mail協(xié)議簡介郵件服務(wù)器按照提供的服務(wù)類型,可以分為發(fā)送郵件服務(wù)器(簡稱發(fā)送服務(wù)器)和接收郵件服務(wù)器(簡稱接收服務(wù)器)。發(fā)送郵件服務(wù)器使用郵件發(fā)送協(xié)議,現(xiàn)在常用的是SMTP,所以通常發(fā)送郵件服務(wù)器也稱為SMTP服務(wù)器;接收郵件服務(wù)器使用接收郵件協(xié)議,常用的有POP3協(xié)議和IMAP協(xié)議,所以通常接收郵件服務(wù)器也稱為POP3服務(wù)器或IMAP服務(wù)器。NetworkProgramminga13.1.1SMTP協(xié)議簡介

SMTP(SimpleMailTransferProtocol),即簡單郵件傳輸協(xié)議,是Internet傳送E-mail的基本協(xié)議,也是TCP/IP協(xié)議組的成員。SMTP協(xié)議解決郵件系統(tǒng)如何通過一條鏈路,把郵件從一臺機器傳送到另一臺機器上的問題。SMTP協(xié)議的特點是具有良好的可伸縮性,這也是它成功的關(guān)鍵。它既適用于廣域網(wǎng),也適用于局域網(wǎng)。SMTP協(xié)議由于非常簡單,使得它得到了廣泛的運用,在Internet上能夠發(fā)送郵件的服務(wù)器幾乎都支持SMTP協(xié)議。NetworkProgramminga13.1E-mail協(xié)議簡介

NetworkProgramming客戶機A客戶機Bemail服務(wù)器ASMTP服務(wù)器email服務(wù)器BPOP3/IMAP服務(wù)器internet1、SMTP傳輸2、SMTP--傳輸郵件3、pop3/IMAP協(xié)議--接收閱讀a13.1.1SMTP協(xié)議簡介SMTP協(xié)議采用C/S模式,專用于電子郵件的發(fā)送,規(guī)定了發(fā)信人把郵件發(fā)送到收信人的電子郵箱的全過程中,SMTP客戶與SMTP服務(wù)器這兩個相互通信的進程之間應(yīng)如何交換信息。即規(guī)定了SMTP的會話過程。用戶直接使用的是用于編寫和發(fā)送的客戶端軟件,而通常的SMTP服務(wù)器運行在遠程站點上??蛻?服務(wù)器之間的通信是通過TCP/IP協(xié)議進行的。SMTP的命令和響應(yīng)都是基于文本,以命令行為單位,換行符為CR/LF。響應(yīng)信息一般只有一行,由一個3位數(shù)的代碼開始,后面可附上很簡短的文字說明。SMTP要經(jīng)過建立連接、傳送郵件和釋放連接3個階段。具體如下:

NetworkProgramminga13.1.1SMTP協(xié)議簡介具體為:(1)建立TCP連接。(2)客戶端向服務(wù)器發(fā)送HELLO命令以標識發(fā)件人自己的身份,然后客戶端發(fā)送MAIL命令。(3)服務(wù)器端以O(shè)K作為響應(yīng),表示準備接收。(4)客戶端發(fā)送RCPT命令。(說明收信人的電子郵件地址)(5)服務(wù)器端表示是否愿意為收件人接收郵件。(6)協(xié)商結(jié)束,發(fā)送郵件,用命令DATA發(fā)送輸入內(nèi)容。(7)結(jié)束此次發(fā)送,用QUIT命令退出。電子郵件系統(tǒng)發(fā)郵件時是根據(jù)收信人的地址后綴來定位郵件服務(wù)器的。SMTP通過用戶代理程序(UA)完成郵件的編輯、收取和閱讀等功能;通過郵件傳輸代理程序(MTA)將郵件傳送到目的地。

NetworkProgramminga13.1.2POP3協(xié)議簡介

POP3(PostOfficeProtocol3)即郵局協(xié)議的第3個版本,它是規(guī)定個人計算機如何連接到互聯(lián)網(wǎng)上的郵件服務(wù)器進行收發(fā)郵件的協(xié)議。它是因特網(wǎng)電子郵件的第一個離線協(xié)議標準,POP3協(xié)議允許用戶從服務(wù)器上把郵件存儲到本地主機(即自己的計算機)上,同時根據(jù)客戶端的操作刪除或保存在郵件服務(wù)器上的郵件,而POP3服務(wù)器則是遵循POP3協(xié)議的接收郵件服務(wù)器,用來接收電子郵件的。POP3協(xié)議是TCP/IP協(xié)議族中的一員,,由RFC1939定義。本協(xié)議主要用于支持使用客戶端遠程管理在服務(wù)器上的電子郵件。NetworkProgramminga13.1.3IMAP協(xié)議簡介

InternetMailAccessProtocol互聯(lián)網(wǎng)郵件訪問協(xié)議。IMAP協(xié)議它的主要作用是郵件客戶端(例如MSOutlookExpress)可以通過這種協(xié)議從郵件服務(wù)器上獲取郵件的信息,下載郵件等。它與POP3協(xié)議的主要區(qū)別是用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對服務(wù)器上的郵件進行操作。用戶可以通過瀏覽信件頭來決定是否收取、刪除和檢索郵件的特定部分,還可以在服務(wù)器上創(chuàng)建或更改文件夾或郵箱,它除了支持POP3協(xié)議的脫機操作模式外,還支持聯(lián)機操作和斷連接操作。它為用戶提供了有選擇的從郵件服務(wù)器接收郵件的功能、基于服務(wù)器的信息處理功能和共享信箱功能。NetworkProgramminga13.1.4MIME簡介MIME(MultipurposeInternetMailExtensions,多用途Internet郵件擴充標準)不是郵件傳輸協(xié)議,而是對郵件格式所作的規(guī)范。它擴展了電子郵件標準,使其能夠支持非ASCII字符、二進制格式附件等多種格式的郵件消息。MIME規(guī)定了用于表示各種各樣的數(shù)據(jù)類型的符號化方法。MIME是通過標準化電子郵件報文的頭部的附加領(lǐng)域(fields)而實現(xiàn)的;這些頭部的附加領(lǐng)域,描述新的報文類型的內(nèi)容和組織形式。

NetworkProgramminga13.1.4MIME簡介NetworkProgramminga13.1.4MIME簡介內(nèi)容類型(Content-Type),這個頭部領(lǐng)域用于指定消息的類型type有下面的形式。Text:用于標準化地表示的文本信息,文本消息可以是多種字符集和或者多種格式的;Multipart:用于連接消息體的多個部分構(gòu)成一個消息,這些部分可以是不同類型的數(shù)據(jù);Application:用于傳輸應(yīng)用程序數(shù)據(jù)或者二進制數(shù)據(jù);Message:用于包裝一個E-mail消息;Image:用于傳輸靜態(tài)圖片數(shù)據(jù);Audio:用于傳輸音頻或者音聲數(shù)據(jù);Video:用于傳輸動態(tài)影像數(shù)據(jù),可以是與音頻編輯在一起的視頻數(shù)據(jù)格式。

NetworkProgramminga13.2JavaMailAPI簡介SUN公司制定了JavaMailAPI,它封裝了按照各種郵件通信協(xié)議,如IMAP、POP3和SMTP,與郵件服務(wù)器通信的細節(jié),為Java應(yīng)用程序提供了收發(fā)電子郵件的公共接口,參見圖NetworkProgramminga13.2JavaMailAPI簡介JavaMailAPI主要位于javax.mail包和ernet中,圖為其中主要類的類框圖。

NetworkProgramminga13.2JavaMailAPI簡介1.javax.mail.Session類:表示郵件會話,是JavaMailAPI的最高層入口類。Session類定義了基本的郵件會話。就像Http會話那樣,我們進行收發(fā)郵件的工作都是基于這個會話的。Session對象利用了java.util.Properties對象獲得了郵件服務(wù)器、用戶名、密碼信息和整個應(yīng)用程序都要使用到的共享信息。Session類的構(gòu)造方法是私有的,所以我們可以使用Session類提供的getDefaultInstance()這個靜態(tài)工廠方法獲得一個默認的Session對象:Propertiesprops=newProperties();Sessionsession=Session.getDefaultInstance(props,null);NetworkProgramminga13.2JavaMailAPI簡介2、javax.mail.Store類:表示接收郵件服務(wù)器上的注冊用戶的存儲空間,通過Store類的getFolder()方法,可以訪問用戶的特定郵件夾。通過javax.mail.Store類可以訪問javax.mail.Folder類。我們需要從Session中獲取特定類型的Store,然后連接到Store,在連接Store的過程中,極有可能需要用到用戶名、密碼或者Authenticator。Storestore=session.getStore("imap");Storestore=session.getStore("pop3");store.connect(host,username,password);

NetworkProgramminga13.2JavaMailAPI簡介3、javax.mail.Folder類代表郵件夾,郵件都放在郵件夾中,F(xiàn)older提供了管理郵件夾及郵件的各種方法在連接到Store后,一個Folder對象即目錄對象將通過Store的getFolder()方法被返回,我們可從這個Folder中讀取郵件信息:Folderfolder=store.getFolder("INBOX");folder.open(Folder.READ_ONLY);NetworkProgramminga13.2JavaMailAPI簡介

4、javax.mail.Message類代表電子郵件,封裝了實際email消息的所有細節(jié),如標題、發(fā)送/接收地址、發(fā)送日期等,提供了讀取和設(shè)置郵件內(nèi)容的方法。Message是一個抽象類,大多數(shù)情況下,我們使用ernet.MimeMessage這個子類,該類是使用MIME類型、MIME信息頭的郵箱信息。為了建立一個MimeMessage對象,我們必須將Session對象作為MimeMessage構(gòu)造方法的參數(shù)傳入:MimeMessagemessage=newMimeMessage(session);message.setFrom(newInternetAddress(from));message.addRecipient(Message.RecipientType.TO,newInternetAddress(to));message.setSubject("HelloJavaMail");message.setText("WelcometoJavaMail");NetworkProgramminga13.2JavaMailAPI簡介

5、javax.mail.Address類:郵件地址類,像Message一樣,Address類也是一個抽象類,所以我們將使用ernet.InternetAddress這個子類。通過傳入代表郵件地址的字符串,我們可以建立一個郵件地址類:Addressaddress=newInternetAddress("president@");NetworkProgramminga13.2JavaMailAPI簡介

6、javax.mail.Transport類:在發(fā)送信息時,Transport類將被用到。這個類實現(xiàn)了發(fā)送信息的協(xié)議(通稱為SMTP),此類是一個抽象類,我們可以使用這個類的靜態(tài)方法send()來發(fā)送消息。Transporttransport=session.getTransport("smtp");transport.connect(host,username,password);transport.sendMessage(message,message.getAllRecipients());transport.close();NetworkProgramminga13.2JavaMailAPI簡介

7、javax.mail.Authenticator類:像類那樣,JavaMailAPI通過使用授權(quán)者類(Authenticator是一個抽象類)以用戶名、密碼的方式訪問那些受到保護的資源,在這里“資源”就是指郵件服務(wù)器。下面代碼片斷中的MyAuthenticator就是一個Authenticator的子類。Propertiesprops=newProperties();Authenticatorauth=newMyAuthenticator();Sessionsession=Session.getDefaultInstance(props,auth);NetworkProgramminga13.3建立JavaMail應(yīng)用程序的開發(fā)環(huán)境JDK中并不包含JavaMailAPI。為了開發(fā)JavaMail應(yīng)用程序,需要從SUN公司的網(wǎng)站下載JavaMailAPI及其實現(xiàn)的類庫,該類庫由兩個JAR文件組成:mail.jar和activation.jar。NetworkProgramminga13.3建立JavaMail應(yīng)用程序的開發(fā)環(huán)境1.安裝JavaMail為了使用JavaMailAPI,需要從/products/javamail/downloads/index.html下載文件名格式為javamail-[version].zip的文件(這個文件中包括了JavaMail實現(xiàn)),并將其中的mail.jar文件添加到CLASSPATH中。這個實現(xiàn)提供了對SMTP、IMAP4、POP3的支持。注意:在安裝JavaMail實現(xiàn)之后,我們將在demo目錄中發(fā)現(xiàn)許多有趣的簡單實例程序。在安裝了JavaMail之后,我們還需要安裝JavaBeansActivationFramework,因為這個框架是JavaMailAPI所需要的。如果我們使用J2EE的話,那么我們并無需單獨下載JavaMail,因為它存在于J2EE.jar中,只需將J2EE.jar加入到CLASSPATH即可NetworkProgramminga13.3建立JavaMail應(yīng)用程序的開發(fā)環(huán)境2.安裝JavaBeansActivationFramework從/products/javabeans/glasgow/jaf.html下載JavaBeansActivationFramework,并將其添加到CLASSPATH中。此框架增加了對任何數(shù)據(jù)塊的分類、以及對它們的處理的特性。這些特性是JavaMailAPI需要的。雖然聽起來這些特性非常模糊,但是它對于我們的JavaMailAPI來說只是提供了基本的MIME類型支持。到此為止,我們應(yīng)當把mail.jar和activation.jar都添加到了CLASSPATH中。當然如果從方便的角度講,直接把這兩個Jar文件復(fù)制到JRE目錄的lib/ext目錄中也可以。NetworkProgramminga13.4創(chuàng)建JavaMail應(yīng)用程序JavaMail應(yīng)用程序在初始化過程中需要執(zhí)行如下步驟。步驟(1)設(shè)置JavaMail屬性:Propertiesprops=newProperties();props.put(“tocol”,“smtp”);//指定郵件發(fā)送協(xié)議props.put("tocol","imap");//指定郵件接收協(xié)議props.put("mail.smtp.class","com.sun.mail.smtp.SMTPTransport");//指定支持SMTP協(xié)議的Transport具體類,允許由第三方提供。props.put("mail.imap.class","com.sun.mail.imap.IMAPStore");//指定支持IMAP協(xié)議的Store具體類,允許由第三方提供。props.put("mail.smtp.host",hostname);//指定采用SMTP協(xié)議的郵件發(fā)送服務(wù)器的IP地址或主機名。NetworkProgramminga13.4創(chuàng)建JavaMail應(yīng)用程序步驟(2)調(diào)用javax.mail.Session類的靜態(tài)方法Session.getDefaultInstance()獲得Session實例,該方法根據(jù)已經(jīng)配置的JavaMail屬性來創(chuàng)建Session實例:Sessionmailsession=Session.getDefaultInstance(props);步驟(3)調(diào)用Session的getStore(Stringprotocol)方法來獲得Store對象,參數(shù)protocol指定接收郵件協(xié)議:Storestore=mailsession.getStore("imap");

步驟(1)把mail.imap.class屬性設(shè)為com.sun.mail.imap.IMAPStore,因此以上getStore()方法返回com.sun.mail.imap.IMAPStore類的實例。NetworkProgramminga13.4創(chuàng)建JavaMail應(yīng)用程序步驟(4)調(diào)用Store對象的connect()方法連接到接收郵件服務(wù)器。調(diào)用connect()方法時,應(yīng)該指定接收郵件服務(wù)器的主機名或IP地址、用戶名和口令。store.connect(hostname,username,password);NetworkProgramminga13.4創(chuàng)建JavaMail應(yīng)用程序獲得了Store對象后,就可以通過它來訪問郵件服務(wù)器上的特定郵件用戶了。通常會對郵件用戶執(zhí)行以下操作。操作(一)創(chuàng)建并發(fā)送郵件://創(chuàng)建郵件msg=newMimeMessage(mailsession);InternetAddress[]toAddrs=InternetAddress.parse("admin@",false);//設(shè)置郵件接收者msg.setRecipients(Message.RecipientType.TO,toAddrs);//設(shè)置郵件的主題msg.setSubject("hello");NetworkProgramminga13.4創(chuàng)建JavaMail應(yīng)用程序//設(shè)置郵件的發(fā)送者msg.setFrom(newInternetAddress("admin@"));//設(shè)置郵件的正文msg.setText("Howareyou");//發(fā)送郵件Transport.send(msg);Transport的靜態(tài)方法send(Message)負責發(fā)送郵件服務(wù)器,郵件發(fā)送協(xié)議由tocol屬性指定,郵件發(fā)送服務(wù)器由mail.smtp.host屬性指定。NetworkProgramminga13.4創(chuàng)建JavaMail應(yīng)用程序操作(二)打開inbox郵件夾收取郵件://獲得名為“inbox”的郵件夾Folderfolder=store.getFolder("inbox");//打開郵件夾folder.open(Folder.READ_ONLY);//獲得郵件夾中的郵件數(shù)目System.out.println("Youhave"+folder.getMessageCount()+"messagesininbox.");//獲得郵件夾中的未讀郵件數(shù)目System.out.println("Youhave"+folder.getUnreadMessageCount()+"unreadmessagesininbox.");在IMAP協(xié)議中,inbox郵件夾是郵件用戶的保留郵件夾,用戶不允許刪除該郵件夾,郵件服務(wù)器把所有接收到的新郵件都存在該郵件夾中。NetworkProgramminga13.4創(chuàng)建JavaMail應(yīng)用程序操作(三)從郵件夾中讀取郵件://從郵件夾中讀取第一封郵件Messagemsg=folder.getMessage(1);System.out.println("------thefirstmessageininbox-------");//獲得郵件的發(fā)送者、主題和正文System.out.println("From:"+msg.getFrom()[0]);System.out.println("Subject:"+msg.getSubject());System.out.println("Text:"+msg.getText());NetworkProgramminga13.5身份驗證在實際應(yīng)用中,往往希望在連接郵件服務(wù)器時,彈出一個對話框,提示用戶輸入用戶名和口令。為了達到這一效果,需要按照以下步驟創(chuàng)建和使用javax.mail.Authenticator類:(1)創(chuàng)建一個javax.mail.Authenticator類的子類(假定名為MailAuthenticator),實現(xiàn)getPasswordAuthentication()方法。(2)創(chuàng)建MailAuthenticator對象,并且把它作為參數(shù)傳給Session的getDefaultInstance()方法:Authenticatorma=newMailAuthenticator();Sessionsession=Session.getDefaultInstance(props,ma);(3)連接到接收郵件服務(wù)器時,把用戶名和口令設(shè)為null:

store.connect(receiveHost,null,null);NetworkProgramminga13.5身份驗證NetworkProgramminga13.6URLName類javax.mail.URLName類表示URL的名字,URLName類與.URL類的區(qū)別在于:URLName類不嘗試連接目標地址。構(gòu)造URLName對象時,無需指定協(xié)議處理器。URLName類可以表示非標準的URL地址。比如URLName對象可以表示接收郵件服務(wù)器上的特定郵件夾,形式為:

協(xié)議名://用戶名:口令@主機:端口/郵件夾NetworkProgramminga13.6URLName類URLName類中包括以下getXXX()方法:getProtocol():獲得URL名字中的協(xié)議。getHost():獲得URL名字中的主機。getUsername():獲得URL名字中的用戶名。getPassword():獲得URL名字中的口令。getFile():獲得URL名字中的文件名或者郵件夾名NetworkProgramminga13.6URLName類URLName類中包括以下getXXX()方法:getProtocol():獲得URL名字中的協(xié)議。getHost():獲得URL名字中的主機。getUsername():獲得URL名字中的用戶名。getPassword():獲得URL名字中的口令。getFile():獲得URL名字中的文件名或者郵件夾名。NetworkProgramminga13.6URLName類例程14-5的MailClientURLName類的init(URLNameurlName)方法從一個URLName對象中獲取連接到接收郵件服務(wù)器的各種信息。這個URLName對象表示的URL名字為:imap://admin:1234@localhost/publicvoidinit(URLNameurlName)throwsException{receiveProtocol=urlName.getProtocol();receiveHost=urlName.getHost();username=urlName.getUsername();password=urlName.getPassword();

NetworkProgramminga13.6URLName類

//設(shè)置屬性Propertiesprops=newProperties();props.put("mail.smtp.host",sendHost);

//創(chuàng)建Session對象session=Session.getDefaultInstance(props);

//創(chuàng)建Store對象store=session.getStore(receiveProtocol);

//連接到郵件服務(wù)器store.connect(receiveHost,username,password);}NetworkProgramminga13.7創(chuàng)建和讀取復(fù)雜電子郵件如圖所示,按照MIME規(guī)范,電子郵件包括郵件頭和正文兩部分。郵件頭中包括日期、發(fā)送者地址、接收者地址和主題等信息。正文部分可以包括普通文本內(nèi)容,還可以包括一個或多個附件。NetworkProgramminga13.7創(chuàng)建和讀取復(fù)雜電子郵件javax.mail.Message抽象類表示郵件,它的具體子類為javax.mail.MimeMessage類,它提供了讀取和設(shè)置郵件中各個部分的getXXX()和setXXX()方法:setSubject(Stringsubject)方法設(shè)置郵件的主題。setHeader(Stringname,Stringvalue)方法設(shè)置郵件頭部的某一項。setContent(Objecto,Stringtype)方法設(shè)置郵件的正文。NetworkProgramminga13.7.1郵件地址javax.mail.Address抽象類表示郵件地址,它的最常用的子類是javax.mail.InternetAddress類。InternetAddress類表示Internet網(wǎng)上通用的郵件地址,形式為admin@,或者“Admin<admin@>”。InternetAddress類提供了一系列g(shù)et和set方法,用來讀取和設(shè)置address、personal和charset等屬性,例如:getAddress():讀取address屬性。getPersonal():讀取personal屬性。setAddress(Stringaddress):設(shè)置address屬性。setPersonal(Stringpersonal):設(shè)置personal屬性。NetworkProgramminga13.7.1郵件地址以下兩段代碼是等價的:InternetAddressaddr=newInternetAddress("admin@","Admin");或者:InternetAddressaddr=newInternetAddress();addr.setAddress("admin@");addr.setPersonal("Admin");NetworkProgramminga13.7.1郵件地址MimeMessage類的以下方法用于讀取或設(shè)置郵件中的地址信息:Address[]getFrom():讀取發(fā)送者的郵件地址。Address[]getRecipients(Message.RecipientTypetype):讀取特定接收類型的郵件地址。voidsetFrom(Addressaddress):設(shè)置發(fā)送者的郵件地址。voidsetRecipients(Message.RecipientTypetype,Address[]addresses):設(shè)置特定接收類型的郵件地址,參數(shù)addresses指定多個接收地址。voidsetRecipients(Message.RecipientTypetype,Stringaddresses):設(shè)置特定接收類型的郵件地址,參數(shù)addresses指定一個接收地址。NetworkProgramminga13.7.1郵件地址Message.RecipientType類型的靜態(tài)常量表示地址類型,包括:Message.RecipientType.TO:主接收地址。Message.RecipientType.CC:抄送地址。Message.RecipientType.BCC:廣播地址。NetworkProgramminga13.7.1郵件地址以下程序代碼設(shè)置了郵件的各項郵件地址:MimeMessagemsg=newMimeMessage(session);InternetAddressfrom=newInternetAddress("admin@");InternetAddress[]to=InternetAddress.parse("admin@,java_mail@");InternetAddresscc=newInternetAddress("linda_j2ee@");InternetAddress[]bcc=InternetAddress.parse("abc@,xyz@");msg.setFrom(from);msg.setRecipients(Message.RecipientType.TO,to);msg.setRecipients(Message.RecipientType.CC,cc);msg.setRecipients(Message.RecipientType.BCC,bcc);NetworkProgramminga13.7.2郵件頭部MimeMessage類的以下getXXX()和setXXX()方法用于讀取和設(shè)置郵件頭部的特定項:String[]getHeader(Stringname)voidsetHeader(Stringname,Stringvalue)以下兩段代碼的作用是等價的,它們的作用都是設(shè)置郵件的主題:msg.setHeader("subject","hello");或者:msg.setSubject("hello");NetworkProgramminga13.7.2郵件頭部MimeMessage類的getAllHeaders()方法返回一個包含Header對象的Enumeration對象,每個Header對象表示郵件頭部的一項。以下程序代碼遍歷郵件頭部的所有項:for(Enumeration<Header>e=msg.getAllHeaders();e.hasMoreElements();){Headerheader=e.nextElement();System.out.println(header.getName()+":“+header.getValue());}NetworkProgramminga13.7.3郵件標記多數(shù)接收郵件服務(wù)器允許郵件包含特定的標記信息,這些標記可以使用戶更方便的管理郵件。JavaMailAPI用javax.mail.Flags類的Flags.Flag內(nèi)部類的靜態(tài)實例來表示標記:Flags.Flag.ANSWERED:表示郵件已經(jīng)回復(fù)。該標記由客戶程序設(shè)置。Flags.Flag.DELETED:表示郵件已經(jīng)被刪除。該標記由客戶程序設(shè)置。Flags.Flag.RECENT:表示剛剛被添加到郵件夾的郵件,即最近一次打開郵件夾時,被添加到郵件夾的郵件。該標記由Folder類的實現(xiàn)來設(shè)置,客戶程序只能讀取該標記。NetworkProgramminga13.7.3郵件標記Flags.Flag.FLAGGED:表示郵件已經(jīng)作了某種標記??蛻舫绦蚩梢栽O(shè)置該標記。Flags.Flag.SEEN:表示郵件已經(jīng)被閱讀。該標記由JavaMailAPI的實現(xiàn)來設(shè)置。當客戶程序調(diào)用了郵件的getContent()方法時,該郵件被加上Flags.Flag.SEEN標記??蛻舫绦蚩梢孕薷倪@個標記。Flags.Flag.DRAFT:表示郵件是草稿。該標記由客戶程序設(shè)置。Flags.Flag.USER:表示郵件所在的郵件夾支持用戶自定義的標記。該標記由接收郵件服務(wù)器設(shè)置,客戶程序只能讀取該標記??蛻舫绦蚩梢酝ㄟ^folder.getPermanentFlags().contains(Flags.Flag.USER)方法判斷郵件夾是否支持用戶自定義的標記。NetworkProgramminga13.7.3郵件標記MimeMessage類提供了三個與標記有關(guān)的方法:voidsetFlags(Flagsflags,booleanset):設(shè)置或取消一組標記。voidsetFlags(Flags.Flag,booleanset):設(shè)置或取消特定標記。booleanisSet(Flags.Flagflag):察看是否設(shè)置了某個標記。NetworkProgramminga13.7.3郵件標記以下兩段程序代碼是等價的,它們的作用都是為一個郵件設(shè)置SEEN和ANSWERED標記:Flagsflags=newFlags();flags.add(Flags.Flag.SEEN);flags.add(Flags.Flag.ANSWERED);msg.setFlags(flags,true);或者:msg.setFlags(Flags.Flag.SEEN,true);msg.setFlags(Flags.Flag.ANSWERED,true);NetworkProgramminga13.7.3郵件標記如果郵件所在的郵件夾支持用戶標記,還可以通過以下方式為郵件加上具有特殊含義的用戶標記:Flagsflags=newFlags();flags.add("privateemail");flags.add("abouttravelling");msg.setFlags(flags,true);//表示這是一封關(guān)于旅游的私人信件NetworkProgrammingNetworkProgramminga13.7.3郵件標記以下程序代碼察看郵件的所有標記:if(msg.isSet(Flags.Flag.DELETED))System.out.println("DELETED");elseif(msg.isSet(Flags.Flag.SEEN))System.out.println("SEEN");elseif(msg.isSet(Flags.Flag.ANSWERED))System.out.println("ANSWERED");elseif(msg.isSet(Flags.Flag.RECENT))System.out.println("RECENT");NetworkProgramminga13.7.3郵件標記elseif(msg.isSet(Flags.Flag.DRAFT))System.out.println("DRAFT");elseif(msg.isSet(Flags.Flag.FLAGGED))System.out.println("FLAGGED");elseif(msg.isSet(Flags.Flag.USER)){//讀取用戶標記String[]userFlags=msg.getFlags().getUserFlags();for(inti=0;i<userFlags.length;i++){System.out.println("UserFlag:"+userFlags[i]);}}NetworkProgramminga13.7.4郵件正文郵件正文是郵件中最復(fù)雜的一部分,正文可以是純文本,還可以包括若干附件。JavaMailAPI把郵件正文的各個組成部分以及整個郵件都抽象為部件,部件用javax.mail.Part接口表示。一個Part對象和一個DataHandler對象關(guān)聯(lián),DataHandler對象負責處理部件包含的數(shù)據(jù)。Part接口有兩個子接口:MimePart接口和BodyPart接口。MimePart接口表示符合MIME規(guī)范的部件。BodyPart接口表示可以作為郵件正文的組成部分的部件。NetworkProgramminga13.7.4郵件正文Part接口及其相關(guān)類的類框圖

NetworkProgramminga13.7.4郵件正文MimeBodyPart類實現(xiàn)了MimePart接口和BodyPart接口,因此MimeBodyPart對象可以作為MimeMessage的正文的組成部分。MimeMessag類的以下三個方法都用于設(shè)置正文:voidsetText(Strinttxt)voidsetContent(Objecto,Stringtype)voidsetContent(Multipartmp)NetworkProgramminga13.7.4郵件正文如果MimeMessage僅包含純文本內(nèi)容,可以通過以下兩種方式設(shè)置郵件正文:msg.setText("Howareyou");或者msg.setContent("Howareyou","text/plain");如果MimeMessage的正文包括多個組成部分,既有純文本內(nèi)容,還有若干附件,那就應(yīng)該先創(chuàng)建一個包含正文的各個組成部分的MimeMultipart對象,然后調(diào)用msg.setContent(Multipartmp)方法,把MimeMultipart對象作為郵件的正文。NetworkProgramminga13.7.4郵件正文例程的MailClientSendAttach類創(chuàng)建了一個包括附件的郵件,然后發(fā)送該郵件。這封郵件的正文包括三個組成部分,分別用三個MimeBodyPart對象來表示。第一個MimeBodyPart對象表示郵件的純文本內(nèi)容,其他兩個MimeBodyPart對象分別表示兩個附件。這些MimeBodyPart對象都加入到一個MimeMultipart對象中。

NetworkProgrammingNetworkProgramminga13.7.4郵件正文例程MailClientSendAttach.javaimportjavax.mail.*;importernet.*;importjavax.activation.*;importjava.util.*;publicclassMailClientSendAttachextendsMailClientForCitiz{privateStringfromAddr="java_mail@";//發(fā)送者地址privateStringtoAddr="java_mail@";//接收者地址

NetworkProgrammingNetworkProgramminga13.7.4郵件正文publicvoidsendMessage(StringfromAddr,StringtoAddr)throwsException{

//創(chuàng)建一個郵件Messagemsg=newMimeMessage(session);InternetAddress[]toAddrs=InternetAddress.parse(toAddr,false);msg.setRecipients(Message.RecipientType.TO,toAddrs);msg.setSubject("hello");msg.setSentDate(newDate());msg.setFrom(newInternetAddress(fromAddr));NetworkProgramminga13.7.4郵件正文Stringattch1="attch1.rar";Stringattch2="attch2.rar";Multipartmultipart=newMimeMultipart();

//加入文本內(nèi)容MimeBodyPartmimeBodyPart1=newMimeBodyPart();mimeBodyPart1.setText("Howareyou");multipart.addBodyPart(mimeBodyPart1);

NetworkProgramminga13.7.4郵件正文//加入第一個附件MimeBodyPartmimeBodyPart2=newMimeBodyPart();FileDataSourcefds=newFileDataSource(attch1);//得到數(shù)據(jù)源

mimeBodyPart2.setDataHandler(newDataHandler(fds));mimeBodyPart2.setDisposition(Part.ATTACHMENT);//標識本部件為附件mimeBodyPart2.setFileName(fds.getName());//設(shè)置文件名(與原文件名同)multipart.addBodyPart(mimeBodyPart2);//將附件添加到正文對象NetworkProgramminga13.7.4郵件正文//加入第二個附件MimeBodyPartmimeBodyPart3=newMimeBodyPart();fds=newFileDataSource(attch2);//得到數(shù)據(jù)源

mimeBodyPart3.setDataHandler(newDataHandler(fds));mimeBodyPart3.setDisposition(Part.ATTACHMENT);mimeBodyPart3.setFileName(fds.getName());//設(shè)置文件名multipart.addBodyPart(mimeBodyPart3);msg.setContent(multipart);//設(shè)置郵件的正文Transport.send(msg);//發(fā)送郵件}

NetworkProgramminga13.7.4郵件正文publicstaticvoidmain(String[]args)throwsException{MailClientSendAttachclient=newMailClientSendAttach();client.init();client.sendMessage(client.fromAddr,client.toAddr);client.close();}}NetworkProgramminga13.7.5郵件接收例程的MailClientReadAttach類的processMessage(Messagemsg)方法演示如何解析并處理可能包括附件的郵件。

publicstaticvoidprocessMessage(Messagemsg)throwsException{processMessageHeader(msg);//處理郵件頭部Objectbody=msg.getContent();//獲得郵件正文if(bodyinstanceofMultipart){processMultipart((Multipart)body);}else{processPart(msg);}}

NetworkProgramminga13.7.5郵件接收(處理郵件頭部)

publicstaticvoidprocessMessageHeader(Messagemsg)throwsException{for(Enumeration<Header>e=msg.getAllHeaders();e.hasMoreElements();){Headerheader=e.nextElement();System.out.println(header.getName()+":"+header.getValue());}}

NetworkProgramminga13.7.5郵件接收(郵件正文)附件的獲取:從消息中獲取附件比發(fā)送它們棘手些,因為

MIME

沒有簡單的關(guān)于附件的概念。當消息包含附件時,消息的內(nèi)容是個

Multipart

對象。接著,您需要處理每個

Part,獲取主要內(nèi)容和附件。標有從

part.getDisposition()

獲得的

Part.ATTACHMENT

配置(disposition)的部件(Part)無疑就是附件。但是,沒有配置(以及一個非文本

MIME

類型)和帶Part.INLINE

配置的部件也可能是附件。當配置要么是

Part.ATTACHMENT,要么是

Part.INLINE

時,這個消息部件的內(nèi)容就能被保存。只要用

getFileName()

getInputStream()

就能分別得到原始文件名和輸入流。

NetworkProgramminga13.7.5郵件接收(郵件正文)

publicstaticvoidprocessMultipart(Multipartmp)throwsException{for(inti=0;i<mp.getCount();i++){();//Miltipart的數(shù)量,比如多個附件

processPart(mp.getBodyPart(i));}}publicstaticvoidprocessPart(Partpart)throwsException{StringfileName=part.getFileName();Stringdisposition=part.getDisposition();StringcontentType=part.getContentType();System.out.println("fileName="+fileName);System.out.println("disposition="+disposition);System.out.println("contentType="+contentType);

NetworkProgramminga13.7.5郵件接收(郵件正文)

if((disposition!=null)&&

((disposition.equals(Part.ATTACHMENT)||

(disposition.equals(Part.INLINE))){

fileName=File.createTempFile("attachment",".data").getName();

}}

NetworkProgramminga13.7.5郵件接收(郵件正文)if(fileName==null){//如果不是附件,打印到控制臺part.writeTo(System.out);System.out.println();}else{Filefile=newFile(fileName);

//創(chuàng)建一個在文件系統(tǒng)中不存在的文件for(inti=1;file.exists();i++){StringnewName=i+"_"+fileName;file=newFile(newName);}

NetworkProgramminga13.7.5郵件接收(郵件正文)//把附件保存到一個文件中OutputStreamout=newBufferedOutputStream(newFileOutputStream(file));InputStreamin=newBufferedInputStream(part.getInputStream());intb;while((b=in.read())!=-1)out.write(b);out.close();in.close();}}NetworkProgramminga小結(jié)郵件服務(wù)器:要在Internet上提供電子郵件功能,必須有專門的電子郵件服務(wù)器。例如現(xiàn)在Internet很多提供郵件服務(wù)的廠商:sina、sohu、163等等他們都有自己的郵件服務(wù)器。這些服務(wù)器類似于現(xiàn)實生活中的郵局,它主要負責接收用戶投遞過來的郵件,并把郵件投遞到郵件接收者的電子郵箱中。電子郵箱:電子郵箱(E-mail地址)的獲得需要在郵件服務(wù)器上進行申請,確切地說,電子郵箱其實就是用戶在郵件服務(wù)器上申請的一個帳戶。用戶在郵件服務(wù)器上申請了一個帳號后,郵件服務(wù)器就會為這個帳號分配一定的空間,用戶從而可以使用這個帳號以及空間,發(fā)送電子郵件和保存別人發(fā)送過來的電子郵件。NetworkProgramminga小結(jié)SMTP協(xié)議(畫圖演示)用戶連上郵件服務(wù)器后,要想給它發(fā)送一封電子郵件,需要遵循一定的通迅規(guī)則,SMTP協(xié)議就是用于定義這種通訊規(guī)則的。因而,通常我們也把處理用戶smtp請求(郵件發(fā)送請求)的郵件服務(wù)器稱之為SMTP服務(wù)器。(25)POP3協(xié)議同樣,用戶若想從郵件服務(wù)器管理的電子郵箱中接收一封電子郵件的話,他連上郵件服務(wù)器后,也需要遵循一定的通迅格式,POP3協(xié)議用于定義這種通訊格式。因而,通常我們也把處理用戶pop3請求(郵件接收請求)的郵件服務(wù)器稱之為POP3服務(wù)器。(110)NetworkProgramminga小結(jié)IMAP協(xié)議它的主要作用是郵件客戶端(例如MSOutlookExpress)可以通過這種協(xié)議從郵件服務(wù)器上獲取郵件的信息,下載郵件等。它與POP3協(xié)議的主要區(qū)別是用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對服務(wù)器上的郵件進行操作。用戶可以通過瀏覽信件頭來決定是否收取、刪除和檢索郵件的特定部分,還可以在服務(wù)器上創(chuàng)建或更改文件夾或郵箱,它除了支持POP3協(xié)議的脫機操作模式外,還支持聯(lián)機操作和斷連接操作。它為用戶提供了有選擇的從郵件服務(wù)器接收郵件的功能、基于服務(wù)器的信息處理功能和共享信箱功能。NetworkProgramminga練習(xí)題1問題:以下哪個協(xié)議允許管理遠程郵件服務(wù)器上的郵件夾?選項:a)POP3b)SMTPc)HTTPd)IMAP4答案:dNetworkProgramminga練習(xí)題2問題:以下哪個協(xié)議是發(fā)送郵件服務(wù)器使用郵件發(fā)送協(xié)議?選項:a)POP3b)SMTPc)HTTPd)IMAP4答案:bNetworkProgramminga練習(xí)題3問題:以下哪些方法屬于Store類的方法?選項:a)connect(Stringhost,Stringuser,Stringpassword)b)getFolder(Stringname)c)send(Messagemsg)d)setText(Stringtxt)答案:a,bNetworkProgramminga練習(xí)題4問題:假設(shè)登入到一個IMAP服務(wù)器的用戶名為“Tom”,口令為“1234”,IMAP服務(wù)器的主機名為myhost,以下哪個URL地址代表該用戶的inbox郵件夾?選項:a)imap://myhost/Tom/1234/inboxb)imap://inbox.myhost/Tom/1234/c)imap://1234:Tom@myhost/inboxd)imap://Tom:1234@myhost/inbox答案:dNetworkProgrammingNetworkProgramminga練習(xí)題5問題:以下哪些郵件標記只能被客戶程序讀取,而不能被客戶程序修改?選項:a)Flags.Flag.ANSWEREDb)Flags.Flag.DELETEDc)Flags.Flag.RECENTd)Flags.Flag.SEENe)Flags.Flag.DRAFTf)Flags.Flag.USER答案:c,fNetworkProgramminga練習(xí)題6問題:MultiPart與BodyPart之間是什么關(guān)系?選項:a)繼承b)依賴c)組成d)實現(xiàn)答案:cNetworkProgramminga思考與編程1、電子郵件發(fā)送和接收過程?2、用JavaMail實現(xiàn)電子郵件發(fā)送和接收。NetworkProgramminga使用Socket發(fā)送電子郵件1、SMTP客戶與SMTP服務(wù)器之間的會話(1)SMTP會話圖SMTP客戶與SMTP服務(wù)器之間的會話

NetworkProgramminga使用Socket發(fā)送電子郵件(2)SMTP命令一般是客戶主動,首先發(fā)送。SMTP客戶發(fā)往SMTP服務(wù)器的信息稱為SMTP命令。在RFC821中,SMTP協(xié)議規(guī)定了14種命令。SMTP命令的一般的格式是:命令關(guān)鍵字參數(shù)<CRLF>其中,命令關(guān)鍵字一般是四個字母,是一個英文動詞的縮寫。參數(shù)隨命令而異,命令應(yīng)當以回車換行符結(jié)束。比如HELOWANG<CRLF>

NetworkProgramminga使用Socket發(fā)送電子郵件(3)SMTP應(yīng)答SMTP服務(wù)器收到命令后,返回給SMTP客戶的信息,稱為SMTP應(yīng)答。客戶每次發(fā)送一條SMTP命令后,服務(wù)器給客戶返回一條響應(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ù)字,與描述信息文本之間有一個空格,

NetworkProgramminga使用Socket發(fā)送電子郵件2、常用的SMTP命令(1)SMTP客戶問候SMTP服務(wù)器命令格式:HELO發(fā)送方的主機名<CRLF>(2)郵件來自何處,說明發(fā)信人的電子郵件地址命令格式:MAILFROM:發(fā)信人的電子郵件地址<CRLF>(3)說明收信人的電子郵件地址命令格式:RCPTTO:收信人的電子郵箱地址<CRLF>(4)請求發(fā)送郵件內(nèi)容命令格式:DATA<CRLF>

NetworkProgramminga使用Socket發(fā)送電子郵件(5)空操作命令格式:NOOP<CRLF>(6)驗證電子信箱是否合法命令格式:VRFY電子信箱地址<CRLF>(7)復(fù)位SMTP服務(wù)器命令格式:RSET<CRLF>(8)請求服務(wù)器發(fā)回幫助信息命令格式:HELP<CRLF>或者HELP命令關(guān)鍵字<CRLF>(9)退出會話命令格式:QUIT<CRLF>NetworkProgramminga使用Socket發(fā)送電子郵件3、常用的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)發(fā)。354啟動郵件輸入,要求郵件文本要用<CRLF><CRLF>結(jié)束。421服務(wù)不可使用,關(guān)閉傳輸通道。450沒有執(zhí)行請求的郵箱操作,因為信箱不可用。NetworkProgramminga使用Socket發(fā)送電子郵件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ù)失敗。NetworkProgramminga4、SMTP的會話過程SMTP客戶與SMTP服務(wù)器的會話過程分為三個階段,先舉例說明。以下每行前面的C代表SMTP客戶發(fā)送的命令,S代表服務(wù)器發(fā)回的響應(yīng)。每行//后面的內(nèi)容是注釋。C:HELOYE

//你好!我是YE。S:250YEHELLO,pleasedtomeetyou//你好!YE,很高興見到你,有事嗎?C:MAILFROM:YE@163.COM

//我想發(fā)信,我的地址是YE@163.COM。S:250<From:YE@163.COM>,Sender,accepted//行!有信你就發(fā)吧使用Socket發(fā)送電子郵件NetworkProgramminga使用Socket發(fā)送電子郵件C:RCPTZHANG@263.net

//我的信要發(fā)給ZHANG@263.net。S:250<ZHANG@263.net>,Recipientok//行!已經(jīng)準備好。C:DATA

//我要發(fā)信件的內(nèi)容了。S:354Entermail,endwith<CRLF>.<CRLF>//發(fā)吧!結(jié)尾標志是兩個回車換行符夾個英文句點。C:(客戶端按照電子郵件的格式發(fā)送郵件內(nèi)容)C:(郵件內(nèi)容發(fā)送完畢,發(fā)送結(jié)束標志crlf&.&crlf)//我的信已經(jīng)發(fā)完了S:250ok,messagesaved//好的,你的信已經(jīng)存儲了。C:QUIT

//再見S:221Seeyouincyberspace//再見NetworkProgramminga使用Socket發(fā)送電子郵件在上面的對話過程中,粗體字部分是發(fā)送郵件的客戶端軟件發(fā)送的內(nèi)容,其他部分是SMTP服務(wù)器的應(yīng)答內(nèi)容。從中可以明顯看出SMTP會話具有以下特點:(1)會話的過程采用交互式的請求應(yīng)答模式,客戶發(fā)送命令,服務(wù)器回送應(yīng)答。(2)客戶發(fā)送的命令和服務(wù)器回送的應(yīng)答都是純文本形式,有一定格式。(3)針對客戶的每個命令,服務(wù)器總要返回一定的響應(yīng)碼,表示服務(wù)器是否接受或執(zhí)行了客戶端命令。(4)會話過程有一定的順序

NetworkProgramminga使用Socket發(fā)送電子郵件(1)啟動SMTP服務(wù)器,在指定的傳輸層端口監(jiān)聽客戶端的連接請求,為SMTP服務(wù)器保留的端口是25。(2)客戶端設(shè)置sock連接的IP地址或域名,指定端口號,主動發(fā)出連接請求,連接到SMTP服務(wù)器。比如,網(wǎng)易的SMTP服務(wù)器的域名是,監(jiān)聽端口是25。(3)服務(wù)器接收客戶端的連接請求,并發(fā)回響應(yīng)??蛻舳藨?yīng)收到類似220BigFoxESMTPserviceready這樣的信息,這就說明客戶端已經(jīng)與服務(wù)器建立TCP/IP連接,成功地實現(xiàn)了第一步。NetworkProgramminga使用Socket發(fā)送電子郵件(4)客戶端和服務(wù)器分別向?qū)Ψ桨l(fā)送數(shù)據(jù)。(5)客戶端或服務(wù)器分別讀取自己緩沖區(qū)中的數(shù)據(jù)。(6)以上兩步是SMTP會話的主要部分,要按照SMTP協(xié)議的規(guī)定,按照一定順序,客戶向服務(wù)器發(fā)送命令,服務(wù)器向客戶發(fā)送應(yīng)答,以上兩步要多次重復(fù)。(7)會話完畢,關(guān)閉客戶端和服務(wù)器之間的連接。

NetworkProgrammingaPOP3的會話過程NetworkProgrammingaPOP3的會話過程POP也使用客戶/服務(wù)器工作模式,在接收郵件的用戶的PC機中,運行POP客戶程序,在用戶所連接的ISP的郵件服務(wù)器中,運行POP服務(wù)程序,二者之間按照POP協(xié)議相互發(fā)送信息,POP客戶發(fā)送給POP服務(wù)器的消息稱為POP命令,POP服務(wù)器返回的消息稱為POP響應(yīng)。交互的過程稱為POP會話。例如:(ConnecttothePOP3Server....)//首先連接到POP3服務(wù)器S:+OKPOP3serverready//服務(wù)器已經(jīng)準備好C:USERWang//用戶名是Wang

NetworkProgrammingaPOP3的會話過程S:+OKC:PASSvegetables//口令是vegetablesS:+OKloginsuccessful//客戶登錄成功了C:LIST//請列出信箱中的信件清單

S:1AAAA//第一封信S:2BBBB//第二封信S:3CCCC//第三封信C:RETR1//取回第一封信S:+OK(sendmessage1)//好,(發(fā)送第一封信)NetworkProgrammingaPOP3的會話過程C:DELE1//刪除第一封信S:+OK//好的C:

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論