




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
chapter14-通過(guò)JavaMailAPI收發(fā)郵件2024/4/1chapter14通過(guò)JavaMailAPI收發(fā)郵件chapter14-通過(guò)JavaMailAPI收發(fā)郵件202114.1E-mail協(xié)議簡(jiǎn)介郵件服務(wù)器按照提供的服務(wù)類型,可以分為發(fā)送郵件服務(wù)器(簡(jiǎn)稱發(fā)送服務(wù)器)和接收郵件服務(wù)器(簡(jiǎn)稱接收服務(wù)器)。發(fā)送郵件服務(wù)器使用郵件發(fā)送協(xié)議,現(xiàn)在常用的是SMTP,所以通常發(fā)送郵件服務(wù)器也稱為SMTP服務(wù)器;接收郵件服務(wù)器使用接收郵件協(xié)議,常用的有POP3協(xié)議和IMAP協(xié)議,所以通常接收郵件服務(wù)器也稱為POP3服務(wù)器或IMAP服務(wù)器。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.1E-mail協(xié)議簡(jiǎn)介郵件服務(wù)器按照提供的服務(wù)類型214.1E-mail協(xié)議簡(jiǎn)介chapter14通過(guò)JavaMailAPI收發(fā)郵件14.1E-mail協(xié)議簡(jiǎn)介chapter14通過(guò)Jav314.1.1SMTP簡(jiǎn)單郵件傳輸協(xié)議SMTP(SimpleMailTransferProtocol),即簡(jiǎn)單郵件傳輸協(xié)議,是Internet傳送E-mail的基本協(xié)議,也是TCP/IP協(xié)議組的成員。SMTP協(xié)議解決郵件系統(tǒng)如何通過(guò)一條鏈路,把郵件從一臺(tái)機(jī)器傳送到另一臺(tái)機(jī)器上的問(wèn)題。SMTP協(xié)議的特點(diǎn)是具有良好的可伸縮性,這也是它成功的關(guān)鍵。它既適用于廣域網(wǎng),也適用于局域網(wǎng)。SMTP協(xié)議由于非常簡(jiǎn)單,使得它得到了廣泛的運(yùn)用,在Internet上能夠發(fā)送郵件的服務(wù)器幾乎都支持SMTP協(xié)議。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.1.1SMTP簡(jiǎn)單郵件傳輸協(xié)議SMTP(Simpl414.1.2POP3郵局協(xié)議POP3(PostOfficeProtocol3),即郵局協(xié)議第3版,是Internet接收郵件的基本協(xié)議,也是TCP/IP協(xié)議組的成員。RFC1939描述了POP3協(xié)議,網(wǎng)址為“/rfc/rfc1939.txt”。POP3既允許接收服務(wù)器向郵件用戶發(fā)送郵件,也可以接收來(lái)自SMTP服務(wù)器的郵件。郵件客戶端軟件會(huì)與POP3服務(wù)器交互,下載由POP3服務(wù)器接收到的郵件?;赑OP3協(xié)議的郵件系統(tǒng)能提供快速、經(jīng)濟(jì)和方便的郵件接收服務(wù),深受用戶的青睞。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.1.2POP3郵局協(xié)議POP3(PostOffi5
14.1.3接收郵件的新協(xié)議IMAPIMAP(InternetMessageAccessProtocol),即互聯(lián)網(wǎng)消息訪問(wèn)協(xié)議,是一種功能比POP3更強(qiáng)大的新的接收郵件協(xié)議。目前最新的IMAP協(xié)議版本為IMAP4,RFC2060描述了IMAP4,網(wǎng)址為“/rfc/rfc2060.txt”。IMAP4與POP3協(xié)議一樣提供了方便的下載郵件服務(wù),允許用戶在脫機(jī)狀態(tài)下閱讀已經(jīng)下載到本地硬盤的郵件。但I(xiàn)MAP4的功能遠(yuǎn)遠(yuǎn)不只這些,它還具有以下功能:摘要瀏覽郵件的功能。選擇性下載附件的功能。鼓勵(lì)用戶把郵件一直存儲(chǔ)在郵件服務(wù)器上。允許用戶把遠(yuǎn)程郵件服務(wù)器上的郵箱作為信息存儲(chǔ)工具。chapter14通過(guò)JavaMailAPI收發(fā)郵件
14.1.3接收郵件的新協(xié)議IMAPIMAP(Inte614.1.4MIME簡(jiǎn)介MIME(MultipurposeInternetMailExtensions,多用途Internet郵件擴(kuò)充標(biāo)準(zhǔn))不是郵件傳輸協(xié)議,而是對(duì)郵件格式所作的規(guī)范。RFC2045、RFC2046和RFC2047對(duì)MIME作了描述。MIME是對(duì)RFC822的擴(kuò)充,RFC822規(guī)定了內(nèi)容只包括采用ASCII編碼的純文本的郵件的格式,而MIME允許在郵件中包含附件。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.1.4MIME簡(jiǎn)介MIME(Multipurpos714.2JavaMailAPI簡(jiǎn)介SUN公司制定了JavaMailAPI,它封裝了按照各種郵件通信協(xié)議,如IMAP、POP3和SMTP,與郵件服務(wù)器通信的細(xì)節(jié),為Java應(yīng)用程序提供了收發(fā)電子郵件的公共接口,參見圖14-2。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.2JavaMailAPI簡(jiǎn)介SUN公司制定了Ja814.2JavaMailAPI簡(jiǎn)介JavaMailAPI主要位于javax.mail包和ernet中,圖14-3為其中主要類的類框圖。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.2JavaMailAPI簡(jiǎn)介JavaMailA914.2JavaMailAPI簡(jiǎn)介1.javax.mail.Session類:表示郵件會(huì)話,是JavaMailAPI的最高層入口類。2.javax.mail.Store類:表示接收郵件服務(wù)器上的注冊(cè)用戶的存儲(chǔ)空間,通過(guò)Store類的getFolder()方法,可以訪問(wèn)用戶的特定郵件夾。3.javax.mail.Folder類:代表郵件夾。4.javax.mail.Message類:代表電子郵件。5.javax.mail.Address類:代表郵件地址。6.javax.mail.Transport類:根據(jù)指定的郵件發(fā)送協(xié)議(通常是SMTP),通過(guò)指定的郵件發(fā)送服務(wù)器來(lái)發(fā)送郵件。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.2JavaMailAPI簡(jiǎn)介1.javax.m1014.3建立JavaMail應(yīng)用程序的開發(fā)環(huán)境JDK中并不包含JavaMailAPI。為了開發(fā)JavaMail應(yīng)用程序,需要從SUN公司的網(wǎng)站下載JavaMailAPI及其實(shí)現(xiàn)的類庫(kù),該類庫(kù)由兩個(gè)JAR文件組成:mail.jar和activation.jar。另外,為了運(yùn)行本課介紹的程序,還應(yīng)該準(zhǔn)備好可以訪問(wèn)的郵件服務(wù)器。本課選用Merak郵件服務(wù)器,它是一個(gè)商業(yè)郵件服務(wù)器,支持STMP、POP3和IMAP協(xié)議。可以從網(wǎng)站上下載它的試用版本。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.3建立JavaMail應(yīng)用程序的開發(fā)環(huán)境JDK中并1114.4創(chuàng)建JavaMail應(yīng)用程序假定郵件服務(wù)器安裝在本地計(jì)算機(jī)上,客戶程序訪問(wèn)郵件服務(wù)器的admin@用戶需要提供如下信息:Stringhostname="localhost";Stringusername="admin";Stringpassword="1234";chapter14通過(guò)JavaMailAPI收發(fā)郵件14.4創(chuàng)建JavaMail應(yīng)用程序假定郵件服務(wù)器安裝在1214.4創(chuàng)建JavaMail應(yīng)用程序JavaMail應(yīng)用程序在初始化過(guò)程中需要執(zhí)行如下步驟。步驟(1)設(shè)置JavaMail屬性:Propertiesprops=newProperties();props.put("tocol","smtp");props.put("tocol","imap");props.put("mail.smtp.class","com.sun.mail.smtp.SMTPTransport");props.put("mail.imap.class","com.sun.mail.imap.IMAPStore");props.put("mail.smtp.host",hostname);chapter14通過(guò)JavaMailAPI收發(fā)郵件14.4創(chuàng)建JavaMail應(yīng)用程序JavaMail應(yīng)用1314.4創(chuàng)建JavaMail應(yīng)用程序以上代碼設(shè)置了如下JavaMail屬性:tocol:指定郵件發(fā)送協(xié)議。tocol:指定郵件接收協(xié)議。mail.smtp.class:指定支持SMTP協(xié)議的Transport具體類,允許由第三方提供。mail.imap.class:指定支持IMAP協(xié)議的Store具體類,允許由第三方提供。mail.smtp.host:指定采用SMTP協(xié)議的郵件發(fā)送服務(wù)器的IP地址或主機(jī)名。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.4創(chuàng)建JavaMail應(yīng)用程序以上代碼設(shè)置了如下J1414.4創(chuàng)建JavaMail應(yīng)用程序步驟(2)調(diào)用javax.mail.Session類的靜態(tài)方法Session.getDefaultInstance()獲得Session實(shí)例,該方法根據(jù)已經(jīng)配置的JavaMail屬性來(lái)創(chuàng)建Session實(shí)例:Sessionmailsession=Session.getDefaultInstance(props);步驟(3)調(diào)用Session的getStore(Stringprotocol)方法來(lái)獲得Store對(duì)象,參數(shù)protocol指定接收郵件協(xié)議:Storestore=mailsession.getStore("imap");步驟(1)把mail.imap.class屬性設(shè)為com.sun.mail.imap.IMAPStore,因此以上getStore()方法返回com.sun.mail.imap.IMAPStore類的實(shí)例。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.4創(chuàng)建JavaMail應(yīng)用程序步驟(2)調(diào)用jav1514.4創(chuàng)建JavaMail應(yīng)用程序步驟(4)調(diào)用Store對(duì)象的connect()方法連接到接收郵件服務(wù)器。調(diào)用connect()方法時(shí),應(yīng)該指定接收郵件服務(wù)器的主機(jī)名或IP地址、用戶名和口令。store.connect(hostname,username,password);chapter14通過(guò)JavaMailAPI收發(fā)郵件14.4創(chuàng)建JavaMail應(yīng)用程序步驟(4)調(diào)用Sto1614.4創(chuàng)建JavaMail應(yīng)用程序獲得了Store對(duì)象后,就可以通過(guò)它來(lái)訪問(wèn)郵件服務(wù)器上的特定郵件用戶了。通常會(huì)對(duì)郵件用戶執(zhí)行以下操作。操作(1)創(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");//設(shè)置郵件的發(fā)送者msg.setFrom(newInternetAddress("admin@"));//設(shè)置郵件的正文msg.setText("Howareyou");//發(fā)送郵件Transport.send(msg);Transport的靜態(tài)方法send(Message)負(fù)責(zé)發(fā)送郵件服務(wù)器,郵件發(fā)送協(xié)議由tocol屬性指定,郵件發(fā)送服務(wù)器由mail.smtp.host屬性指定。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.4創(chuàng)建JavaMail應(yīng)用程序獲得了Store對(duì)象1714.4創(chuàng)建JavaMail應(yīng)用程序操作(2)打開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ù)器把所有接收到的新郵件都存在該郵件夾中。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.4創(chuàng)建JavaMail應(yīng)用程序操作(2)打開inb1814.4創(chuàng)建JavaMail應(yīng)用程序操作(3)從郵件夾中讀取郵件://從郵件夾中讀取第一封郵件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());chapter14通過(guò)JavaMailAPI收發(fā)郵件14.4創(chuàng)建JavaMail應(yīng)用程序操作(3)從郵件夾中1914.5身份驗(yàn)證在實(shí)際應(yīng)用中,往往希望在連接郵件服務(wù)器時(shí),彈出一個(gè)對(duì)話框,提示用戶輸入用戶名和口令。為了達(dá)到這一效果,需要按照以下步驟創(chuàng)建和使用javax.mail.Authenticator類:(1)創(chuàng)建一個(gè)javax.mail.Authenticator類的子類(假定名為MailAuthenticator),實(shí)現(xiàn)getPasswordAuthentication()方法。(2)創(chuàng)建MailAuthenticator對(duì)象,并且把它作為參數(shù)傳給Session的getDefaultInstance()方法:Authenticatorma=newMailAuthenticator();Sessionsession=Session.getDefaultInstance(props,ma);(3)連接到接收郵件服務(wù)器時(shí),把用戶名和口令設(shè)為null:
store.connect(receiveHost,null,null);chapter14通過(guò)JavaMailAPI收發(fā)郵件14.5身份驗(yàn)證在實(shí)際應(yīng)用中,往往希望在連接郵件服務(wù)器時(shí)2014.5身份驗(yàn)證chapter14通過(guò)JavaMailAPI收發(fā)郵件14.5身份驗(yàn)證chapter14通過(guò)JavaMailA2114.6URLName類javax.mail.URLName類表示URL的名字,URLName類與.URL類的區(qū)別在于:URLName類不嘗試連接目標(biāo)地址。構(gòu)造URLName對(duì)象時(shí),無(wú)需指定協(xié)議處理器。URLName類可以表示非標(biāo)準(zhǔn)的URL地址。比如URLName對(duì)象可以表示接收郵件服務(wù)器上的特定郵件夾,形式為:
協(xié)議名://用戶名:口令@主機(jī):端口/郵件夾chapter14通過(guò)JavaMailAPI收發(fā)郵件14.6URLName類javax.mail.URLNa2214.6URLName類URLName類中包括以下getXXX()方法:getProtocol():獲得URL名字中的協(xié)議。getHost():獲得URL名字中的主機(jī)。getUsername():獲得URL名字中的用戶名。getPassword():獲得URL名字中的口令。getFile():獲得URL名字中的文件名或者郵件夾名。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.6URLName類URLName類中包括以下get2314.6URLName類例程14-5的MailClientURLName類的init(URLNameurlName)方法從一個(gè)URLName對(duì)象中獲取連接到接收郵件服務(wù)器的各種信息。這個(gè)URLName對(duì)象表示的URL名字為:imap://admin:1234@localhost/publicvoidinit(URLNameurlName)throwsException{receiveProtocol=urlName.getProtocol();receiveHost=urlName.getHost();username=urlName.getUsername();password=urlName.getPassword();
//設(shè)置屬性Propertiesprops=newProperties();props.put("mail.smtp.host",sendHost);
//創(chuàng)建Session對(duì)象session=Session.getDefaultInstance(props);//創(chuàng)建Store對(duì)象store=session.getStore(receiveProtocol);//連接到郵件服務(wù)器store.connect(receiveHost,username,password);}chapter14通過(guò)JavaMailAPI收發(fā)郵件14.6URLName類例程14-5的MailClien2414.7創(chuàng)建和讀取復(fù)雜電子郵件如圖14-9所示,按照MIME規(guī)范,電子郵件包括郵件頭和正文兩部分。郵件頭中包括日期、發(fā)送者地址、接收者地址和主題等信息。正文部分可以包括普通文本內(nèi)容,還可以包括一個(gè)或多個(gè)附件。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7創(chuàng)建和讀取復(fù)雜電子郵件如圖14-9所示,按照MI2514.7創(chuàng)建和讀取復(fù)雜電子郵件javax.mail.Message抽象類表示郵件,它的具體子類為javax.mail.MimeMessage類,它提供了讀取和設(shè)置郵件中各個(gè)部分的getXXX()和setXXX()方法:setSubject(Stringsubject)方法設(shè)置郵件的主題。setHeader(Stringname,Stringvalue)方法設(shè)置郵件頭部的某一項(xiàng)。setContent(Objecto,Stringtype)方法設(shè)置郵件的正文。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7創(chuàng)建和讀取復(fù)雜電子郵件javax.mail.Me2614.7.1郵件地址javax.mail.Address抽象類表示郵件地址,它的最常用的子類是javax.mail.InternetAddress類。InternetAddress類表示Internet網(wǎng)上通用的郵件地址,形式為admin@,或者“Admin<admin@>”。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.1郵件地址javax.mail.Address2714.7.1郵件地址InternetAddress類提供了一系列g(shù)et和set方法,用來(lái)讀取和設(shè)置address、personal和charset等屬性,例如:getAddress():讀取address屬性。getPersonal():讀取personal屬性。setAddress(Stringaddress):設(shè)置address屬性。setPersonal(Stringpersonal):設(shè)置personal屬性。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.1郵件地址InternetAddress類提供2814.7.1郵件地址以下兩段代碼是等價(jià)的:InternetAddressaddr=newInternetAddress("admin@","Admin");或者:InternetAddressaddr=newInternetAddress();addr.setAddress("admin@");addr.setPersonal("Admin");chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.1郵件地址以下兩段代碼是等價(jià)的:chapter2914.7.1郵件地址MimeMessage類的以下方法用于讀取或設(shè)置郵件中的地址信息:Address[]getFrom():讀取發(fā)送者的郵件地址。Address[]getRecipients(Message.RecipientTypetype):讀取特定接收類型的郵件地址。voidsetFrom(Addressaddress):設(shè)置發(fā)送者的郵件地址。voidsetRecipients(Message.RecipientTypetype,Address[]addresses):設(shè)置特定接收類型的郵件地址,參數(shù)addresses指定多個(gè)接收地址。voidsetRecipients(Message.RecipientTypetype,Stringaddresses):設(shè)置特定接收類型的郵件地址,參數(shù)addresses指定一個(gè)接收地址。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.1郵件地址MimeMessage類的以下方法用3014.7.1郵件地址Message.RecipientType類型的靜態(tài)常量表示地址類型,包括:Message.RecipientType.TO:主接收地址。Message.RecipientType.CC:抄送地址。Message.RecipientType.BCC:廣播地址。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.1郵件地址Message.RecipientT3114.7.1郵件地址以下程序代碼設(shè)置了郵件的各項(xiàng)郵件地址: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);chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.1郵件地址以下程序代碼設(shè)置了郵件的各項(xiàng)郵件地址3214.7.2郵件頭部MimeMessage類的以下getXXX()和setXXX()方法用于讀取和設(shè)置郵件頭部的特定項(xiàng):String[]getHeader(Stringname)voidsetHeader(Stringname,Stringvalue)chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.2郵件頭部MimeMessage類的以下get3314.7.2郵件頭部以下兩段代碼的作用是等價(jià)的,它們的作用都是設(shè)置郵件的主題:msg.setHeader("subject","hello");或者:msg.setSubject("hello");chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.2郵件頭部以下兩段代碼的作用是等價(jià)的,它們的作3414.7.2郵件頭部MimeMessage類的getAllHeaders()方法返回一個(gè)包含Header對(duì)象的Enumeration對(duì)象,每個(gè)Header對(duì)象表示郵件頭部的一項(xiàng)。以下程序代碼遍歷郵件頭部的所有項(xiàng):for(Enumeration<Header>e=msg.getAllHeaders();e.hasMoreElements();){Headerheader=e.nextElement();System.out.println(header.getName()+":“+header.getValue());}chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.2郵件頭部MimeMessage類的getAl3514.7.3郵件標(biāo)記多數(shù)接收郵件服務(wù)器允許郵件包含特定的標(biāo)記信息,這些標(biāo)記可以使用戶更方便的管理郵件。JavaMailAPI用javax.mail.Flags類的Flags.Flag內(nèi)部類的靜態(tài)實(shí)例來(lái)表示標(biāo)記:Flags.Flag.ANSWERED:表示郵件已經(jīng)回復(fù)。該標(biāo)記由客戶程序設(shè)置。Flags.Flag.DELETED:表示郵件已經(jīng)被刪除。該標(biāo)記由客戶程序設(shè)置。Flags.Flag.RECENT:表示剛剛被添加到郵件夾的郵件,即最近一次打開郵件夾時(shí),被添加到郵件夾的郵件。該標(biāo)記由Folder類的實(shí)現(xiàn)來(lái)設(shè)置,客戶程序只能讀取該標(biāo)記。Flags.Flag.FLAGGED:表示郵件已經(jīng)作了某種標(biāo)記??蛻舫绦蚩梢栽O(shè)置該標(biāo)記。Flags.Flag.SEEN:表示郵件已經(jīng)被閱讀。該標(biāo)記由JavaMailAPI的實(shí)現(xiàn)來(lái)設(shè)置。當(dāng)客戶程序調(diào)用了郵件的getContent()方法時(shí),該郵件被加上Flags.Flag.SEEN標(biāo)記??蛻舫绦蚩梢孕薷倪@個(gè)標(biāo)記。Flags.Flag.DRAFT:表示郵件是草稿。該標(biāo)記由客戶程序設(shè)置。Flags.Flag.USER:表示郵件所在的郵件夾支持用戶自定義的標(biāo)記。該標(biāo)記由接收郵件服務(wù)器設(shè)置,客戶程序只能讀取該標(biāo)記??蛻舫绦蚩梢酝ㄟ^(guò)folder.getPermanentFlags().contains(Flags.Flag.USER)方法判斷郵件夾是否支持用戶自定義的標(biāo)記。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.3郵件標(biāo)記多數(shù)接收郵件服務(wù)器允許郵件包含特定的3614.7.3郵件標(biāo)記MimeMessage類提供了三個(gè)與標(biāo)記有關(guān)的方法:voidsetFlags(Flagsflags,booleanset):設(shè)置或取消一組標(biāo)記。voidsetFlags(Flags.Flag,booleanset):設(shè)置或取消特定標(biāo)記。booleanisSet(Flags.Flagflag):察看是否設(shè)置了某個(gè)標(biāo)記。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.3郵件標(biāo)記MimeMessage類提供了三個(gè)與3714.7.3郵件標(biāo)記以下兩段程序代碼是等價(jià)的,它們的作用都是為一個(gè)郵件設(shè)置SEEN和ANSWERED標(biāo)記: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);chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.3郵件標(biāo)記以下兩段程序代碼是等價(jià)的,它們的作用3814.7.3郵件標(biāo)記如果郵件所在的郵件夾支持用戶標(biāo)記,還可以通過(guò)以下方式為郵件加上具有特殊含義的用戶標(biāo)記:Flagsflags=newFlags();flags.add("privateemail");flags.add("abouttravelling");msg.setFlags(flags,true);//表示這是一封關(guān)于旅游的私人信件chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.3郵件標(biāo)記如果郵件所在的郵件夾支持用戶標(biāo)記,還3914.7.3郵件標(biāo)記以下程序代碼察看郵件的所有標(biāo)記: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");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)){//讀取用戶標(biāo)記String[]userFlags=msg.getFlags().getUserFlags();for(inti=0;i<userFlags.length;i++){System.out.println("UserFlag:"+userFlags[i]);}}chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.3郵件標(biāo)記以下程序代碼察看郵件的所有標(biāo)記:ch4014.7.4郵件正文郵件正文是郵件中最復(fù)雜的一部分,正文可以是純文本,還可以包括若干附件。JavaMailAPI把郵件正文的各個(gè)組成部分以及整個(gè)郵件都抽象為部件,部件用javax.mail.Part接口表示。一個(gè)Part對(duì)象和一個(gè)DataHandler對(duì)象關(guān)聯(lián),DataHandler對(duì)象負(fù)責(zé)處理部件包含的數(shù)據(jù)。Part接口有兩個(gè)子接口:MimePart接口和BodyPart接口。MimePart接口表示符合MIME規(guī)范的部件。BodyPart接口表示可以作為郵件正文的組成部分的部件。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.4郵件正文郵件正文是郵件中最復(fù)雜的一部分,正文4114.7.4郵件正文圖14-10Part接口及其相關(guān)類的類框圖
chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.4郵件正文圖14-10Part接口及其相關(guān)4214.7.4郵件正文MimeBodyPart類實(shí)現(xiàn)了MimePart接口和BodyPart接口,因此MimeBodyPart對(duì)象可以作為MimeMessage的正文的組成部分。MimeMessag類的以下三個(gè)方法都用于設(shè)置正文:voidsetText(Strinttxt)voidsetContent(Objecto,Stringtype)voidsetContent(Multipartmp)chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.4郵件正文MimeBodyPart類實(shí)現(xiàn)了Mi4314.7.4郵件正文如果MimeMessage僅包含純文本內(nèi)容,可以通過(guò)以下兩種方式設(shè)置郵件正文:msg.setText("Howareyou");或者msg.setContent("Howareyou","text/plain");如果MimeMessage的正文包括多個(gè)組成部分,既有純文本內(nèi)容,還有若干附件,那就應(yīng)該先創(chuàng)建一個(gè)包含正文的各個(gè)組成部分的MimeMultipart對(duì)象,然后調(diào)用msg.setContent(Multipartmp)方法,把MimeMultipart對(duì)象作為郵件的正文。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.4郵件正文如果MimeMessage僅包含純文4414.7.4郵件正文例程14-7的MailClientSendAttach類創(chuàng)建了一個(gè)包括附件的郵件,然后發(fā)送該郵件。這封郵件的正文包括三個(gè)組成部分,分別用三個(gè)MimeBodyPart對(duì)象來(lái)表示。第一個(gè)MimeBodyPart對(duì)象表示郵件的純文本內(nèi)容,其他兩個(gè)MimeBodyPart對(duì)象分別表示兩個(gè)附件。這些MimeBodyPart對(duì)象都加入到一個(gè)MimeMultipart對(duì)象中。例程14-7MailClientSendAttach.javaimportjavax.mail.*;importernet.*;importjavax.activation.*;importjava.util.*;publicclassMailClientSendAttachextendsMailClientForCitiz{privateStringfromAddr="java_mail@";//發(fā)送者地址privateStringtoAddr="java_mail@";//接收者地址
chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.4郵件正文例程14-7的MailClientS4514.7.4郵件正文publicvoidsendMessage(StringfromAddr,StringtoAddr)throwsException{//創(chuàng)建一個(gè)郵件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));
Stringattch1="attch1.rar";Stringattch2="attch2.rar";Multipartmultipart=newMimeMultipart();
//加入文本內(nèi)容MimeBodyPartmimeBodyPart1=newMimeBodyPart();mimeBodyPart1.setText("Howareyou");multipart.addBodyPart(mimeBodyPart1);
chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.4郵件正文publicvoidsend4614.7.4郵件正文//加入第一個(gè)附件MimeBodyPartmimeBodyPart2=newMimeBodyPart();FileDataSourcefds=newFileDataSource(attch1);//得到數(shù)據(jù)源mimeBodyPart2.setDataHandler(newDataHandler(fds));mimeBodyPart2.setDisposition(Part.ATTACHMENT);mimeBodyPart2.setFileName(fds.getName());//設(shè)置文件名multipart.addBodyPart(mimeBodyPart2);//加入第二個(gè)附件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ā)送郵件}
chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.4郵件正文//加入第一個(gè)附件chapte4714.7.4郵件正文publicstaticvoidmain(String[]args)throwsException{MailClientSendAttachclient=newMailClientSendAttach();client.init();client.sendMessage(client.fromAddr,client.toAddr);client.receiveMessage();client.close();}}chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.4郵件正文publicstaticvoid4814.7.4郵件正文例程14-8的MailClientReadAttach類的processMessage(Messagemsg)方法演示如何解析并處理可能包括附件的郵件。
publicstaticvoidprocessMessage(Messagemsg)throwsException{processMessageHeader(msg);//處理郵件頭部Objectbody=msg.getContent();//獲得郵件正文if(bodyinstanceofMultipart){processMultipart((Multipart)body);}else{processPart(msg);}}
publicstaticvoidprocessMessageHeader(Messagemsg)throwsException{for(Enumeration<Header>e=msg.getAllHeaders();e.hasMoreElements();){Headerheader=e.nextElement();System.out.println(header.getName()+":"+header.getValue());}}
chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.4郵件正文例程14-8的MailClientR4914.7.4郵件正文publicstaticvoidprocessMultipart(Multipartmp)throwsException{for(inti=0;i<mp.getCount();i++){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);if(contentType.toLowerCase().startsWith("multipart/")){processMultipart((Multipart)part.getContent());}elseif(fileName==null&&(Part.ATTACHMENT.equalsIgnoreCase(disposition)||!contentType.toLowerCase().startsWith("text/plain"))){fileName=File.createTempFile("attachment",".data").getName();}
chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.4郵件正文publicstaticvoi5014.7.4郵件正文/*續(xù)上頁(yè):processPart(Partpart)方法*/if(fileName==null){//如果不是附件,打印到控制臺(tái)part.writeTo(System.out);System.out.println();}else{Filefile=newFile(fileName);//創(chuàng)建一個(gè)在文件系統(tǒng)中不存在的文件for(inti=1;file.exists();i++){StringnewName=i+"_"+fileName;file=newFile(newName);}//把附件保存到一個(gè)文件中OutputStreamout=newBufferedOutputStream(newFileOutputStream(file));InputStreamin=newBufferedInputStream(part.getInputStream());intb;while((b=in.read())!=-1)out.write(b);out.close();in.close();}}chapter14通過(guò)JavaMailAPI收發(fā)郵件14.7.4郵件正文/*續(xù)上頁(yè):process5114.8操縱郵件夾Folder類提供了一系列操縱郵件夾的方法:voidopen(intmode):打開郵件夾。參數(shù)mode指定打開郵件夾的模式,可選值包括Folder.READ_ONLY(只允許讀取郵件夾中的郵件)和Folder.READ_WRITE(允許讀取、添加或刪除郵件夾中的郵件)。booleanisOpen():判斷郵件夾是否打開。voidclose(booleanexpunge):關(guān)閉郵件夾。booleanexists():判斷是否在郵件服務(wù)器上存在物理上的郵件夾。booleancreate(inttype):在郵件服務(wù)器上創(chuàng)建一個(gè)物理郵件夾。參數(shù)type指定郵件夾的類型,可選值包括:Folder.HOLDS_FOLDERS(允許包含子郵件夾)和Folder.HOLDS_MESSAGES(允許包含郵件)。如果郵件夾創(chuàng)建成功,就返回true。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.8操縱郵件夾Folder類提供了一系列操縱郵件夾的5214.8操縱郵件夾booleandelete(booleanrecurse):刪除郵件夾。如果刪除成功就返回true。Folder[]list():返回當(dāng)前郵件夾下面的所有子郵件夾。booleanrenameTo(Folderf):修改郵件夾的名字,如果修改成功,就返回true。Message[]expunge():永久刪除郵件夾中所有設(shè)置了Flags.Flag.DELETE標(biāo)記的郵件。MessagegetMessage(intmsgnum):獲得特定的郵件。參數(shù)msgnum指定郵件的索引。郵件的索引從1開始。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.8操縱郵件夾booleandelete(bool5314.8操縱郵件夾intgetUnreadMessageCount():返回郵件夾中所有未讀郵件(即沒有設(shè)置Flags.Flag.SEEN標(biāo)記的郵件)的數(shù)目。intgetMessageCount():返回郵件夾中所有郵件的數(shù)目。在有些Folder類的實(shí)現(xiàn)中,如果郵件夾未打開,就返回-1。voidappendMessages(Message[]msgs):向郵件夾中加入郵件。voidcopyMessages(Message[]msgs,Folderfolder):把當(dāng)前郵件夾中的一些郵件拷貝到參數(shù)folder指定的目標(biāo)郵件夾中。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.8操縱郵件夾intgetUnreadMessag5414.8操縱郵件夾Store類的getFolder()方法返回的Folder對(duì)象總是處于關(guān)閉狀態(tài),并且有可能實(shí)際上并不存在。以下程序代碼在郵件服務(wù)器上創(chuàng)建了物理上的郵件夾draft:Folderfolder=store.getFolder("draft");if(!folder.exists())folder.create(Folder.HOLDS_MESSAGES);chapter14通過(guò)JavaMailAPI收發(fā)郵件14.8操縱郵件夾Store類的getFolder()方5514.8操縱郵件夾在MailClientFolder類的deleteMessage()方法中:如果郵件不在trash郵件夾中,首先把這個(gè)郵件在trash郵件夾中備份,然后把原來(lái)郵件夾中的郵件的Flags.Flag.DELETED標(biāo)記設(shè)為true。如果郵件在trash郵件夾中,就直接把郵件的Flags.Flag.DELETED標(biāo)記設(shè)為true。在以上兩種情況下,最后都調(diào)用待刪除郵件所在郵件夾的expunge()方法,該方法永久刪除郵件夾中所有Flags.Flag.DELETED標(biāo)記為true的郵件。chapter14通過(guò)JavaMailAPI收發(fā)郵件14.8操縱郵件夾在MailClientFolder類的5614.8操縱郵件夾publicvoiddeleteMessage(intarrayOpt[],StringfolderName)throwsException{Folderfolder=store.getFolder(folderName);if(!folder.exists())thrownewException(folderName+"該郵件夾不存在");if(!folder.isOpen())folder.open(Folder.READ_WRITE);for(inti=0;i<arrayOpt.length;i++){if(arrayOpt[i]==0)continue;Messagemsg=folder.getMessage(i+1);if(!folder.getName().equals("trash")){FolderTrash=st
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 班主任在班級(jí)活動(dòng)中的引導(dǎo)角色計(jì)劃
- 合同范本音樂app
- 股骨頸骨折護(hù)理查房
- 班級(jí)班規(guī)的制定與執(zhí)行計(jì)劃
- 2025年自然拼讀2級(jí)標(biāo)準(zhǔn)課件材料
- 學(xué)校周邊安全環(huán)境的構(gòu)建計(jì)劃
- 建立有效的會(huì)議記錄機(jī)制計(jì)劃
- 第3課 中華文明的起源2024-2025學(xué)年新教材七年級(jí)上冊(cè)歷史新教學(xué)設(shè)計(jì)(統(tǒng)編版2024)
- 以活動(dòng)促學(xué)習(xí)的班級(jí)實(shí)踐計(jì)劃
- 《貴州水城礦業(yè)股份有限公司水城縣米籮煤礦(新立一期)(延續(xù))礦產(chǎn)資源綠色開發(fā)利用方案(三合一)》評(píng)審意見
- 2024年蘇州健雄職業(yè)技術(shù)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 2024年大慶醫(yī)學(xué)高等專科學(xué)校高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
- 四川省綿陽(yáng)市2025屆高三上學(xué)期第二次診斷性考試語(yǔ)文試題(含答案)
- 2025年1月 浙江首考英語(yǔ)試卷
- 2024年07月威海市商業(yè)銀行校園招考大學(xué)生報(bào)到筆試歷年參考題庫(kù)附帶答案詳解
- 房屋修繕工程難點(diǎn)、重點(diǎn)分析及應(yīng)對(duì)措施
- 《汽豐田服務(wù)流程》課件
- 財(cái)務(wù)管理(山東聯(lián)盟-青島科技大學(xué))知到智慧樹章節(jié)測(cè)試課后答案2024年秋青島科技大學(xué)
- 2024初中語(yǔ)文新教材培訓(xùn):閱讀綜合實(shí)踐欄目的設(shè)計(jì)與使用解讀
- 《高壓直流輸電換流閥用金屬管狀電阻器技術(shù)規(guī)范(征求意見稿)》
- GJB9001C-2017版標(biāo)準(zhǔn)培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論