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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

2、電子郵件系統的實現NetworkProgramming精選課件13.1E-mail協議簡介郵件服務器按照提供的服務類型,可以分為發送郵件服務器(簡稱發送服務器)和接收郵件服務器(簡稱接收服務器)。發送郵件服務器使用郵件發送協議,現在常用的是SMTP,所以通常發送郵件服務器也稱為SMTP服務器;接收郵件服務器使用接收郵件協議,常用的有POP3協議和IMAP協議,所以通常接收郵件服務器也稱為POP3服務器或IMAP服務器。NetworkProgramming精選課件13.1.1SMTP協議簡介

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

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

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

NetworkProgramming精選課件13.1.2POP3協議簡介

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

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

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

NetworkProgramming精選課件13.2JavaMailAPI簡介SUN公司制定了JavaMailAPI,它封裝了按照各種郵件通信協議,如IMAP、POP3和SMTP,與郵件服務器通信的細節,為Java應用程序提供了收發電子郵件的公共接口,參見圖NetworkProgramming精選課件13.2JavaMailAPI簡介JavaMailAPI主要位于javax.mail包和ernet中,圖為其中主要類的類框圖。

NetworkProgramming精選課件13.2JavaMailAPI簡介1.javax.mail.Session類:表示郵件會話,是JavaMailAPI的最高層入口類。Session類定義了基本的郵件會話。就像Http會話那樣,我們進行收發郵件的工作都是基于這個會話的。Session對象利用了java.util.Properties對象獲得了郵件服務器、用戶名、密碼信息和整個應用程序都要使用到的共享信息。Session類的構造方法是私有的,所以我們可以使用Session類提供的getDefaultInstance()這個靜態工廠方法獲得一個默認的Session對象:Propertiesprops=newProperties();Sessionsession=Session.getDefaultInstance(props,null);NetworkProgramming精選課件13.2JavaMailAPI簡介2、javax.mail.Store類:表示接收郵件服務器上的注冊用戶的存儲空間,通過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);

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

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

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

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

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

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

store.connect(receiveHost,null,null);NetworkProgramming精選課件13.5身份驗證NetworkProgramming精選課件13.6URLName類javax.mail.URLName類表示URL的名字,URLName類與.URL類的區別在于:URLName類不嘗試連接目標地址。構造URLName對象時,無需指定協議處理器。URLName類可以表示非標準的URL地址。比如URLName對象可以表示接收郵件服務器上的特定郵件夾,形式為:

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

NetworkProgramming精選課件13.6URLName類

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

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

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

//連接到郵件服務器store.connect(receiveHost,username,password);}NetworkProgramming精選課件13.7創建和讀取復雜電子郵件如圖所示,按照MIME規范,電子郵件包括郵件頭和正文兩部分。郵件頭中包括日期、發送者地址、接收者地址和主題等信息。正文部分可以包括普通文本內容,還可以包括一個或多個附件。NetworkProgramming精選課件13.7創建和讀取復雜電子郵件javax.mail.Message抽象類表示郵件,它的具體子類為javax.mail.MimeMessage類,它提供了讀取和設置郵件中各個部分的getXXX()和setXXX()方法:setSubject(Stringsubject)方法設置郵件的主題。setHeader(Stringname,Stringvalue)方法設置郵件頭部的某一項。setContent(Objecto,Stringtype)方法設置郵件的正文。NetworkProgramming精選課件13.7.1郵件地址javax.mail.Address抽象類表示郵件地址,它的最常用的子類是javax.mail.InternetAddress類。InternetAddress類表示Internet網上通用的郵件地址,形式為admin@,或者“Admin<admin@>”。InternetAddress類提供了一系列get和set方法,用來讀取和設置address、personal和charset等屬性,例如:getAddress():讀取address屬性。getPersonal():讀取personal屬性。setAddress(Stringaddress):設置address屬性。setPersonal(Stringpersonal):設置personal屬性。NetworkProgramming精選課件13.7.1郵件地址以下兩段代碼是等價的:InternetAddressaddr=newInternetAddress("admin@","Admin");或者:InternetAddressaddr=newInternetAddress();addr.setAddress("admin@");addr.setPersonal("Admin");NetworkProgramming精選課件13.7.1郵件地址MimeMessage類的以下方法用于讀取或設置郵件中的地址信息:Address[]getFrom():讀取發送者的郵件地址。Address[]getRecipients(Message.RecipientTypetype):讀取特定接收類型的郵件地址。voidsetFrom(Addressaddress):設置發送者的郵件地址。voidsetRecipients(Message.RecipientTypetype,Address[]addresses):設置特定接收類型的郵件地址,參數addresses指定多個接收地址。voidsetRecipients(Message.RecipientTypetype,Stringaddresses):設置特定接收類型的郵件地址,參數addresses指定一個接收地址。NetworkProgramming精選課件13.7.1郵件地址Message.RecipientType類型的靜態常量表示地址類型,包括:Message.RecipientType.TO:主接收地址。Message.RecipientType.CC:抄送地址。Message.RecipientType.BCC:廣播地址。NetworkProgramming精選課件13.7.1郵件地址以下程序代碼設置了郵件的各項郵件地址: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);NetworkProgramming精選課件13.7.2郵件頭部MimeMessage類的以下getXXX()和setXXX()方法用于讀取和設置郵件頭部的特定項:String[]getHeader(Stringname)voidsetHeader(Stringname,Stringvalue)以下兩段代碼的作用是等價的,它們的作用都是設置郵件的主題:msg.setHeader("subject","hello");或者:msg.setSubject("hello");NetworkProgramming精選課件13.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());}NetworkProgramming精選課件13.7.3郵件標記多數接收郵件服務器允許郵件包含特定的標記信息,這些標記可以使用戶更方便的管理郵件。JavaMailAPI用javax.mail.Flags類的Flags.Flag內部類的靜態實例來表示標記:Flags.Flag.ANSWERED:表示郵件已經回復。該標記由客戶程序設置。Flags.Flag.DELETED:表示郵件已經被刪除。該標記由客戶程序設置。Flags.Flag.RECENT:表示剛剛被添加到郵件夾的郵件,即最近一次打開郵件夾時,被添加到郵件夾的郵件。該標記由Folder類的實現來設置,客戶程序只能讀取該標記。NetworkProgramming精選課件13.7.3郵件標記Flags.Flag.FLAGGED:表示郵件已經作了某種標記。客戶程序可以設置該標記。Flags.Flag.SEEN:表示郵件已經被閱讀。該標記由JavaMailAPI的實現來設置。當客戶程序調用了郵件的getContent()方法時,該郵件被加上Flags.Flag.SEEN標記。客戶程序可以修改這個標記。Flags.Flag.DRAFT:表示郵件是草稿。該標記由客戶程序設置。Flags.Flag.USER:表示郵件所在的郵件夾支持用戶自定義的標記。該標記由接收郵件服務器設置,客戶程序只能讀取該標記。客戶程序可以通過folder.getPermanentFlags().contains(Flags.Flag.USER)方法判斷郵件夾是否支持用戶自定義的標記。NetworkProgramming精選課件13.7.3郵件標記MimeMessage類提供了三個與標記有關的方法:voidsetFlags(Flagsflags,booleanset):設置或取消一組標記。voidsetFlags(Flags.Flag,booleanset):設置或取消特定標記。booleanisSet(Flags.Flagflag):察看是否設置了某個標記。NetworkProgramming精選課件13.7.3郵件標記以下兩段程序代碼是等價的,它們的作用都是為一個郵件設置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);NetworkProgramming精選課件13.7.3郵件標記如果郵件所在的郵件夾支持用戶標記,還可以通過以下方式為郵件加上具有特殊含義的用戶標記:Flagsflags=newFlags();flags.add("privateemail");flags.add("abouttravelling");msg.setFlags(flags,true);//表示這是一封關于旅游的私人信件NetworkProgrammingNetworkProgramming精選課件13.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");NetworkProgramming精選課件13.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]);}}NetworkProgramming精選課件13.7.4郵件正文郵件正文是郵件中最復雜的一部分,正文可以是純文本,還可以包括若干附件。JavaMailAPI把郵件正文的各個組成部分以及整個郵件都抽象為部件,部件用javax.mail.Part接口表示。一個Part對象和一個DataHandler對象關聯,DataHandler對象負責處理部件包含的數據。Part接口有兩個子接口:MimePart接口和BodyPart接口。MimePart接口表示符合MIME規范的部件。BodyPart接口表示可以作為郵件正文的組成部分的部件。NetworkProgramming精選課件13.7.4郵件正文Part接口及其相關類的類框圖

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

NetworkProgrammingNetworkProgramming精選課件13.7.4郵件正文例程MailClientSendAttach.javaimportjavax.mail.*;importernet.*;importjavax.activation.*;importjava.util.*;publicclassMailClientSendAttachextendsMailClientForCitiz{privateStringfromAddr="java_mail@";//發送者地址privateStringtoAddr="java_mail@";//接收者地址

NetworkProgrammingNetworkProgramming精選課件13.7.4郵件正文publicvoidsendMessage(StringfromAddr,StringtoAddr)throwsException{

//創建一個郵件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));NetworkProgramming精選課件13.7.4郵件正文Stringattch1="attch1.rar";Stringattch2="attch2.rar";Multipartmultipart=newMimeMultipart();

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

NetworkProgramming精選課件13.7.4郵件正文//加入第一個附件MimeBodyPartmimeBodyPart2=newMimeBodyPart();FileDataSourcefds=newFileDataSource(attch1);//得到數據源

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

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

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

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

NetworkProgramming精選課件13.7.5郵件接收(處理郵件頭部)

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

NetworkProgramming精選課件13.7.5郵件接收(郵件正文)附件的獲取:從消息中獲取附件比發送它們棘手些,因為

MIME

沒有簡單的關于附件的概念。當消息包含附件時,消息的內容是個

Multipart

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

Part,獲取主要內容和附件。標有從

part.getDisposition()

獲得的

Part.ATTACHMENT

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

MIME

類型)和帶Part.INLINE

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

Part.ATTACHMENT,要么是

Part.INLINE

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

getFileName()

getInputStream()

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

NetworkProgramming精選課件13.7.5郵件接收(郵件正文)

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

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);

NetworkProgramming精選課件13.7.5郵件接收(郵件正文)

if((disposition!=null)&&

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

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

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

}}

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

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

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

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

NetworkProgramming精選課件使用Socket發送電子郵件(3)SMTP應答SMTP服務器收到命令后,返回給SMTP客戶的信息,稱為SMTP應答。客戶每次發送一條SMTP命令后,服務器給客戶返回一條響應。SMTP規定了23種響應碼。SMTP應答都是以一個響應碼開頭,后面接著響應的描述信息,如果SMTP服務器不一樣,響應的描述信息可能不一樣,SMTP應答的一般格式是:響應碼響應的文本描述信息其中,響應碼為3位數字,與描述信息文本之間有一個空格,

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

NetworkProgramming精選課件使用Socket發送電子郵件(5)空操作命令格式:NOOP<CRLF>(6)驗證電子信箱是否合法命令格式:VRFY電子信箱地址<CRLF>(7)復位SMTP服務器命令格式:RSET<CRLF>(8)請求服務器發回幫助信息命令格式:HELP<CRLF>或者HELP命令關鍵字<CRLF>(9)退出會話命令格式:QUIT<CRLF>NetworkProgramming精選課件使用Socket發送電子郵件3、常用的SMTP響應碼211系統狀態或系統幫助應答。214幫助信息220服務就緒。221服務器關閉傳輸通道。250請求的郵件操作已經完成。251用戶不是本地的,將按照前向路徑(forwaed-path)發。354啟動郵件輸入,要求郵件文本要用<CRLF><CRLF>結束。421服務不可使用,關閉傳輸通道。450沒有執行請求的郵箱操作,因為信箱不可用。NetworkProgramming精選課件使用Socket發送電子郵件451請求的操作已經終止,因為在處理的過程中出現了錯誤。452請求的操作沒有發生,因為系統的存儲空間不夠,500語法錯誤,命令不可識別。501參數或變元中存在著語法錯誤。502命令不能實現。503錯誤的命令序列504命令的參數不能實現。550請求的操作不能發生,信箱不可用。551用戶不在本地,請嘗試發送到前向路徑(forwaed-path)。552請求的郵件操作終止,超出存儲分配。553請求的操作不能執行,因為信箱語法錯誤。554事務失敗。NetworkProgramming精選課件4、SMTP的會話過程SMTP客戶與SMTP服務器的會話過程分為三個階段,先舉例說明。以下每行前面的C代表SMTP客戶發送的命令,S代表服務器發回的響應。每行//后面的內容是注釋。C:HELOYE

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

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

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

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

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

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

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

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

S:1AAAA

溫馨提示

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

評論

0/150

提交評論