chapter14-通过JavaMail_API收发邮件_第1页
chapter14-通过JavaMail_API收发邮件_第2页
chapter14-通过JavaMail_API收发邮件_第3页
chapter14-通过JavaMail_API收发邮件_第4页
chapter14-通过JavaMail_API收发邮件_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第14章 通过JavaMail API收发邮件参考Java网络编程精解的第14章n14.1 E-mail协议简介n14.2 JavaMail APIn14.3 建立JavaMail应用程序的开发环境n14.4 创建JavaMailn14.5 身份验证n14.6 URLName类n14.7 创建和读取复杂电子邮件n14.8 操纵邮件夹214.1 E-mail协议简介n邮件服务器按照提供的服务类型,可以分为发送邮件服务器(简称发送服务器)和接收邮件服务器(简称接收服务器)。n发送邮件服务器使用邮件发送协议,现在常用的是SMTP,所以通常发送邮件服务器也称为SMTP服务器;n接收邮件服务器使用接收

2、邮件协议,常用的有POP3协议和IMAP协议,所以通常接收邮件服务器也称为POP3服务器或IMAP服务器。314.1 E-mail协议简介414.1.1 SMTP简单邮件传输协议nSMTP(Simple Mail Transfer Protocol),即简单邮件传输协议,是Internet传送E-mail的基本协议,也是TCP/IP协议组的成员。nSMTP协议解决邮件系统如何通过一条链路,把邮件从一台机器传送到另一台机器上的问题。nSMTP协议的特点是具有良好的可伸缩性,这也是它成功的关键。它既适用于广域网,也适用于局域网。nSMTP协议由于非常简单,使得它得到了广泛的运用,在Internet

3、上能够发送邮件的服务器几乎都支持SMTP协议。514.1.2 POP3邮局协议nPOP3(Post Office Protocol 3),即邮局协议第3版,是 Internet接收邮件的基本协议,也是TCP/IP协议组的成员。RFC1939描述了POP3协议,网址为“”。n POP3既允许接收服务器向邮件用户发送邮件,也可以接收来自SMTP服务器的邮件。n邮件客户端软件会与POP3服务器交互,下载由POP3服务器接收到的邮件。基于POP3协议的邮件系统能提供快速、经济和方便的邮件接收服务,深受用户的青睐。614.1.3 接收邮件的新协议IMAPnIMAP(Internet Message Ac

4、cess Protocol),即互联网消息访问协议,是一种功能比POP3更强大的新的接收邮件协议。目前最新的IMAP协议版本为IMAP4,RFC2060描述了IMAP4,网址为“”。nIMAP4与POP3协议一样提供了方便的下载邮件服务,允许用户在脱机状态下阅读已经下载到本地硬盘的邮件。但IMAP4的功能远远不只这些,它还具有以下功能: n摘要浏览邮件的功能。n选择性下载附件的功能。n鼓励用户把邮件一直存储在邮件服务器上。n允许用户把远程邮件服务器上的邮箱作为信息存储工具。714.1.4 MIME简介nMIME(Multipurpose Internet Mail Extensions,多用途

5、Internet邮件扩充标准)不是邮件传输协议,而是对邮件格式所作的规范。nRFC2045、RFC2046和RFC2047对MIME作了描述。nMIME是对RFC822的扩充,RFC822规定了内容只包括采用ASCII编码的纯文本的邮件的格式,而MIME允许在邮件中包含附件。814.2 JavaMail API简介nSUN公司制定了JavaMail API,它封装了按照各种邮件通信协议,如IMAP、POP3和SMTP,与邮件服务器通信的细节,为Java应用程序提供了收发电子邮件的公共接口,参见图14-2。914.2 JavaMail API简介nJavaMail API主要位于javax.ma

6、il包和ernet中,图14-3为其中主要类的类框图。1014.2 JavaMail API简介n1. javax.mail.Session类:表示邮件会话,是JavaMail API的最高层入口类。n2javax.mail.Store类:表示接收邮件服务器上的注册用户的存储空间,通过Store类的getFolder()方法,可以访问用户的特定邮件夹。 n3. javax.mail.Folder类:代表邮件夹。n4. javax.mail.Message类:代表电子邮件。n5. javax.mail.Address类:代表邮件地址。n6. javax.mail.Tr

7、ansport类:根据指定的邮件发送协议(通常是 SMTP),通过指定的邮件发送服务器来发送邮件。1114.3 建立JavaMail应用程序的开发环境nJDK中并不包含JavaMail API。为了开发JavaMail应用程序,需要从SUN公司的网站下载JavaMail API及其实现的类库,该类库由两个JAR文件组成: mail.jar和activation.jar。n另外,为了运行本课介绍的程序,还应该准备好可以访问的邮件服务器。本课选用Merak邮件服务器,它是一个商业邮件服务器,支持STMP、POP3和IMAP协议。可以从网站上下载它的试用版本。 1214.4 创建JavaMail应用

8、程序n假定邮件服务器安装在本地计算机上,客户程序访问邮件服务器的用户需要提供如下信息:String hostname = localhost;String username = admin;String password = 1234;1314.4 创建JavaMail应用程序JavaMail应用程序在初始化过程中需要执行如下步骤。n步骤(1)设置JavaMail属性: Properties props = new Properties();props.put(tocol, smtp);props.put(tocol, imap)

9、;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); 1414.4 创建JavaMail应用程序n以上代码设置了如下JavaMail属性:tocol:指定邮件发送协议。tocol:指定邮件接收协议。nmail.smtp.class:指定支持SMTP协议的Transport具体类

10、,允许由第三方提供。nmail.imap.class:指定支持IMAP协议的Store具体类,允许由第三方提供。nmail.smtp.host:指定采用SMTP协议的邮件发送服务器的IP地址或主机名。1514.4 创建JavaMail应用程序n步骤(2)调用javax.mail.Session类的静态方法Session.getDefaultInstance()获得Session实例,该方法根据已经配置的JavaMail属性来创建Session实例:Session mailsession = Session.getDefaultInstance(props);n步骤(3)调用Session的ge

11、tStore(String protocol)方法来获得Store对象,参数protocol指定接收邮件协议:Store store = mailsession.getStore(imap); 步骤(1)把mail.imap.class属性设为com.sun.mail.imap.IMAPStore,因此以上getStore()方法返回com.sun.mail.imap.IMAPStore类的实例。1614.4 创建JavaMail应用程序n步骤(4)调用Store对象的connect()方法连接到接收邮件服务器。调用connect()方法时,应该指定接收邮件服务器的主机名或IP地址、用户名和口

12、令。 store.connect(hostname,username, password);1714.4 创建JavaMail应用程序获得了Store对象后,就可以通过它来访问邮件服务器上的特定邮件用户了。通常会对邮件用户执行以下操作。操作(1)创建并发送邮件:/创建邮件msg = new MimeMessage(mailsession);InternetAddress toAddrs =InternetAddress.parse(, false);/设置邮件接收者 msg.setRecipients(Message.RecipientType.TO, toAddrs);/设置邮件的主题msg

13、.setSubject(hello);/设置邮件的发送者msg.setFrom(new InternetAddress();/设置邮件的正文msg.setText(How are you);/发送邮件Transport.send(msg);Transport的静态方法send(Message)负责发送邮件服务器,邮件发送协议由tocol属性指定,邮件发送服务器由mail.smtp.host属性指定。1814.4 创建JavaMail应用程序操作(2)打开inbox邮件夹收取邮件:/获得名为“inbox”的邮件夹Folder folder=store.getF

14、older(inbox);/打开邮件夹folder.open(Folder.READ_ONLY);/获得邮件夹中的邮件数目System.out.println(You have +folder.getMessageCount()+ messages in inbox.);/获得邮件夹中的未读邮件数目System.out.println(You have +folder.getUnreadMessageCount()+ unread messages in inbox.);在IMAP协议中,inbox邮件夹是邮件用户的保留邮件夹,用户不允许删除该邮件夹,邮件服务器把所有接收到的新邮件都存在该邮件

15、夹中。1914.4 创建JavaMail应用程序操作(3)从邮件夹中读取邮件:/从邮件夹中读取第一封邮件Message msg=folder.getMessage(1);System.out.println(-the first message in inbox-);/获得邮件的发送者、主题和正文System.out.println(From:+msg.getFrom()0);System.out.println(Subject:+msg.getSubject();System.out.println(Text:+msg.getText();2014.5 身份验证n在实际应用中,往往希望在连接

16、邮件服务器时,弹出一个对话框,提示用户输入用户名和口令。n为了达到这一效果,需要按照以下步骤创建和使用javax.mail.Authenticator类:n(1)创建一个javax.mail.Authenticator类的子类(假定名为MailAuthenticator),实现getPasswordAuthentication()方法。n(2)创建MailAuthenticator对象,并且把它作为参数传给Session的getDefaultInstance()方法:Authenticator ma=new MailAuthenticator();Session session = Sessi

17、on.getDefaultInstance(props,ma);n(3)连接到接收邮件服务器时,把用户名和口令设为null: store.connect(receiveHost,null, null);2114.5 身份验证2214.6 URLName类njavax.mail.URLName类表示URL的名字,URLName类与.URL类的区别在于:nURLName类不尝试连接目标地址。构造URLName对象时,无需指定协议处理器。nURLName类可以表示非标准的URL地址。比如URLName对象可以表示接收邮件服务器上的特定邮件夹,形式为: 协议名:/用户名:口令主机:端口/邮件夹2314

18、.6 URLName类nURLName类中包括以下getXXX()方法:ngetProtocol():获得URL名字中的协议。ngetHost():获得URL名字中的主机。ngetUsername():获得URL名字中的用户名。ngetPassword():获得URL名字中的口令。ngetFile():获得URL名字中的文件名或者邮件夹名。2414.6 URLName类n例程14-5的MailClientURLName类的init(URLName urlName)方法从一个URLName对象中获取连接到接收邮件服务器的各种信息。这个URLName对象表示的URL名字为:imap:/admin:

19、1234localhost/public void init(URLName urlName)throws Exception receiveProtocol=urlName.getProtocol(); receiveHost=urlName.getHost(); username=urlName.getUsername(); password=urlName.getPassword(); /设置属性 Properties props = new Properties(); props.put(mail.smtp.host, sendHost); /创建Session对象 session =

20、 Session.getDefaultInstance(props); /创建Store对象 store = session.getStore(receiveProtocol); /连接到邮件服务器 store.connect(receiveHost,username,password); 2514.7 创建和读取复杂电子邮件n如图14-9所示,按照MIME规范,电子邮件包括邮件头和正文两部分。邮件头中包括日期、发送者地址、接收者地址和主题等信息。正文部分可以包括普通文本内容,还可以包括一个或多个附件。2614.7 创建和读取复杂电子邮件njavax.mail.Message抽象类表示邮件,它

21、的具体子类为javax.mail.MimeMessage类,它提供了读取和设置邮件中各个部分的getXXX()和setXXX()方法:nsetSubject(String subject)方法设置邮件的主题。nsetHeader(String name, String value)方法设置邮件头部的某一项。nsetContent(Object o, String type)方法设置邮件的正文。2714.7.1 邮件地址njavax.mail.Address抽象类表示邮件地址,它的最常用的子类是javax.mail.InternetAddress类。nInternetAddress类表示Inte

22、rnet网上通用的邮件地址,形式为,或者“Admin”。2814.7.1 邮件地址nInternetAddress类提供了一系列get和set方法,用来读取和设置address、personal和charset等属性,例如:ngetAddress():读取address属性。ngetPersonal():读取personal属性。nsetAddress(String address):设置address属性。nsetPersonal(String personal):设置personal属性。2914.7.1 邮件地址n以下两段代码是等价的:InternetAddress addr= new

23、InternetAddress(,Admin);或者:InternetAddress addr=new InternetAddress();addr.setAddress();addr.setPersonal(Admin);3014.7.1 邮件地址nMimeMessage类的以下方法用于读取或设置邮件中的地址信息:nAddress getFrom():读取发送者的邮件地址。nAddress getRecipients(Message.RecipientType type):读取特定接收类型的邮件地址。nvoid setFrom(Address address):设置发送者的邮件地址。nvoi

24、d setRecipients(Message.RecipientType type, Address addresses):设置特定接收类型的邮件地址,参数addresses指定多个接收地址。nvoid setRecipients(Message.RecipientType type, String addresses) : 设置特定接收类型的邮件地址,参数addresses指定一个接收地址。3114.7.1 邮件地址nMessage.RecipientType 类型的静态常量表示地址类型,包括:nMessage.RecipientType.TO:主接收地址。nMessage.Recipie

25、ntType.CC:抄送地址。nMessage.RecipientType.BCC:广播地址。3214.7.1 邮件地址n以下程序代码设置了邮件的各项邮件地址:MimeMessage msg=new MimeMessage(session);InternetAddress from= new InternetAddress();InternetAddress to =InternetAddress.parse(,);InternetAddress cc= new InternetAddress();InternetAddress bcc =InternetAddress.parse(,);ms

26、g.setFrom(from);msg.setRecipients(Message.RecipientType.TO, to);msg.setRecipients(Message.RecipientType.CC, cc);msg.setRecipients(Message.RecipientType.BCC, bcc);3314.7.2 邮件头部nMimeMessage类的以下getXXX()和setXXX()方法用于读取和设置邮件头部的特定项:nString getHeader(String name) nvoid setHeader(String name, String value)3

27、414.7.2 邮件头部n以下两段代码的作用是等价的,它们的作用都是设置邮件的主题:msg.setHeader(subject,hello);或者:msg.setSubject(hello);3514.7.2 邮件头部nMimeMessage类的getAllHeaders()方法返回一个包含Header对象的Enumeration对象,每个Header对象表示邮件头部的一项。n以下程序代码遍历邮件头部的所有项:for(Enumeration e=msg.getAllHeaders(); e.hasMoreElements();) Header header=e.nextElement(); S

28、ystem.out.println(header.getName()+:“ +header.getValue();3614.7.3 邮件标记n多数接收邮件服务器允许邮件包含特定的标记信息,这些标记可以使用户更方便的管理邮件。nJavaMail API用javax.mail.Flags类的Flags.Flag内部类的静态实例来表示标记:nFlags.Flag.ANSWERED:表示邮件已经回复。该标记由客户程序设置。nFlags.Flag.DELETED:表示邮件已经被删除。该标记由客户程序设置。nFlags.Flag.RECENT:表示刚刚被添加到邮件夹的邮件,即最近一次打开邮件夹时,被添加到

29、邮件夹的邮件。该标记由Folder类的实现来设置,客户程序只能读取该标记。nFlags.Flag.FLAGGED:表示邮件已经作了某种标记。客户程序可以设置该标记。nFlags.Flag.SEEN:表示邮件已经被阅读。该标记由JavaMail API的实现来设置。当客户程序调用了邮件的getContent()方法时,该邮件被加上Flags.Flag.SEEN标记。客户程序可以修改这个标记。nFlags.Flag.DRAFT:表示邮件是草稿。该标记由客户程序设置。nFlags.Flag.USER:表示邮件所在的邮件夹支持用户自定义的标记。该标记由接收邮件服务器设置,客户程序只能读取该标记。客户程

30、序可以通过folder.getPermanentFlags().contains(Flags.Flag.USER)方法判断邮件夹是否支持用户自定义的标记。3714.7.3 邮件标记nMimeMessage类提供了三个与标记有关的方法:nvoid setFlags(Flags flags,boolean set):设置或取消一组标记。nvoid setFlags(Flags.Flag,boolean set):设置或取消特定标记。nboolean isSet(Flags.Flag flag):察看是否设置了某个标记。3814.7.3 邮件标记n以下两段程序代码是等价的,它们的作用都是为一个邮件设

31、置SEEN和ANSWERED标记: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);3914.7.3 邮件标记n如果邮件所在的邮件夹支持用户标记,还可以通过以下方式为邮件加上具有特殊含义的用户标记:Flags flags=new Flags();flags.add(private

32、 email);flags.add(about travelling);msg.setFlags(flags,true); /表示这是一封关于旅游的私人信件4014.7.3 邮件标记n以下程序代码察看邮件的所有标记:if(msg.isSet(Flags.Flag.DELETED) System.out.println(DELETED);else if(msg.isSet(Flags.Flag.SEEN) System.out.println(SEEN);else if(msg.isSet(Flags.Flag.ANSWERED) System.out.println(ANSWERED);els

33、e if(msg.isSet(Flags.Flag.RECENT) System.out.println(RECENT);else if(msg.isSet(Flags.Flag.DRAFT) System.out.println(DRAFT);else if(msg.isSet(Flags.Flag.FLAGGED) System.out.println(FLAGGED);else if(msg.isSet( Flags.Flag.USER) /读取用户标记 String userFlags=msg.getFlags().getUserFlags(); for(int i=0;iuserFl

34、ags.length;i+) System.out.println(User Flag:+userFlagsi); 4114.7.4 邮件正文n邮件正文是邮件中最复杂的一部分,正文可以是纯文本,还可以包括若干附件。nJavaMail API把邮件正文的各个组成部分以及整个邮件都抽象为部件,部件用javax.mail.Part接口表示。n一个Part对象和一个DataHandler对象关联,DataHandler对象负责处理部件包含的数据。nPart接口有两个子接口:MimePart接口和BodyPart接口。nMimePart接口表示符合MIME规范的部件。nBodyPart接口表示可以作为邮

35、件正文的组成部分的部件。4214.7.4 邮件正文MimePartMessagePartDataHandlerMimeMessageMimeMultipartMimeBodyPartMultipartBodyPart图14-10 Part接口及其相关类的类框图 4314.7.4 邮件正文nMimeBodyPart类实现了MimePart接口和BodyPart接口,因此MimeBodyPart对象可以作为MimeMessage的正文的组成部分。nMimeMessag类的以下三个方法都用于设置正文:nvoid setText(Strint txt)nvoid setContent(Object o

36、,String type)nvoid setContent(Multipart mp)4414.7.4 邮件正文n如果MimeMessage仅包含纯文本内容,可以通过以下两种方式设置邮件正文:msg.setText(How are you);或者msg.setContent(How are you,text/plain);n如果MimeMessage的正文包括多个组成部分,既有纯文本内容,还有若干附件,那就应该先创建一个包含正文的各个组成部分的MimeMultipart对象,然后调用msg.setContent(Multipart mp)方法,把MimeMultipart对象作为邮件的正文。4

37、514.7.4 邮件正文n例程14-7的MailClientSendAttach类创建了一个包括附件的邮件,然后发送该邮件。n这封邮件的正文包括三个组成部分,分别用三个MimeBodyPart对象来表示。第一个MimeBodyPart对象表示邮件的纯文本内容,其他两个MimeBodyPart对象分别表示两个附件。这些MimeBodyPart对象都加入到一个MimeMultipart对象中。例程14-7 MailClientSendAttach.javanimport javax.mail.*;nimport ernet.*;nimport javax.activat

38、ion.*;nimport java.util.*;npublic class MailClientSendAttach extends MailClientForCitizn private String fromAddr=; /发送者地址n private String toAddr=; /接收者地址 4614.7.4 邮件正文n public void sendMessage(String fromAddr,String toAddr) throws Exceptionn /创建一个邮件n Message msg = new MimeMessage(session);n Internet

39、Address toAddrs =InternetAddress.parse(toAddr, false);n msg.setRecipients(Message.RecipientType.TO, toAddrs);n msg.setSubject(hello);n msg.setSentDate(new Date();n msg.setFrom(new InternetAddress(fromAddr);n n String attch1=attch1.rar;n String attch2=attch2.rar;n Multipart multipart=new MimeMultipar

40、t();n n /加入文本内容n MimeBodyPart mimeBodyPart1=new MimeBodyPart(); n mimeBodyPart1.setText(How are you);n multipart.addBodyPart(mimeBodyPart1); 4714.7.4 邮件正文n /加入第一个附件n MimeBodyPart mimeBodyPart2=new MimeBodyPart(); n fds=new (attch1); /得到数据源 n mimeBodyPart2.setDataHandler(new DataHandler(fds); n mimeB

41、odyPart2.setDisposition(Part.ATTACHMENT);n mimeBodyPart2.set(fds.getName(); /设置文件名n multipart.addBodyPart(mimeBodyPart2); n /加入第二个附件n MimeBodyPart mimeBodyPart3=new MimeBodyPart(); n fds=new (attch2); /得到数据源 n mimeBodyPart3.setDataHandler(new DataHandler(fds); n mimeBodyPart3.setDisposition(Part.ATT

42、ACHMENT);n mimeBodyPart3.set(fds.getName(); /设置文件名n multipart.addBodyPart(mimeBodyPart3); n msg.setContent(multipart); /设置邮件的正文n Transport.send(msg); /发送邮件n 4814.7.4 邮件正文npublic static void main(String args)throws Exception n MailClientSendAttach client=new MailClientSendAttach();n client.init();n c

43、lient.sendMessage(client.fromAddr,client.toAddr);n client.receiveMessage();n client.close();n n4914.7.4 邮件正文n例程14-8的MailClientReadAttach类的processMessage(Message msg)方法演示如何解析并处理可能包括附件的邮件。 public static void processMessage(Message msg)throws Exception processMessageHeader(msg); /处理邮件头部 Object body=msg

44、.getContent(); /获得邮件正文 if(body instanceof Multipart) processMultipart(Multipart)body); else processPart(msg); public static void processMessageHeader(Message msg)throws Exception for(Enumeration e=msg.getAllHeaders(); e.hasMoreElements();) Header header=e.nextElement(); System.out.println(header.get

45、Name()+:+header.getValue(); 5014.7.4 邮件正文 public static void processMultipart(Multipart mp)throws Exception for(int i=0;imp.getCount();i+) processPart(mp.getBodyPart(i); public static void processPart(Part part)throws Exception String (); String disposition=part.getDisposition(); String contentType=

46、part.getContentType(); System.out.println(+); System.out.println(disposition=+disposition); System.out.println(contentType=+contentType); if(contentType.toLowerCase().startsWith(multipart/) processMultipart(Multipart)part.getContent(); else if( & (Part.ATTACHMENT.equalsIgnoreCase(disposition) |

47、!contentType.toLowerCase().startsWith(text/plain) (attachment,.data).getName(); 5114.7.4 邮件正文 /* 续上页: processPart(Part part)方法 */ if() /如果不是附件,打印到控制台 part.writeTo(System.out); System.out.println(); else ); /创建一个在文件系统中不存在的文件 for(int i=1;();i+) String newName=i+_+; ); /把附件保存到一个文件中 OutputStream out=new

48、 BufferedOutputStream(new (file); InputStream in=new BufferedInputStream(part.getInputStream(); int b; while(b=in.read()!=-1)out.write(b); out.close(); in.close(); 5214.8 操纵邮件夹nFolder类提供了一系列操纵邮件夹的方法:nvoid open(int mode) :打开邮件夹。参数mode指定打开邮件夹的模式,可选值包括Folder.READ_ONLY(只允许读取邮件夹中的邮件)和Folder.READ_WRITE(允许

49、读取、添加或删除邮件夹中的邮件)。nboolean isOpen():判断邮件夹是否打开。nvoid close(boolean expunge) :关闭邮件夹。nboolean exists() :判断是否在邮件服务器上存在物理上的邮件夹。nboolean create(int type):在邮件服务器上创建一个物理邮件夹。 参数type指定邮件夹的类型,可选值包括:Folder.HOLDS_FOLDERS(允许包含子邮件夹)和Folder.HOLDS_MESSAGES(允许包含邮件)。如果邮件夹创建成功,就返回true。5314.8 操纵邮件夹nboolean delete(boolean

50、 recurse):删除邮件夹。如果删除成功就返回true。nFolder list():返回当前邮件夹下面的所有子邮件夹。nboolean renameTo(Folder f) :修改邮件夹的名字,如果修改成功,就返回true。nMessage expunge() :永久删除邮件夹中所有设置了Flags.Flag.DELETE标记的邮件。nMessage getMessage(int msgnum) :获得特定的邮件。参数msgnum指定邮件的索引。邮件的索引从1开始。5414.8 操纵邮件夹nint getUnreadMessageCount():返回邮件夹中所有未读邮件(即没有设置Fla

51、gs.Flag.SEEN标记的邮件)的数目。nint getMessageCount() :返回邮件夹中所有邮件的数目。在有些Folder类的实现中,如果邮件夹未打开,就返回-1。nvoid appendMessages(Message msgs):向邮件夹中加入邮件。nvoid copyMessages(Message msgs, Folder folder) :把当前邮件夹中的一些邮件拷贝到参数folder指定的目标邮件夹中。5514.8 操纵邮件夹nStore类的getFolder()方法返回的Folder对象总是处于关闭状态,并且有可能实际上并不存在。n以下程序代码在邮件服务器上创建了

52、物理上的邮件夹draft:Folder folder=store.getFolder(draft);if(!folder.exists() folder.create(Folder.HOLDS_MESSAGES);5614.8 操纵邮件夹n在MailClientFolder类的deleteMessage()方法中:n如果邮件不在trash邮件夹中,首先把这个邮件在trash邮件夹中备份,然后把原来邮件夹中的邮件的Flags.Flag.DELETED标记设为true 。n如果邮件在trash邮件夹中,就直接把邮件的Flags.Flag.DELETED标记设为true。n在以上两种情况下,最后都调

53、用待删除邮件所在邮件夹的expunge()方法,该方法永久删除邮件夹中所有Flags.Flag.DELETED标记为true的邮件。5714.8 操纵邮件夹public void deleteMessage(int arrayOpt,String folderName)throws Exception Folder folder=store.getFolder(folderName); if(!folder.exists()throw new Exception(folderName+该邮件夹不存在); if(!folder.isOpen()folder.open(Folder.READ_WR

54、ITE); for(int i=0;iarrayOpt.length;i+) if(arrayOpti=0)continue; Message msg=folder.getMessage(i+1); if(!folder.getName().equals(trash) Folder Trash=store.getFolder(trash); folder.copyMessages(new Messagemsg,Trash); msg.setFlag(Flags.Flag.DELETED, true); else msg.setFlag(Flags.Flag.DELETED, true); folder.expunge();58练习题1n问题:以下哪个协议允许管理远程邮件服务器上的邮件问题:以下哪个协议允许管理远程邮件服务器上的邮件夹?夹?n选项选项:na) POP3nb) SMTPnc) HTTPnd) IMAP4n答案答案: d59练习题2n问题:以下哪些方法属于

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论