電子郵件的發(fā)送和接收[谷風(fēng)參考]

上傳人:8** 文檔編號(hào):79201952 上傳時(shí)間:2022-04-23 格式:PPT 頁數(shù):106 大小:1.33MB
收藏 版權(quán)申訴 舉報(bào) 下載
電子郵件的發(fā)送和接收[谷風(fēng)參考]_第1頁
第1頁 / 共106頁
電子郵件的發(fā)送和接收[谷風(fēng)參考]_第2頁
第2頁 / 共106頁
電子郵件的發(fā)送和接收[谷風(fēng)參考]_第3頁
第3頁 / 共106頁

下載文檔到電腦,查找使用更方便

12 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《電子郵件的發(fā)送和接收[谷風(fēng)參考]》由會(huì)員分享,可在線閱讀,更多相關(guān)《電子郵件的發(fā)送和接收[谷風(fēng)參考](106頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、第第13章章 電子郵件的發(fā)送和接收電子郵件的發(fā)送和接收電子郵件(電子郵件(electronic mail,簡(jiǎn)稱,簡(jiǎn)稱e-mail)是因特網(wǎng)上使用最多的一種應(yīng)用,它為用戶是因特網(wǎng)上使用最多的一種應(yīng)用,它為用戶在因特網(wǎng)上設(shè)立了存放郵件的電子郵箱,發(fā)在因特網(wǎng)上設(shè)立了存放郵件的電子郵箱,發(fā)信人可以隨時(shí)將電子郵件發(fā)送到收信人的電信人可以隨時(shí)將電子郵件發(fā)送到收信人的電子郵箱,收信人也可以隨時(shí)上網(wǎng)讀取,發(fā)信子郵箱,收信人也可以隨時(shí)上網(wǎng)讀取,發(fā)信人與收信人以異步的方式通信。人與收信人以異步的方式通信。Network Programming谷風(fēng)書苑谷風(fēng)書苑第第13章章 電子郵件的發(fā)送和接收電子郵件的發(fā)送和接收郵

2、件傳輸原理 1、電子郵件系統(tǒng)的構(gòu)成一個(gè)電子郵件系統(tǒng)包括三個(gè)主要的構(gòu)件,即用戶代理,郵件一個(gè)電子郵件系統(tǒng)包括三個(gè)主要的構(gòu)件,即用戶代理,郵件消息傳輸代理消息傳輸代理(郵件服務(wù)器),和電子郵件使用的協(xié)議。如,和電子郵件使用的協(xié)議。如圖所示:圖所示:Network Programming谷風(fēng)書苑谷風(fēng)書苑第第13章章 電子郵件的發(fā)送和接收電子郵件的發(fā)送和接收 2、 電子郵件系統(tǒng)的實(shí)現(xiàn)電子郵件系統(tǒng)的實(shí)現(xiàn)Network Programming谷風(fēng)書苑谷風(fēng)書苑13.1 E-mail協(xié)議簡(jiǎn)介協(xié)議簡(jiǎn)介郵件服務(wù)器按照提供的服務(wù)類型,可以分為發(fā)送郵件服務(wù)器(簡(jiǎn)稱發(fā)送服務(wù)器)和接收郵件服務(wù)器(簡(jiǎn)稱接收服務(wù)器)。n發(fā)送

3、郵件服務(wù)器使用郵件發(fā)送協(xié)議,現(xiàn)在常用的是SMTP,所以通常發(fā)送郵件服務(wù)器也稱為SMTP服務(wù)器;n接收郵件服務(wù)器使用接收郵件協(xié)議,常用的有POP3協(xié)議和IMAP協(xié)議,所以通常接收郵件服務(wù)器也稱為POP3服務(wù)器或IMAP服務(wù)器。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.1 .1SMTP協(xié)議簡(jiǎn)介協(xié)議簡(jiǎn)介 SMTP(Simple Mail Transfer Protocol),即簡(jiǎn)單郵件傳輸協(xié)議,是Internet傳送E-mail的基本協(xié)議,也是TCP/IP協(xié)議組的成員。nSMTP協(xié)議解決郵件系統(tǒng)如何通過一條鏈路,把郵件從一臺(tái)機(jī)器傳送到另一臺(tái)機(jī)器上的問題。nSMTP協(xié)議的特點(diǎn)是具有良

4、好的可伸縮性,這也是它成功的關(guān)鍵。它既適用于廣域網(wǎng),也適用于局域網(wǎng)。nSMTP協(xié)議由于非常簡(jiǎn)單,使得它得到了廣泛的運(yùn)用,在Internet上能夠發(fā)送郵件的服務(wù)器幾乎都支持SMTP協(xié)議。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.1 E-mail協(xié)議簡(jiǎn)介協(xié)議簡(jiǎn)介 Network Programming客戶機(jī)客戶機(jī)A客戶機(jī)客戶機(jī)Bemail服務(wù)器服務(wù)器ASMTP服務(wù)器服務(wù)器email服務(wù)器服務(wù)器BPOP3/IMAP服務(wù)器服務(wù)器internet1、SMTP傳輸傳輸2、SMTP-傳輸郵件傳輸郵件3、pop3/IMAP協(xié)議協(xié)議-接收閱讀接收閱讀谷風(fēng)書苑谷風(fēng)書苑13.1 .1SMTP協(xié)議簡(jiǎn)

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

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

7、Network Programming谷風(fēng)書苑谷風(fēng)書苑13.1.2 POP3協(xié)議簡(jiǎn)介協(xié)議簡(jiǎn)介 POP3(Post Office Protocol 3)即郵局協(xié)議的第3個(gè)版本,它是規(guī)定個(gè)人計(jì)算機(jī)如何連接到互聯(lián)網(wǎng)上的郵件服務(wù)器進(jìn)行收發(fā)郵件的協(xié)議。它是因特網(wǎng)電子郵件的第一個(gè)離線協(xié)議標(biāo)準(zhǔn),POP3協(xié)議允許用戶從服務(wù)器上把郵件存儲(chǔ)到本地主機(jī)(即自己的計(jì)算機(jī))上,同時(shí)根據(jù)客戶端的操作刪除或保存在郵件服務(wù)器上的郵件,而POP3服務(wù)器則是遵循POP3協(xié)議的接收郵件服務(wù)器,用來接收電子郵件的。POP3協(xié)議是TCP/IP協(xié)議族中的一員,,由RFC 1939 定義。本協(xié)議主要用于支持使用客戶端遠(yuǎn)程管理在服務(wù)器上的電

8、子郵件。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.1 .3 IMAP協(xié)議簡(jiǎn)介協(xié)議簡(jiǎn)介 Internet Mail Access Protocol互聯(lián)網(wǎng)郵件訪問協(xié)議。IMAP協(xié)議它的主要作用是郵件客戶端(例如MS Outlook Express)可以通過這種協(xié)議從郵件服務(wù)器上獲取郵件的信息,下載郵件等。它與POP3協(xié)議的主要區(qū)別是主要區(qū)別是用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對(duì)服務(wù)器上的郵件進(jìn)行操作。用戶可以通過瀏覽信件頭來決定是否收取、刪除和檢索郵件的特定部分,還可以在服務(wù)器上創(chuàng)建或更改文件夾或郵箱,它除了支持POP3協(xié)議的脫機(jī)操作模式外,還支持聯(lián)機(jī)操作和斷連

9、接操作。它為用戶提供了有選擇的從郵件服務(wù)器接收郵件的功能、基于服務(wù)器的信息處理功能和共享信箱功能。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.1.4 MIME簡(jiǎn)介簡(jiǎn)介nMIME(Multipurpose Internet Mail Extensions,多用途Internet郵件擴(kuò)充標(biāo)準(zhǔn))不是郵件傳輸協(xié)議,而是對(duì)郵件格式所作的規(guī)范。它擴(kuò)展了電子郵件標(biāo)準(zhǔn),使其能夠支持非ASCII字符、二進(jìn)制格式附件等多種格式的郵件消息。nMIME規(guī)定了用于表示各種各樣的數(shù)據(jù)類型的符號(hào)化方法。MIME是通過標(biāo)準(zhǔn)化電子郵件報(bào)文的頭部的附加領(lǐng)域(fields)而實(shí)現(xiàn)的;這些頭部的附加領(lǐng)域,描述新的報(bào)文

10、類型的內(nèi)容和組織形式。 Network Programming谷風(fēng)書苑谷風(fēng)書苑13.1.4 MIME簡(jiǎn)介簡(jiǎn)介Network Programming谷風(fēng)書苑谷風(fēng)書苑13.1.4 MIME簡(jiǎn)介簡(jiǎn)介內(nèi)容類型(Content-Type),這個(gè)頭部領(lǐng)域用于指定消息的類型type有下面的形式。Text:用于標(biāo)準(zhǔn)化地表示的文本信息,文本消息可以是多種字符集和或者多種格式的;Multipart:用于連接消息體的多個(gè)部分構(gòu)成一個(gè)消息,這些部分可以是不同類型的數(shù)據(jù);Application:用于傳輸應(yīng)用程序數(shù)據(jù)或者二進(jìn)制數(shù)據(jù);Message:用于包裝一個(gè)E-mail消息;Image:用于傳輸靜態(tài)圖片數(shù)據(jù);Audio

11、:用于傳輸音頻或者音聲數(shù)據(jù);Video:用于傳輸動(dòng)態(tài)影像數(shù)據(jù),可以是與音頻編輯在一起的視頻數(shù)據(jù)格式。 Network Programming谷風(fēng)書苑谷風(fēng)書苑13.2 JavaMail API簡(jiǎn)介簡(jiǎn)介 SUN公司制定了JavaMail API,它封裝了按照各種郵件通信協(xié)議,如IMAP、POP3和SMTP,與郵件服務(wù)器通信的細(xì)節(jié),為Java應(yīng)用程序提供了收發(fā)電子郵件的公共接口,參見圖Network Programming谷風(fēng)書苑谷風(fēng)書苑13.2 JavaMail API簡(jiǎn)介簡(jiǎn)介 JavaMail API主要位于javax.mail包和javax.mail.internet中,圖為其中主要類的類框圖

12、。 Network Programming谷風(fēng)書苑谷風(fēng)書苑13.2 JavaMail API簡(jiǎn)介簡(jiǎn)介 1. javax.mail.Session類:表示郵件會(huì)話,是JavaMail API的最高層入口類。nSession類定義了基本的郵件會(huì)話。就像Http會(huì)話那樣,我們進(jìn)行收發(fā)郵件的工作都是基于這個(gè)會(huì)話的。Session對(duì)象利用了java.util.Properties對(duì)象獲得了郵件服務(wù)器、用戶名、密碼信息和整個(gè)應(yīng)用程序都要使用到的共享信息。nSession類的構(gòu)造方法是私有的,所以我們可以使用Session類提供的getDefaultInstance()這個(gè)靜態(tài)工廠方法獲得一個(gè)默認(rèn)的Sess

13、ion對(duì)象:Properties props = new Properties();Session session = Session.getDefaultInstance(props, null);Network Programming谷風(fēng)書苑谷風(fēng)書苑13.2 JavaMail API簡(jiǎn)介簡(jiǎn)介 2、javax.mail.Store類:表示接收郵件服務(wù)器上的注冊(cè)用戶的存儲(chǔ)空間,通過Store類的getFolder()方法,可以訪問用戶的特定郵件夾。通過javax.mail.Store類可以訪問javax.mail.Folder類。我們需要從Session中獲取特定類型的Store,然后連接到

14、Store,在連接Store的過程中,極有可能需要用到用戶名、密碼或者Authenticator。Store store = session.getStore(imap);Store store = session.getStore(pop3);store.connect(host, username, password); Network Programming谷風(fēng)書苑谷風(fēng)書苑13.2 JavaMail API簡(jiǎn)介簡(jiǎn)介 3、javax.mail.Folder類代表郵件夾,郵件都放在郵件夾中,F(xiàn)older提供了管理郵件夾及郵件的各種方法在連接到Store后,一個(gè)Folder對(duì)象即目錄對(duì)象將通過

15、Store的getFolder()方法被返回,我們可從這個(gè)Folder中讀取郵件信息:Folder folder = store.getFolder(INBOX);folder.open(Folder.READ_ONLY);Network Programming谷風(fēng)書苑谷風(fēng)書苑13.2 JavaMail API簡(jiǎn)介簡(jiǎn)介 4、javax.mail.Message類代表電子郵件,封裝了實(shí)際email消息的所有細(xì)節(jié),如標(biāo)題、發(fā)送/接收地址、發(fā)送日期等,提供了讀取和設(shè)置郵件內(nèi)容的方法。Message是一 個(gè)抽象類,大多數(shù)情況下,我們使用javax.mail.internet.MimeMessage這個(gè)

16、子類,該類是使用MIME類型、MIME信息頭的 郵箱信息。為了建立一個(gè)MimeMessage對(duì)象,我們必須將Session對(duì)象作為MimeMessage構(gòu)造方法的參數(shù)傳入:MimeMessage message = new MimeMessage(session);message.setFrom(new InternetAddress(from);message.addRecipient(Message.RecipientType.TO, new InternetAddress(to);message.setSubject(Hello JavaMail);message.setText(Wel

17、come to JavaMail);Network Programming谷風(fēng)書苑谷風(fēng)書苑13.2 JavaMail API簡(jiǎn)介簡(jiǎn)介 5、javax.mail.Address類:郵件地址類,像Message一樣,Address類也是一個(gè)抽象類,所以我們將使用javax.mail.internet.InternetAddress這個(gè)子類。通過傳入代表郵件地址的字符串,我們可以建立一個(gè)郵件地址類:Address address = new InternetAddress(presidentwhitehouse.gov); Network Programming谷風(fēng)書苑谷風(fēng)書苑13.2 JavaMa

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

19、ng谷風(fēng)書苑谷風(fēng)書苑13.2 JavaMail API簡(jiǎn)介簡(jiǎn)介 7、 javax.mail.Authenticator類:像 類那樣,JavaMail API通過使用授權(quán)者類(Authenticator是一個(gè)抽象類)以用戶名、密碼的方式訪問那些受到保護(hù)的資源,在這里“資源”就是指郵件服務(wù)器。下面代碼片斷中的MyAuthenticator就是一個(gè)Authenticator的子類。Properties props = new Properties();Authenticator auth = new MyAuthenticator();Session session = Session.getDe

20、faultInstance(props, auth);Network Programming谷風(fēng)書苑谷風(fēng)書苑13.3 建立建立JavaMail應(yīng)用程序的開發(fā)環(huán)境應(yīng)用程序的開發(fā)環(huán)境 JDK中并不包含JavaMail API。為了開發(fā)JavaMail應(yīng)用程序,需要從SUN公司的網(wǎng)站下載JavaMail API及其實(shí)現(xiàn)的類庫,該類庫由兩個(gè)JAR文件組成: mail.jar和activation.jar。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.3 建立建立JavaMail應(yīng)用程序的開發(fā)環(huán)境應(yīng)用程序的開發(fā)環(huán)境1安裝JavaMail為了使用JavaMail API,需要從http:/

21、安裝了JavaMail之后,我們還需要安裝JavaBeans Activation Framework,因?yàn)檫@個(gè)框架是JavaMail API所需要的。如果我們使用J2EE的話,那么我們并無需單獨(dú)下載JavaMail,因?yàn)樗嬖谟贘2EE.jar中,只需將J2EE.jar加入到 CLASSPATH即可Network Programming谷風(fēng)書苑谷風(fēng)書苑13.3 建立建立JavaMail應(yīng)用程序的開發(fā)環(huán)境應(yīng)用程序的開發(fā)環(huán)境2安裝JavaBeans Activation Framework從http:/ 載JavaBeans Activation Framework,并將其添加到CLASSPAT

22、H中。此框架增加了對(duì)任何數(shù)據(jù)塊的分類、以及對(duì)它們的處理的特性。這些特性是JavaMail API需要的。雖然聽起來這些特性非常模糊,但是它對(duì)于我們的JavaMail API來說只是提供了基本的MIME類型支持。到此為止,我們應(yīng)當(dāng)把mail.jar和activation.jar都添加到了CLASSPATH中。當(dāng)然如果從方便的角度講,直接把這兩個(gè)Jar文件復(fù)制到JRE目錄的lib/ext目錄中也可以。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.4 創(chuàng)建創(chuàng)建JavaMail應(yīng)用程序應(yīng)用程序JavaMail應(yīng)用程序在初始化過程中需要執(zhí)行如下步驟。步驟(1)設(shè)置JavaMail屬性: P

23、roperties props = new Properties();props.put(“mail.transport.protocol”, “smtp”);/指定郵件發(fā)送協(xié)議props.put(mail.store.protocol, 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é)議的S

24、tore具體類,允許由第三方提供。props.put(mail.smtp.host, hostname); /指定采用SMTP協(xié)議的郵件發(fā)送服務(wù)器的IP地址或主機(jī)名。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.4 創(chuàng)建創(chuàng)建JavaMail應(yīng)用程序應(yīng)用程序n步驟(2)調(diào)用javax.mail.Session類的靜態(tài)方法Session.getDefaultInstance()獲得Session實(shí)例,該方法根據(jù)已經(jīng)配置的JavaMail屬性來創(chuàng)建Session實(shí)例:Session mailsession = Session.getDefaultInstance(props);n步驟(

25、3)調(diào)用Session的getStore(String protocol)方法來獲得Store對(duì)象,參數(shù)protocol指定接收郵件協(xié)議:Store store = mailsession.getStore(imap); 步驟(1)把mail.imap.class屬性設(shè)為com.sun.mail.imap.IMAPStore,因此以上getStore()方法返回com.sun.mail.imap.IMAPStore類的實(shí)例。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.4 創(chuàng)建創(chuàng)建JavaMail應(yīng)用程序應(yīng)用程序 步驟(4)調(diào)用Store對(duì)象的connect()方法連接到接收郵件

26、服務(wù)器。調(diào)用connect()方法時(shí),應(yīng)該指定接收郵件服務(wù)器的主機(jī)名或IP地址、用戶名和口令。 store.connect(hostname,username, password);Network Programming谷風(fēng)書苑谷風(fēng)書苑13.4 創(chuàng)建創(chuàng)建JavaMail應(yīng)用程序應(yīng)用程序獲得了Store對(duì)象后,就可以通過它來訪問郵件服務(wù)器上的特定郵件用戶了。通常會(huì)對(duì)郵件用戶執(zhí)行以下操作。操作(一)創(chuàng)建并發(fā)送郵件:/創(chuàng)建郵件msg = new MimeMessage(mailsession);InternetAddress toAddrs =InternetAddress.parse(, fals

27、e);/設(shè)置郵件接收者 msg.setRecipients(Message.RecipientType.TO, toAddrs);/設(shè)置郵件的主題msg.setSubject(hello);Network Programming谷風(fēng)書苑谷風(fēng)書苑13.4 創(chuàng)建創(chuàng)建JavaMail應(yīng)用程序應(yīng)用程序/設(shè)置郵件的發(fā)送者msg.setFrom(new InternetAddress();/設(shè)置郵件的正文msg.setText(How are you);/發(fā)送郵件Transport.send(msg);Transport的靜態(tài)方法send(Message)負(fù)責(zé)發(fā)送郵件服務(wù)器,郵件發(fā)送協(xié)議由mail.tra

28、nsport.protocol屬性指定,郵件發(fā)送服務(wù)器由mail.smtp.host屬性指定。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.4 創(chuàng)建創(chuàng)建JavaMail應(yīng)用程序應(yīng)用程序操作(二)打開inbox郵件夾收取郵件:/獲得名為“inbox”的郵件夾Folder folder=store.getFolder(inbox);/打開郵件夾folder.open(Folder.READ_ONLY);/獲得郵件夾中的郵件數(shù)目System.out.println(You have +folder.getMessageCount()+ messages in inbox.);/獲得郵件

29、夾中的未讀郵件數(shù)目System.out.println(You have +folder.getUnreadMessageCount()+ unread messages in inbox.);在IMAP協(xié)議中,inbox郵件夾是郵件用戶的保留郵件夾,用戶不允許刪除該郵件夾,郵件服務(wù)器把所有接收到的新郵件都存在該郵件夾中。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.4 創(chuàng)建創(chuàng)建JavaMail應(yīng)用程序應(yīng)用程序操作(三)從郵件夾中讀取郵件:/從郵件夾中讀取第一封郵件Message msg=folder.getMessage(1);System.out.println(-the f

30、irst message in inbox-);/獲得郵件的發(fā)送者、主題和正文System.out.println(From:+msg.getFrom()0);System.out.println(Subject:+msg.getSubject();System.out.println(Text:+msg.getText();Network Programming谷風(fēng)書苑谷風(fēng)書苑13.5 身份驗(yàn)證身份驗(yàn)證n在實(shí)際應(yīng)用中,往往希望在連接郵件服務(wù)器時(shí),彈出一個(gè)對(duì)話框,提示用戶輸入用戶名和口令。n為了達(dá)到這一效果,需要按照以下步驟創(chuàng)建和使用javax.mail.Authenticator類:n(1)

31、創(chuàng)建一個(gè)javax.mail.Authenticator類的子類(假定名為MailAuthenticator),實(shí)現(xiàn)getPasswordAuthentication()方法。n(2)創(chuàng)建MailAuthenticator對(duì)象,并且把它作為參數(shù)傳給Session的getDefaultInstance()方法:Authenticator ma=new MailAuthenticator();Session session = Session.getDefaultInstance(props,ma);n(3)連接到接收郵件服務(wù)器時(shí),把用戶名和口令設(shè)為null: store.connect(rece

32、iveHost,null, null);Network Programming谷風(fēng)書苑谷風(fēng)書苑13.5 身份驗(yàn)證身份驗(yàn)證Network Programming谷風(fēng)書苑谷風(fēng)書苑13.6 URLName類類njavax.mail.URLName類表示URL的名字,URLName類與.URL類的區(qū)別在于:nURLName類不嘗試連接目標(biāo)地址。構(gòu)造URLName對(duì)象時(shí),無需指定協(xié)議處理器。nURLName類可以表示非標(biāo)準(zhǔn)的URL地址。比如URLName對(duì)象可以表示接收郵件服務(wù)器上的特定郵件夾,形式為: 協(xié)議名:/用戶名:口令主機(jī):端口/郵件夾Network Programming谷風(fēng)書苑谷風(fēng)書苑13.

33、6 URLName類類nURLName類中包括以下getXXX()方法:ngetProtocol():獲得URL名字中的協(xié)議。ngetHost():獲得URL名字中的主機(jī)。ngetUsername():獲得URL名字中的用戶名。ngetPassword():獲得URL名字中的口令。ngetFile():獲得URL名字中的文件名或者郵件夾名Network Programming谷風(fēng)書苑谷風(fēng)書苑13.6 URLName類類nURLName類中包括以下getXXX()方法:ngetProtocol():獲得URL名字中的協(xié)議。ngetHost():獲得URL名字中的主機(jī)。ngetUsername()

34、:獲得URL名字中的用戶名。ngetPassword():獲得URL名字中的口令。ngetFile():獲得URL名字中的文件名或者郵件夾名。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.6 URLName類類n例程14-5的MailClientURLName類的init(URLName urlName)方法從一個(gè)URLName對(duì)象中獲取連接到接收郵件服務(wù)器的各種信息。這個(gè)URLName對(duì)象表示的URL名字為:imap:/admin:1234localhost/public void init(URLName urlName)throws Exception receivePro

35、tocol=urlName.getProtocol(); receiveHost=urlName.getHost(); username=urlName.getUsername(); password=urlName.getPassword(); Network Programming谷風(fēng)書苑谷風(fēng)書苑13.6 URLName類類 /設(shè)置屬性 Properties props = new Properties(); props.put(mail.smtp.host, sendHost); /創(chuàng)建Session對(duì)象 session = Session.getDefaultInstance(prop

36、s); /創(chuàng)建Store對(duì)象 store = session.getStore(receiveProtocol); /連接到郵件服務(wù)器 store.connect(receiveHost,username,password); Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7 創(chuàng)建和讀取復(fù)雜電子郵件創(chuàng)建和讀取復(fù)雜電子郵件如圖所示,按照MIME規(guī)范,電子郵件包括郵件頭和正文兩部分。郵件頭中包括日期、發(fā)送者地址、接收者地址和主題等信息。正文部分可以包括普通文本內(nèi)容,還可以包括一個(gè)或多個(gè)附件。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7 創(chuàng)建和讀取復(fù)雜電子郵件創(chuàng)建和讀

37、取復(fù)雜電子郵件njavax.mail.Message抽象類表示郵件,它的具體子類為javax.mail.MimeMessage類,它提供了讀取和設(shè)置郵件中各個(gè)部分的getXXX()和setXXX()方法:nsetSubject(String subject)方法設(shè)置郵件的主題。nsetHeader(String name, String value)方法設(shè)置郵件頭部的某一項(xiàng)。nsetContent(Object o, String type)方法設(shè)置郵件的正文。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7 .1郵件地址郵件地址njavax.mail.Address抽象類表示郵

38、件地址,它的最常用的子類是javax.mail.InternetAddress類。nInternetAddress類表示Internet網(wǎng)上通用的郵件地址,形式為,或者“Admin”。nInternetAddress類提供了一系列g(shù)et和set方法,用來讀取和設(shè)置address、personal和charset等屬性,例如:ngetAddress():讀取address屬性。ngetPersonal():讀取personal屬性。nsetAddress(String address):設(shè)置address屬性。nsetPersonal(String personal):設(shè)置personal屬性。

39、Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7 .1郵件地址郵件地址n以下兩段代碼是等價(jià)的:InternetAddress addr= new InternetAddress(,Admin);或者:InternetAddress addr=new InternetAddress();addr.setAddress();addr.setPersonal(Admin);Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7 .1郵件地址郵件地址nMimeMessage類的以下方法用于讀取或設(shè)置郵件中的地址信息:nAddress getFrom():讀取發(fā)送者的郵件地址。nA

40、ddress getRecipients(Message.RecipientType type):讀取特定接收類型的郵件地址。nvoid setFrom(Address address):設(shè)置發(fā)送者的郵件地址。nvoid setRecipients(Message.RecipientType type, Address addresses):設(shè)置特定接收類型的郵件地址,參數(shù)addresses指定多個(gè)接收地址。nvoid setRecipients(Message.RecipientType type, String addresses) : 設(shè)置特定接收類型的郵件地址,參數(shù)addresses指

41、定一個(gè)接收地址。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7 .1郵件地址郵件地址nMessage.RecipientType 類型的靜態(tài)常量表示地址類型,包括:nMessage.RecipientType.TO:主接收地址。nMessage.RecipientType.CC:抄送地址。nMessage.RecipientType.BCC:廣播地址。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7 .1郵件地址郵件地址n以下程序代碼設(shè)置了郵件的各項(xiàng)郵件地址:MimeMessage msg=new MimeMessage(session);InternetAddr

42、ess from= new InternetAddress();InternetAddress to =InternetAddress.parse(,java_);InternetAddress cc= new InternetAddress(linda_);InternetAddress bcc =InternetAddress.parse(,);msg.setFrom(from);msg.setRecipients(Message.RecipientType.TO, to);msg.setRecipients(Message.RecipientType.CC, cc);msg.setRec

43、ipients(Message.RecipientType.BCC, bcc);Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.2 郵件頭部郵件頭部nMimeMessage類的以下getXXX()和setXXX()方法用于讀取和設(shè)置郵件頭部的特定項(xiàng):nString getHeader(String name) nvoid setHeader(String name, String value)n以下兩段代碼的作用是等價(jià)的,它們的作用都是設(shè)置郵件的主題:msg.setHeader(subject,hello);或者:msg.setSubject(hello);Network Pr

44、ogramming谷風(fēng)書苑谷風(fēng)書苑13.7.2 郵件頭部郵件頭部nMimeMessage類的getAllHeaders()方法返回一個(gè)包含Header對(duì)象的Enumeration對(duì)象,每個(gè)Header對(duì)象表示郵件頭部的一項(xiàng)。n以下程序代碼遍歷郵件頭部的所有項(xiàng):for(Enumeration e=msg.getAllHeaders(); e.hasMoreElements();) Header header=e.nextElement(); System.out.println(header.getName()+:“ +header.getValue();Network Programming谷

45、風(fēng)書苑谷風(fēng)書苑13.7.3 郵件標(biāo)記郵件標(biāo)記n多數(shù)接收郵件服務(wù)器允許郵件包含特定的標(biāo)記信息,這些標(biāo)記可以使用戶更方便的管理郵件。nJavaMail API用javax.mail.Flags類的Flags.Flag內(nèi)部類的靜態(tài)實(shí)例來表示標(biāo)記:nFlags.Flag.ANSWERED:表示郵件已經(jīng)回復(fù)。該標(biāo)記由客戶程序設(shè)置。nFlags.Flag.DELETED:表示郵件已經(jīng)被刪除。該標(biāo)記由客戶程序設(shè)置。nFlags.Flag.RECENT:表示剛剛被添加到郵件夾的郵件,即最近一次打開郵件夾時(shí),被添加到郵件夾的郵件。該標(biāo)記由Folder類的實(shí)現(xiàn)來設(shè)置,客戶程序只能讀取該標(biāo)記。Network Pro

46、gramming谷風(fēng)書苑谷風(fēng)書苑13.7.3 郵件標(biāo)記郵件標(biāo)記nFlags.Flag.FLAGGED:表示郵件已經(jīng)作了某種標(biāo)記??蛻舫绦蚩梢栽O(shè)置該標(biāo)記。nFlags.Flag.SEEN:表示郵件已經(jīng)被閱讀。該標(biāo)記由JavaMail API的實(shí)現(xiàn)來設(shè)置。當(dāng)客戶程序調(diào)用了郵件的getContent()方法時(shí),該郵件被加上Flags.Flag.SEEN標(biāo)記。客戶程序可以修改這個(gè)標(biāo)記。nFlags.Flag.DRAFT:表示郵件是草稿。該標(biāo)記由客戶程序設(shè)置。nFlags.Flag.USER:表示郵件所在的郵件夾支持用戶自定義的標(biāo)記。該標(biāo)記由接收郵件服務(wù)器設(shè)置,客戶程序只能讀取該標(biāo)記??蛻舫绦蚩梢酝ㄟ^f

47、older.getPermanentFlags().contains(Flags.Flag.USER)方法判斷郵件夾是否支持用戶自定義的標(biāo)記。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.3 郵件標(biāo)記郵件標(biāo)記nMimeMessage類提供了三個(gè)與標(biāo)記有關(guān)的方法:nvoid setFlags(Flags flags,boolean set):設(shè)置或取消一組標(biāo)記。nvoid setFlags(Flags.Flag,boolean set):設(shè)置或取消特定標(biāo)記。nboolean isSet(Flags.Flag flag):察看是否設(shè)置了某個(gè)標(biāo)記。Network Programmi

48、ng谷風(fēng)書苑谷風(fēng)書苑13.7.3 郵件標(biāo)記郵件標(biāo)記n以下兩段程序代碼是等價(jià)的,它們的作用都是為一個(gè)郵件設(shè)置SEEN和ANSWERED標(biāo)記:Flags flags=new Flags();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);Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.3 郵件標(biāo)記郵件標(biāo)記n如果郵

49、件所在的郵件夾支持用戶標(biāo)記,還可以通過以下方式為郵件加上具有特殊含義的用戶標(biāo)記:Flags flags=new Flags();flags.add(private email);flags.add(about travelling);msg.setFlags(flags,true); /表示這是一封關(guān)于旅游的私人信件Network ProgrammingNetwork Programming谷風(fēng)書苑谷風(fēng)書苑13.7.3 郵件標(biāo)記郵件標(biāo)記n以下程序代碼察看郵件的所有標(biāo)記:if(msg.isSet(Flags.Flag.DELETED) System.out.println(DELETED);el

50、se if(msg.isSet(Flags.Flag.SEEN) System.out.println(SEEN);else if(msg.isSet(Flags.Flag.ANSWERED) System.out.println(ANSWERED);else if(msg.isSet(Flags.Flag.RECENT) System.out.println(RECENT);Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.3 郵件標(biāo)記郵件標(biāo)記else if(msg.isSet(Flags.Flag.DRAFT) System.out.println(DRAFT);else i

51、f(msg.isSet(Flags.Flag.FLAGGED) System.out.println(FLAGGED);else if(msg.isSet( Flags.Flag.USER) /讀取用戶標(biāo)記 String userFlags=msg.getFlags().getUserFlags(); for(int i=0;iuserFlags.length;i+) System.out.println(User Flag:+userFlagsi); Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.4 郵件正文郵件正文n郵件正文是郵件中最復(fù)雜的一部分,正文可以是純文本,還可以

52、包括若干附件。nJavaMail API把郵件正文的各個(gè)組成部分以及整個(gè)郵件都抽象為部件,部件用javax.mail.Part接口表示。n一個(gè)Part對(duì)象和一個(gè)DataHandler對(duì)象關(guān)聯(lián),DataHandler對(duì)象負(fù)責(zé)處理部件包含的數(shù)據(jù)。nPart接口有兩個(gè)子接口:MimePart接口和BodyPart接口。nMimePart接口表示符合MIME規(guī)范的部件。nBodyPart接口表示可以作為郵件正文的組成部分的部件。Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.4 郵件正文郵件正文MimePartMessagePartDataHandlerMimeMessageMimeM

53、ultipartMimeBodyPartMultipartBodyPartPart接口及其相關(guān)類的類框圖 Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.4 郵件正文郵件正文nMimeBodyPart類實(shí)現(xiàn)了MimePart接口和BodyPart接口,因此MimeBodyPart對(duì)象可以作為MimeMessage的正文的組成部分。nMimeMessag類的以下三個(gè)方法都用于設(shè)置正文:nvoid setText(Strint txt)nvoid setContent(Object o,String type)nvoid setContent(Multipart mp)Networ

54、k Programming谷風(fēng)書苑谷風(fēng)書苑13.7.4 郵件正文郵件正文n如果MimeMessage僅包含純文本內(nèi)容,可以通過以下兩種方式設(shè)置郵件正文:msg.setText(How are you);或者msg.setContent(How are you,text/plain);n如果MimeMessage的正文包括多個(gè)組成部分,既有純文本內(nèi)容,還有若干附件,那就應(yīng)該先創(chuàng)建一個(gè)包含正文的各個(gè)組成部分的MimeMultipart對(duì)象,然后調(diào)用msg.setContent(Multipart mp)方法,把MimeMultipart對(duì)象作為郵件的正文。Network Programming谷風(fēng)

55、書苑谷風(fēng)書苑13.7.4 郵件正文郵件正文n例程的MailClientSendAttach類創(chuàng)建了一個(gè)包括附件的郵件,然后發(fā)送該郵件。n這封郵件的正文包括三個(gè)組成部分,分別用三個(gè)MimeBodyPart對(duì)象來表示。第一個(gè)MimeBodyPart對(duì)象表示郵件的純文本內(nèi)容,其他兩個(gè)MimeBodyPart對(duì)象分別表示兩個(gè)附件。這些MimeBodyPart對(duì)象都加入到一個(gè)MimeMultipart對(duì)象中。 Network ProgrammingNetwork Programming谷風(fēng)書苑谷風(fēng)書苑13.7.4 郵件正文郵件正文例程 MailClientSendAttach.javaimport ja

56、vax.mail.*;import javax.mail.internet.*;import javax.activation.*;import java.util.*;public class MailClientSendAttach extends MailClientForCitiz private String fromAddr=java_; /發(fā)送者地址 private String toAddr=java_; /接收者地址 Network ProgrammingNetwork Programming谷風(fēng)書苑谷風(fēng)書苑13.7.4 郵件正文郵件正文 public void sendMe

57、ssage(String fromAddr,String toAddr) throws Exception /創(chuàng)建一個(gè)郵件 Message msg = new MimeMessage(session); InternetAddress toAddrs =InternetAddress.parse(toAddr, false); msg.setRecipients(Message.RecipientType.TO, toAddrs); msg.setSubject(hello); msg.setSentDate(new Date(); msg.setFrom(new InternetAddres

58、s(fromAddr); Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.4 郵件正文郵件正文String attch1=attch1.rar;String attch2=attch2.rar;Multipart multipart=new MimeMultipart(); /加入文本內(nèi)容 MimeBodyPart mimeBodyPart1=new MimeBodyPart(); mimeBodyPart1.setText(How are you); multipart.addBodyPart(mimeBodyPart1); Network Programming谷風(fēng)書苑谷風(fēng)

59、書苑13.7.4 郵件正文郵件正文/加入第一個(gè)附件MimeBodyPart mimeBodyPart2=new MimeBodyPart(); FileDataSource fds=new FileDataSource(attch1);/得到數(shù)據(jù)源 mimeBodyPart2.setDataHandler(new DataHandler(fds); mimeBodyPart2.setDisposition(Part.ATTACHMENT);/標(biāo)識(shí)本部件為附件mimeBodyPart2.setFileName(fds.getName(); /設(shè)置文件名(與原文件名同)multipart.addB

60、odyPart(mimeBodyPart2); /將附件添加到正文對(duì)象Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.4 郵件正文郵件正文/加入第二個(gè)附件 MimeBodyPart mimeBodyPart3=new MimeBodyPart(); fds=new FileDataSource(attch2); /得到數(shù)據(jù)源 mimeBodyPart3.setDataHandler(new DataHandler(fds); mimeBodyPart3.setDisposition(Part.ATTACHMENT);mimeBodyPart3.setFileName(fds.g

61、etName(); /設(shè)置文件名multipart.addBodyPart(mimeBodyPart3); msg.setContent(multipart); /設(shè)置郵件的正文Transport.send(msg); /發(fā)送郵件 Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.4 郵件正文郵件正文public static void main(String args)throws Exception MailClientSendAttach client=new MailClientSendAttach(); client.init(); client.sendMessage

62、(client.fromAddr,client.toAddr); client.close(); Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.5 郵件接收郵件接收n例程的MailClientReadAttach類的processMessage(Message msg)方法演示如何解析并處理可能包括附件的郵件。 public static void processMessage(Message msg)throws Exception processMessageHeader(msg); /處理郵件頭部 Object body=msg.getContent(); /獲得郵件正

63、文 if(body instanceof Multipart) processMultipart(Multipart)body); else processPart(msg); Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.5 郵件接收(郵件接收(處理郵件頭部處理郵件頭部) public static void processMessageHeader(Message msg)throws Exception for(Enumeration e=msg.getAllHeaders(); e.hasMoreElements();) Header header=e.nextEle

64、ment(); System.out.println(header.getName()+:+header.getValue(); Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.5郵件接收(郵件正文)郵件接收(郵件正文)附件的獲取:從消息中獲取附件比發(fā)送它們棘手些,因?yàn)镸IME沒有簡(jiǎn)單的關(guān)于附件的概念。當(dāng)消息包含附件時(shí),消息的內(nèi)容是個(gè)Multipart對(duì)象。接著,您需要處理每個(gè)Part,獲取主要內(nèi)容和附件。標(biāo)有從part.getDisposition()獲得的Part.ATTACHMENT配置(disposition)的部件(Part)無疑就是附件。但是,沒有配置(以及一個(gè)非文

65、本MIME類型)和帶Part.INLINE配置的部件也可能是附件。當(dāng)配置要么是Part.ATTACHMENT,要么是Part.INLINE時(shí),這個(gè)消息部件的內(nèi)容就能被保存。只要用getFileName()和getInputStream()就能分別得到原始文件名和輸入流。 Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.5郵件接收(郵件正文)郵件接收(郵件正文) public static void processMultipart(Multipart mp)throws Exception for(int i=0;imp.getCount();i+)();/Miltipart的

66、數(shù)量, 比如多個(gè)附件 processPart(mp.getBodyPart(i); public static void processPart(Part part)throws Exception String fileName=part.getFileName(); String disposition=part.getDisposition(); String contentType=part.getContentType(); System.out.println(fileName=+fileName); System.out.println(disposition=+disposition); System.out.println(contentType=+contentType); Network Programming谷風(fēng)書苑谷風(fēng)書苑13.7.5郵件接收(郵件正文)郵件接收(郵件正文)if (disposition != null) &(disposition.equals(Part.ATTACHMENT) |(disposition.equals(Part.INLINE

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!