chapter14通過JavaMailAPI收發郵件_第1頁
chapter14通過JavaMailAPI收發郵件_第2頁
chapter14通過JavaMailAPI收發郵件_第3頁
chapter14通過JavaMailAPI收發郵件_第4頁
chapter14通過JavaMailAPI收發郵件_第5頁
已閱讀5頁,還剩60頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

chapter14-通過JavaMailAPI收發郵件2024/4/1chapter14通過JavaMailAPI收發郵件chapter14-通過JavaMailAPI收發郵件202114.1E-mail協議簡介郵件服務器按照提供的服務類型,可以分為發送郵件服務器(簡稱發送服務器)和接收郵件服務器(簡稱接收服務器)。發送郵件服務器使用郵件發送協議,現在常用的是SMTP,所以通常發送郵件服務器也稱為SMTP服務器;接收郵件服務器使用接收郵件協議,常用的有POP3協議和IMAP協議,所以通常接收郵件服務器也稱為POP3服務器或IMAP服務器。chapter14通過JavaMailAPI收發郵件14.1E-mail協議簡介郵件服務器按照提供的服務類型214.1E-mail協議簡介chapter14通過JavaMailAPI收發郵件14.1E-mail協議簡介chapter14通過Jav314.1.1SMTP簡單郵件傳輸協議SMTP(SimpleMailTransferProtocol),即簡單郵件傳輸協議,是Internet傳送E-mail的基本協議,也是TCP/IP協議組的成員。SMTP協議解決郵件系統如何通過一條鏈路,把郵件從一臺機器傳送到另一臺機器上的問題。SMTP協議的特點是具有良好的可伸縮性,這也是它成功的關鍵。它既適用于廣域網,也適用于局域網。SMTP協議由于非常簡單,使得它得到了廣泛的運用,在Internet上能夠發送郵件的服務器幾乎都支持SMTP協議。chapter14通過JavaMailAPI收發郵件14.1.1SMTP簡單郵件傳輸協議SMTP(Simpl414.1.2POP3郵局協議POP3(PostOfficeProtocol3),即郵局協議第3版,是Internet接收郵件的基本協議,也是TCP/IP協議組的成員。RFC1939描述了POP3協議,網址為“/rfc/rfc1939.txt”。POP3既允許接收服務器向郵件用戶發送郵件,也可以接收來自SMTP服務器的郵件。郵件客戶端軟件會與POP3服務器交互,下載由POP3服務器接收到的郵件。基于POP3協議的郵件系統能提供快速、經濟和方便的郵件接收服務,深受用戶的青睞。chapter14通過JavaMailAPI收發郵件14.1.2POP3郵局協議POP3(PostOffi5

14.1.3接收郵件的新協議IMAPIMAP(InternetMessageAccessProtocol),即互聯網消息訪問協議,是一種功能比POP3更強大的新的接收郵件協議。目前最新的IMAP協議版本為IMAP4,RFC2060描述了IMAP4,網址為“/rfc/rfc2060.txt”。IMAP4與POP3協議一樣提供了方便的下載郵件服務,允許用戶在脫機狀態下閱讀已經下載到本地硬盤的郵件。但IMAP4的功能遠遠不只這些,它還具有以下功能:摘要瀏覽郵件的功能。選擇性下載附件的功能。鼓勵用戶把郵件一直存儲在郵件服務器上。允許用戶把遠程郵件服務器上的郵箱作為信息存儲工具。chapter14通過JavaMailAPI收發郵件

14.1.3接收郵件的新協議IMAPIMAP(Inte614.1.4MIME簡介MIME(MultipurposeInternetMailExtensions,多用途Internet郵件擴充標準)不是郵件傳輸協議,而是對郵件格式所作的規范。RFC2045、RFC2046和RFC2047對MIME作了描述。MIME是對RFC822的擴充,RFC822規定了內容只包括采用ASCII編碼的純文本的郵件的格式,而MIME允許在郵件中包含附件。chapter14通過JavaMailAPI收發郵件14.1.4MIME簡介MIME(Multipurpos714.2JavaMailAPI簡介SUN公司制定了JavaMailAPI,它封裝了按照各種郵件通信協議,如IMAP、POP3和SMTP,與郵件服務器通信的細節,為Java應用程序提供了收發電子郵件的公共接口,參見圖14-2。chapter14通過JavaMailAPI收發郵件14.2JavaMailAPI簡介SUN公司制定了Ja814.2JavaMailAPI簡介JavaMailAPI主要位于javax.mail包和ernet中,圖14-3為其中主要類的類框圖。chapter14通過JavaMailAPI收發郵件14.2JavaMailAPI簡介JavaMailA914.2JavaMailAPI簡介1.javax.mail.Session類:表示郵件會話,是JavaMailAPI的最高層入口類。2.javax.mail.Store類:表示接收郵件服務器上的注冊用戶的存儲空間,通過Store類的getFolder()方法,可以訪問用戶的特定郵件夾。3.javax.mail.Folder類:代表郵件夾。4.javax.mail.Message類:代表電子郵件。5.javax.mail.Address類:代表郵件地址。6.javax.mail.Transport類:根據指定的郵件發送協議(通常是SMTP),通過指定的郵件發送服務器來發送郵件。chapter14通過JavaMailAPI收發郵件14.2JavaMailAPI簡介1.javax.m1014.3建立JavaMail應用程序的開發環境JDK中并不包含JavaMailAPI。為了開發JavaMail應用程序,需要從SUN公司的網站下載JavaMailAPI及其實現的類庫,該類庫由兩個JAR文件組成:mail.jar和activation.jar。另外,為了運行本課介紹的程序,還應該準備好可以訪問的郵件服務器。本課選用Merak郵件服務器,它是一個商業郵件服務器,支持STMP、POP3和IMAP協議。可以從網站上下載它的試用版本。chapter14通過JavaMailAPI收發郵件14.3建立JavaMail應用程序的開發環境JDK中并1114.4創建JavaMail應用程序假定郵件服務器安裝在本地計算機上,客戶程序訪問郵件服務器的admin@用戶需要提供如下信息:Stringhostname="localhost";Stringusername="admin";Stringpassword="1234";chapter14通過JavaMailAPI收發郵件14.4創建JavaMail應用程序假定郵件服務器安裝在1214.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");props.put("mail.imap.class","com.sun.mail.imap.IMAPStore");props.put("mail.smtp.host",hostname);chapter14通過JavaMailAPI收發郵件14.4創建JavaMail應用程序JavaMail應用1314.4創建JavaMail應用程序以上代碼設置了如下JavaMail屬性:tocol:指定郵件發送協議。tocol:指定郵件接收協議。mail.smtp.class:指定支持SMTP協議的Transport具體類,允許由第三方提供。mail.imap.class:指定支持IMAP協議的Store具體類,允許由第三方提供。mail.smtp.host:指定采用SMTP協議的郵件發送服務器的IP地址或主機名。chapter14通過JavaMailAPI收發郵件14.4創建JavaMail應用程序以上代碼設置了如下J1414.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類的實例。chapter14通過JavaMailAPI收發郵件14.4創建JavaMail應用程序步驟(2)調用jav1514.4創建JavaMail應用程序步驟(4)調用Store對象的connect()方法連接到接收郵件服務器。調用connect()方法時,應該指定接收郵件服務器的主機名或IP地址、用戶名和口令。store.connect(hostname,username,password);chapter14通過JavaMailAPI收發郵件14.4創建JavaMail應用程序步驟(4)調用Sto1614.4創建JavaMail應用程序獲得了Store對象后,就可以通過它來訪問郵件服務器上的特定郵件用戶了。通常會對郵件用戶執行以下操作。操作(1)創建并發送郵件://創建郵件msg=newMimeMessage(mailsession);InternetAddress[]toAddrs=InternetAddress.parse("admin@",false);//設置郵件接收者msg.setRecipients(Message.RecipientType.TO,toAddrs);//設置郵件的主題msg.setSubject("hello");//設置郵件的發送者msg.setFrom(newInternetAddress("admin@"));//設置郵件的正文msg.setText("Howareyou");//發送郵件Transport.send(msg);Transport的靜態方法send(Message)負責發送郵件服務器,郵件發送協議由tocol屬性指定,郵件發送服務器由mail.smtp.host屬性指定。chapter14通過JavaMailAPI收發郵件14.4創建JavaMail應用程序獲得了Store對象1714.4創建JavaMail應用程序操作(2)打開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郵件夾是郵件用戶的保留郵件夾,用戶不允許刪除該郵件夾,郵件服務器把所有接收到的新郵件都存在該郵件夾中。chapter14通過JavaMailAPI收發郵件14.4創建JavaMail應用程序操作(2)打開inb1814.4創建JavaMail應用程序操作(3)從郵件夾中讀取郵件://從郵件夾中讀取第一封郵件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());chapter14通過JavaMailAPI收發郵件14.4創建JavaMail應用程序操作(3)從郵件夾中1914.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);chapter14通過JavaMailAPI收發郵件14.5身份驗證在實際應用中,往往希望在連接郵件服務器時2014.5身份驗證chapter14通過JavaMailAPI收發郵件14.5身份驗證chapter14通過JavaMailA2114.6URLName類javax.mail.URLName類表示URL的名字,URLName類與.URL類的區別在于:URLName類不嘗試連接目標地址。構造URLName對象時,無需指定協議處理器。URLName類可以表示非標準的URL地址。比如URLName對象可以表示接收郵件服務器上的特定郵件夾,形式為:

協議名://用戶名:口令@主機:端口/郵件夾chapter14通過JavaMailAPI收發郵件14.6URLName類javax.mail.URLNa2214.6URLName類URLName類中包括以下getXXX()方法:getProtocol():獲得URL名字中的協議。getHost():獲得URL名字中的主機。getUsername():獲得URL名字中的用戶名。getPassword():獲得URL名字中的口令。getFile():獲得URL名字中的文件名或者郵件夾名。chapter14通過JavaMailAPI收發郵件14.6URLName類URLName類中包括以下get2314.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();

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

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

chapter14通過JavaMailAPI收發郵件14.7.4郵件正文圖14-10Part接口及其相關4214.7.4郵件正文MimeBodyPart類實現了MimePart接口和BodyPart接口,因此MimeBodyPart對象可以作為MimeMessage的正文的組成部分。MimeMessag類的以下三個方法都用于設置正文:voidsetText(Strinttxt)voidsetContent(Objecto,Stringtype)voidsetContent(Multipartmp)chapter14通過JavaMailAPI收發郵件14.7.4郵件正文MimeBodyPart類實現了Mi4314.7.4郵件正文如果MimeMessage僅包含純文本內容,可以通過以下兩種方式設置郵件正文:msg.setText("Howareyou");或者msg.setContent("Howareyou","text/plain");如果MimeMessage的正文包括多個組成部分,既有純文本內容,還有若干附件,那就應該先創建一個包含正文的各個組成部分的MimeMultipart對象,然后調用msg.setContent(Multipartmp)方法,把MimeMultipart對象作為郵件的正文。chapter14通過JavaMailAPI收發郵件14.7.4郵件正文如果MimeMessage僅包含純文4414.7.4郵件正文例程14-7的MailClientSendAttach類創建了一個包括附件的郵件,然后發送該郵件。這封郵件的正文包括三個組成部分,分別用三個MimeBodyPart對象來表示。第一個MimeBodyPart對象表示郵件的純文本內容,其他兩個MimeBodyPart對象分別表示兩個附件。這些MimeBodyPart對象都加入到一個MimeMultipart對象中。例程14-7MailClientSendAttach.javaimportjavax.mail.*;importernet.*;importjavax.activation.*;importjava.util.*;publicclassMailClientSendAttachextendsMailClientForCitiz{privateStringfromAddr="java_mail@";//發送者地址privateStringtoAddr="java_mail@";//接收者地址

chapter14通過JavaMailAPI收發郵件14.7.4郵件正文例程14-7的MailClientS4514.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));

Stringattch1="attch1.rar";Stringattch2="attch2.rar";Multipartmultipart=newMimeMultipart();

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

chapter14通過JavaMailAPI收發郵件14.7.4郵件正文publicvoidsend4614.7.4郵件正文//加入第一個附件MimeBodyPartmimeBodyPart2=newMimeBodyPart();FileDataSourcefds=newFileDataSource(attch1);//得到數據源mimeBodyPart2.setDataHandler(newDataHandler(fds));mimeBodyPart2.setDisposition(Part.ATTACHMENT);mimeBodyPart2.setFileName(fds.getName());//設置文件名multipart.addBodyPart(mimeBodyPart2);//加入第二個附件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);//發送郵件}

chapter14通過JavaMailAPI收發郵件14.7.4郵件正文//加入第一個附件chapte4714.7.4郵件正文publicstaticvoidmain(String[]args)throwsException{MailClientSendAttachclient=newMailClientSendAttach();client.init();client.sendMessage(client.fromAddr,client.toAddr);client.receiveMessage();client.close();}}chapter14通過JavaMailAPI收發郵件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通過JavaMailAPI收發郵件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通過JavaMailAPI收發郵件14.7.4郵件正文publicstaticvoi5014.7.4郵件正文/*續上頁:processPart(Partpart)方法*/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);}//把附件保存到一個文件中OutputStreamout=newBufferedOutputStream(newFileOutputStream(file));InputStreamin=newBufferedInputStream(part.getInputStream());intb;while((b=in.read())!=-1)out.write(b);out.close();in.close();}}chapter14通過JavaMailAPI收發郵件14.7.4郵件正文/*續上頁:process5114.8操縱郵件夾Folder類提供了一系列操縱郵件夾的方法:voidopen(intmode):打開郵件夾。參數mode指定打開郵件夾的模式,可選值包括Folder.READ_ONLY(只允許讀取郵件夾中的郵件)和Folder.READ_WRITE(允許讀取、添加或刪除郵件夾中的郵件)。booleanisOpen():判斷郵件夾是否打開。voidclose(booleanexpunge):關閉郵件夾。booleanexists():判斷是否在郵件服務器上存在物理上的郵件夾。booleancreate(inttype):在郵件服務器上創建一個物理郵件夾。參數type指定郵件夾的類型,可選值包括:Folder.HOLDS_FOLDERS(允許包含子郵件夾)和Folder.HOLDS_MESSAGES(允許包含郵件)。如果郵件夾創建成功,就返回true。chapter14通過JavaMailAPI收發郵件14.8操縱郵件夾Folder類提供了一系列操縱郵件夾的5214.8操縱郵件夾booleandelete(booleanrecurse):刪除郵件夾。如果刪除成功就返回true。Folder[]list():返回當前郵件夾下面的所有子郵件夾。booleanrenameTo(Folderf):修改郵件夾的名字,如果修改成功,就返回true。Message[]expunge():永久刪除郵件夾中所有設置了Flags.Flag.DELETE標記的郵件。MessagegetMessage(intmsgnum):獲得特定的郵件。參數msgnum指定郵件的索引。郵件的索引從1開始。chapter14通過JavaMailAPI收發郵件14.8操縱郵件夾booleandelete(bool5314.8操縱郵件夾intgetUnreadMessageCount():返回郵件夾中所有未讀郵件(即沒有設置Flags.Flag.SEEN標記的郵件)的數目。intgetMessageCount():返回郵件夾中所有郵件的數目。在有些Folder類的實現中,如果郵件夾未打開,就返回-1。voidappendMessages(Message[]msgs):向郵件夾中加入郵件。voidcopyMessages(Message[]msgs,Folderfolder):把當前郵件夾中的一些郵件拷貝到參數folder指定的目標郵件夾中。chapter14通過JavaMailAPI收發郵件14.8操縱郵件夾intgetUnreadMessag5414.8操縱郵件夾Store類的getFolder()方法返回的Folder對象總是處于關閉狀態,并且有可能實際上并不存在。以下程序代碼在郵件服務器上創建了物理上的郵件夾draft:Folderfolder=store.getFolder("draft");if(!folder.exists())folder.create(Folder.HOLDS_MESSAGES);chapter14通過JavaMailAPI收發郵件14.8操縱郵件夾Store類的getFolder()方5514.8操縱郵件夾在MailClientFolder類的deleteMessage()方法中:如果郵件不在trash郵件夾中,首先把這個郵件在trash郵件夾中備份,然后把原來郵件夾中的郵件的Flags.Flag.DELETED標記設為true。如果郵件在trash郵件夾中,就直接把郵件的Flags.Flag.DELETED標記設為true。在以上兩種情況下,最后都調用待刪除郵件所在郵件夾的expunge()方法,該方法永久刪除郵件夾中所有Flags.Flag.DELETED標記為true的郵件。chapter14通過JavaMailAPI收發郵件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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論