已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第14章 通过JavaMail API收发邮件,参考Java网络编程精解的第14章,14.1 E-mail协议简介 14.2 JavaMail API简介 14.3 建立JavaMail应用程序的开发环境 14.4 创建JavaMail应用程序 14.5 身份验证 14.6 URLName类 14.7 创建和读取复杂电子邮件 14.8 操纵邮件夹,14.1 E-mail协议简介,邮件服务器按照提供的服务类型,可以分为发送邮件服务器(简称发送服务器)和接收邮件服务器(简称接收服务器)。 发送邮件服务器使用邮件发送协议,现在常用的是SMTP,所以通常发送邮件服务器也称为SMTP服务器; 接收邮件服务器使用接收邮件协议,常用的有POP3协议和IMAP协议,所以通常接收邮件服务器也称为POP3服务器或IMAP服务器。,14.1 E-mail协议简介,14.1.1 SMTP简单邮件传输协议,SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议,是Internet传送E-mail的基本协议,也是TCP/IP协议组的成员。 SMTP协议解决邮件系统如何通过一条链路,把邮件从一台机器传送到另一台机器上的问题。 SMTP协议的特点是具有良好的可伸缩性,这也是它成功的关键。它既适用于广域网,也适用于局域网。 SMTP协议由于非常简单,使得它得到了广泛的运用,在Internet上能够发送邮件的服务器几乎都支持SMTP协议。,14.1.2 POP3邮局协议,POP3(Post Office Protocol 3),即邮局协议第3版,是 Internet接收邮件的基本协议,也是TCP/IP协议组的成员。RFC1939描述了POP3协议,网址为“/rfc/rfc1939.txt”。 POP3既允许接收服务器向邮件用户发送邮件,也可以接收来自SMTP服务器的邮件。 邮件客户端软件会与POP3服务器交互,下载由POP3服务器接收到的邮件。基于POP3协议的邮件系统能提供快速、经济和方便的邮件接收服务,深受用户的青睐。,14.1.3 接收邮件的新协议IMAP,IMAP(Internet Message Access Protocol),即互联网消息访问协议,是一种功能比POP3更强大的新的接收邮件协议。目前最新的IMAP协议版本为IMAP4,RFC2060描述了IMAP4,网址为“/rfc/rfc2060.txt”。 IMAP4与POP3协议一样提供了方便的下载邮件服务,允许用户在脱机状态下阅读已经下载到本地硬盘的邮件。但IMAP4的功能远远不只这些,它还具有以下功能: 摘要浏览邮件的功能。 选择性下载附件的功能。 鼓励用户把邮件一直存储在邮件服务器上。 允许用户把远程邮件服务器上的邮箱作为信息存储工具。,14.1.4 MIME简介,MIME(Multipurpose Internet Mail Extensions,多用途Internet邮件扩充标准)不是邮件传输协议,而是对邮件格式所作的规范。 RFC2045、RFC2046和RFC2047对MIME作了描述。 MIME是对RFC822的扩充,RFC822规定了内容只包括采用ASCII编码的纯文本的邮件的格式,而MIME允许在邮件中包含附件。,14.2 JavaMail API简介,SUN公司制定了JavaMail API,它封装了按照各种邮件通信协议,如IMAP、POP3和SMTP,与邮件服务器通信的细节,为Java应用程序提供了收发电子邮件的公共接口,参见图14-2。,14.2 JavaMail API简介,JavaMail API主要位于javax.mail包和ernet中,图14-3为其中主要类的类框图。,14.2 JavaMail API简介,1. javax.mail.Session类:表示邮件会话,是JavaMail API的最高层入口类。 2javax.mail.Store类:表示接收邮件服务器上的注册用户的存储空间,通过Store类的getFolder()方法,可以访问用户的特定邮件夹。 3. javax.mail.Folder类:代表邮件夹。 4. javax.mail.Message类:代表电子邮件。 5. javax.mail.Address类:代表邮件地址。 6. javax.mail.Transport类:根据指定的邮件发送协议(通常是 SMTP),通过指定的邮件发送服务器来发送邮件。,14.3 建立JavaMail应用程序的开发环境,JDK中并不包含JavaMail API。为了开发JavaMail应用程序,需要从SUN公司的网站下载JavaMail API及其实现的类库,该类库由两个JAR文件组成: mail.jar和activation.jar。 另外,为了运行本课介绍的程序,还应该准备好可以访问的邮件服务器。本课选用Merak邮件服务器,它是一个商业邮件服务器,支持STMP、POP3和IMAP协议。可以从网站上下载它的试用版本。,14.4 创建JavaMail应用程序,假定邮件服务器安装在本地计算机上,客户程序访问邮件服务器的admin用户需要提供如下信息: String hostname = “localhost“; String username = “admin“; String password = “1234“;,14.4 创建JavaMail应用程序,JavaMail应用程序在初始化过程中需要执行如下步骤。 步骤(1)设置JavaMail属性: Properties props = new Properties(); 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);,14.4 创建JavaMail应用程序,以上代码设置了如下JavaMail属性: tocol:指定邮件发送协议。 tocol:指定邮件接收协议。 mail.smtp.class:指定支持SMTP协议的Transport具体类,允许由第三方提供。 mail.imap.class:指定支持IMAP协议的Store具体类,允许由第三方提供。 mail.smtp.host:指定采用SMTP协议的邮件发送服务器的IP地址或主机名。,14.4 创建JavaMail应用程序,步骤(2)调用javax.mail.Session类的静态方法Session.getDefaultInstance()获得Session实例,该方法根据已经配置的JavaMail属性来创建Session实例: Session mailsession = Session.getDefaultInstance(props); 步骤(3)调用Session的getStore(String protocol)方法来获得Store对象,参数protocol指定接收邮件协议: Store store = mailsession.getStore(“imap“); 步骤(1)把mail.imap.class属性设为com.sun.mail.imap.IMAPStore,因此以上getStore()方法返回com.sun.mail.imap.IMAPStore类的实例。,14.4 创建JavaMail应用程序,步骤(4)调用Store对象的connect()方法连接到接收邮件服务器。调用connect()方法时,应该指定接收邮件服务器的主机名或IP地址、用户名和口令。 store.connect(hostname,username, password);,14.4 创建JavaMail应用程序,获得了Store对象后,就可以通过它来访问邮件服务器上的特定邮件用户了。通常会对邮件用户执行以下操作。 操作(1)创建并发送邮件: /创建邮件 msg = new MimeMessage(mailsession); InternetAddress toAddrs =InternetAddress.parse(“admin“, false); /设置邮件接收者 msg.setRecipients(Message.RecipientType.TO, toAddrs); /设置邮件的主题 msg.setSubject(“hello“); /设置邮件的发送者 msg.setFrom(new InternetAddress(“admin“); /设置邮件的正文 msg.setText(“How are you“); /发送邮件 Transport.send(msg); Transport的静态方法send(Message)负责发送邮件服务器,邮件发送协议由tocol属性指定,邮件发送服务器由mail.smtp.host属性指定。,14.4 创建JavaMail应用程序,操作(2)打开inbox邮件夹收取邮件: /获得名为“inbox”的邮件夹 Folder folder=store.getFolder(“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邮件夹是邮件用户的保留邮件夹,用户不允许删除该邮件夹,邮件服务器把所有接收到的新邮件都存在该邮件夹中。,14.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();,14.5 身份验证,在实际应用中,往往希望在连接邮件服务器时,弹出一个对话框,提示用户输入用户名和口令。 为了达到这一效果,需要按照以下步骤创建和使用javax.mail.Authenticator类: (1)创建一个javax.mail.Authenticator类的子类(假定名为MailAuthenticator),实现getPasswordAuthentication()方法。 (2)创建MailAuthenticator对象,并且把它作为参数传给Session的getDefaultInstance()方法: Authenticator ma=new MailAuthenticator(); Session session = Session.getDefaultInstance(props,ma); (3)连接到接收邮件服务器时,把用户名和口令设为null: store.connect(receiveHost,null, null);,14.5 身份验证,14.6 URLName类,javax.mail.URLName类表示URL的名字,URLName类与.URL类的区别在于: URLName类不尝试连接目标地址。构造URLName对象时,无需指定协议处理器。 URLName类可以表示非标准的URL地址。比如URLName对象可以表示接收邮件服务器上的特定邮件夹,形式为: 协议名:/用户名:口令主机:端口/邮件夹,14.6 URLName类,URLName类中包括以下getXXX()方法: getProtocol():获得URL名字中的协议。 getHost():获得URL名字中的主机。 getUsername():获得URL名字中的用户名。 getPassword():获得URL名字中的口令。 getFile():获得URL名字中的文件名或者邮件夹名。,14.6 URLName类,例程14-5的MailClientURLName类的init(URLName urlName)方法从一个URLName对象中获取连接到接收邮件服务器的各种信息。这个URLName对象表示的URL名字为:imap:/admin: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 = Session.getDefaultInstance(props); /创建Store对象 store = session.getStore(receiveProtocol); /连接到邮件服务器 store.connect(receiveHost,username,password); ,14.7 创建和读取复杂电子邮件,如图14-9所示,按照MIME规范,电子邮件包括邮件头和正文两部分。邮件头中包括日期、发送者地址、接收者地址和主题等信息。正文部分可以包括普通文本内容,还可以包括一个或多个附件。,14.7 创建和读取复杂电子邮件,javax.mail.Message抽象类表示邮件,它的具体子类为javax.mail.MimeMessage类,它提供了读取和设置邮件中各个部分的getXXX()和setXXX()方法: setSubject(String subject)方法设置邮件的主题。 setHeader(String name, String value)方法设置邮件头部的某一项。 setContent(Object o, String type)方法设置邮件的正文。,14.7.1 邮件地址,javax.mail.Address抽象类表示邮件地址,它的最常用的子类是javax.mail.InternetAddress类。 InternetAddress类表示Internet网上通用的邮件地址,形式为admin,或者“Admin”。,14.7.1 邮件地址,InternetAddress类提供了一系列get和set方法,用来读取和设置address、personal和charset等属性,例如: getAddress():读取address属性。 getPersonal():读取personal属性。 setAddress(String address):设置address属性。 setPersonal(String personal):设置personal属性。,14.7.1 邮件地址,以下两段代码是等价的: InternetAddress addr= new InternetAddress(“admin“,“Admin“); 或者: InternetAddress addr=new InternetAddress(); addr.setAddress(“admin“); addr.setPersonal(“Admin“);,14.7.1 邮件地址,MimeMessage类的以下方法用于读取或设置邮件中的地址信息: Address getFrom():读取发送者的邮件地址。 Address getRecipients(Message.RecipientType type):读取特定接收类型的邮件地址。 void setFrom(Address address):设置发送者的邮件地址。 void setRecipients(Message.RecipientType type, Address addresses):设置特定接收类型的邮件地址,参数addresses指定多个接收地址。 void setRecipients(Message.RecipientType type, String addresses) : 设置特定接收类型的邮件地址,参数addresses指定一个接收地址。,14.7.1 邮件地址,Message.RecipientType 类型的静态常量表示地址类型,包括: Message.RecipientType.TO:主接收地址。 Message.RecipientType.CC:抄送地址。 Message.RecipientType.BCC:广播地址。,14.7.1 邮件地址,以下程序代码设置了邮件的各项邮件地址: MimeMessage msg=new MimeMessage(session); InternetAddress from= new InternetAddress(“admin“); InternetAddress to =InternetAddress.parse(“admin,java_mail“); InternetAddress cc= new InternetAddress(“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);,14.7.2 邮件头部,MimeMessage类的以下getXXX()和setXXX()方法用于读取和设置邮件头部的特定项: String getHeader(String name) void setHeader(String name, String value),14.7.2 邮件头部,以下两段代码的作用是等价的,它们的作用都是设置邮件的主题: msg.setHeader(“subject“,“hello“); 或者: msg.setSubject(“hello“);,14.7.2 邮件头部,MimeMessage类的getAllHeaders()方法返回一个包含Header对象的Enumeration对象,每个Header对象表示邮件头部的一项。 以下程序代码遍历邮件头部的所有项: for(Enumeration e=msg.getAllHeaders(); e.hasMoreElements();) Header header=e.nextElement(); System.out.println(header.getName()+“:“ +header.getValue(); ,14.7.3 邮件标记,多数接收邮件服务器允许邮件包含特定的标记信息,这些标记可以使用户更方便的管理邮件。 JavaMail API用javax.mail.Flags类的Flags.Flag内部类的静态实例来表示标记: Flags.Flag.ANSWERED:表示邮件已经回复。该标记由客户程序设置。 Flags.Flag.DELETED:表示邮件已经被删除。该标记由客户程序设置。 Flags.Flag.RECENT:表示刚刚被添加到邮件夹的邮件,即最近一次打开邮件夹时,被添加到邮件夹的邮件。该标记由Folder类的实现来设置,客户程序只能读取该标记。 Flags.Flag.FLAGGED:表示邮件已经作了某种标记。客户程序可以设置该标记。 Flags.Flag.SEEN:表示邮件已经被阅读。该标记由JavaMail API的实现来设置。当客户程序调用了邮件的getContent()方法时,该邮件被加上Flags.Flag.SEEN标记。客户程序可以修改这个标记。 Flags.Flag.DRAFT:表示邮件是草稿。该标记由客户程序设置。 Flags.Flag.USER:表示邮件所在的邮件夹支持用户自定义的标记。该标记由接收邮件服务器设置,客户程序只能读取该标记。客户程序可以通过folder.getPermanentFlags().contains(Flags.Flag.USER)方法判断邮件夹是否支持用户自定义的标记。,14.7.3 邮件标记,MimeMessage类提供了三个与标记有关的方法: void setFlags(Flags flags,boolean set):设置或取消一组标记。 void setFlags(Flags.Flag,boolean set):设置或取消特定标记。 boolean isSet(Flags.Flag flag):察看是否设置了某个标记。,14.7.3 邮件标记,以下两段程序代码是等价的,它们的作用都是为一个邮件设置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);,14.7.3 邮件标记,如果邮件所在的邮件夹支持用户标记,还可以通过以下方式为邮件加上具有特殊含义的用户标记: Flags flags=new Flags(); flags.add(“private email“); flags.add(“about travelling“); msg.setFlags(flags,true); /表示这是一封关于旅游的私人信件,14.7.3 邮件标记,以下程序代码察看邮件的所有标记: 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“); else 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;iuserFlags.length;i+) System.out.println(“User Flag:“+userFlagsi); ,14.7.4 邮件正文,邮件正文是邮件中最复杂的一部分,正文可以是纯文本,还可以包括若干附件。 JavaMail API把邮件正文的各个组成部分以及整个邮件都抽象为部件,部件用javax.mail.Part接口表示。 一个Part对象和一个DataHandler对象关联,DataHandler对象负责处理部件包含的数据。 Part接口有两个子接口:MimePart接口和BodyPart接口。 MimePart接口表示符合MIME规范的部件。 BodyPart接口表示可以作为邮件正文的组成部分的部件。,14.7.4 邮件正文,图14-10 Part接口及其相关类的类框图,14.7.4 邮件正文,MimeBodyPart类实现了MimePart接口和BodyPart接口,因此MimeBodyPart对象可以作为MimeMessage的正文的组成部分。 MimeMessag类的以下三个方法都用于设置正文: void setText(Strint txt) void setContent(Object o,String type) void setContent(Multipart mp),14.7.4 邮件正文,如果MimeMessage仅包含纯文本内容,可以通过以下两种方式设置邮件正文: msg.setText(“How are you“); 或者 msg.setContent(“How are you“,“text/plain“); 如果MimeMessage的正文包括多个组成部分,既有纯文本内容,还有若干附件,那就应该先创建一个包含正文的各个组成部分的MimeMultipart对象,然后调用msg.setContent(Multipart mp)方法,把MimeMultipart对象作为邮件的正文。,14.7.4 邮件正文,例程14-7的MailClientSendAttach类创建了一个包括附件的邮件,然后发送该邮件。 这封邮件的正文包括三个组成部分,分别用三个MimeBodyPart对象来表示。第一个MimeBodyPart对象表示邮件的纯文本内容,其他两个MimeBodyPart对象分别表示两个附件。这些MimeBodyPart对象都加入到一个MimeMultipart对象中。 例程14-7 MailClientSendAttach.java import javax.mail.*; import ernet.*; import javax.activation.*; import java.util.*; public class MailClientSendAttach extends MailClientForCitiz private String fromAddr=“java_mail“; /发送者地址 private String toAddr=“java_mail“; /接收者地址,14.7.4 邮件正文,public void sendMessage(String fromAddr,String toAddr) throws Exception /创建一个邮件 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 InternetAddress(fromAddr); String attch1=“attch1.rar“; String attch2=“attch2.rar“; Multipart multipart=new MimeMultipart(); /加入文本内容 MimeBodyPart mimeBodyPart1=new MimeBodyPart(); mimeBodyPart1.setText(“How are you“); multipart.addBodyPart(mimeBodyPart1);,14.7.4 邮件正文,/加入第一个附件 MimeBodyPart mimeBodyPart2=new MimeBodyPart(); FileDataSource fds=new FileDataSource(attch1); /得到数据源 mimeBodyPart2.setDataHandler(new DataHandler(fds); mimeBodyPart2.setDisposition(Part.ATTACHMENT); mimeBodyPart2.setFileName(fds.getName(); /设置文件名 multipart.addBodyPart(mimeBodyPart2); /加入第二个附件 MimeBodyPart mimeBodyPart3=new MimeBodyPart(); fds=new FileDataSource(attch2); /得到数据源 mimeBodyPart3.setDataHandler(new DataHandler(fds); mimeBodyPart3.setDisposition(Part.ATTACHMENT); mimeBodyPart3.setFileName(fds.getName(); /设置文件名 multipart.addBodyPart(mimeBodyPart3); msg.setContent(multipart); /设置邮件的正文 Transport.send(msg); /发送邮件 ,14.7.4 邮件正文,public static void main(String args)throws Exception MailClientSendAttach client=new MailClientSendAttach(); client.init(); client.sendMessage(client.fromAddr,client.toAddr); client.receiveMessage(); client.close(); ,14.7.4 邮件正文,例程14-8的MailClientReadAttach类的processMessage(Message msg)方法演示如何解析并处理可能包括附件的邮件。 public static void processMessage(Message msg)throws Exception processMessageHeader(msg); /处理邮件头部 Object body=msg.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.getName()+“:“+header.getValue(); ,14.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 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); if(contentType.toLowerCase().startsWith(“multipart/“) processMultipart(Multipart)part.getContent(); else if(fileName=null ,14.7.4 邮件正文,/* 续上页: processPart(Part part)方法 */ if(fileName=null) /如果不是附件,打印到控制台 part.writeTo(System.out); System.out.println(); else File file=new File(fileName); /创建一个在文件系统中不存在的文件 for(int i=1;file.exists();i+) String newName=i+“_“+fileName; file=new File(newName); /把附件保存到一个文件中 OutputStream out=new BufferedOutputStream(new FileOutputStream(file); InputStream in=new BufferedInputStream(part.getInputStream(); int b; while(b=in.read()!=-1)out.write(b); out.close(); in.close(); ,14.8 操纵邮件夹,Folder类提供了一系列操纵邮件夹的方法: void open(int mode) :打开邮件夹。参数mode指定打开邮件夹的模式,可选值包括Folder.READ_ONLY(只允许读取邮件夹中的邮件)和Folder.READ_WRITE(允许读取、添加或删除邮件夹中的邮件)。 boolean isOpen():判断邮件夹是否打开。 void close(boolean expunge) :关闭邮件夹。 boolean exists() :判断是否在邮件服务器上存在物理上的邮件夹。 boolean create(int type):在邮件服务器上创建一个物理邮件夹。 参数type指定邮件夹的类型,可选值包括:Folder.HOLDS_FOLDERS(允许包含子邮件夹)和Folder.HOLDS_MESSAGES(允许包含邮件)。如果邮件夹创建成功,就返回true。,14.8 操纵邮件夹,boolean delete(boolean recurse):删除邮件夹。如果删除成功就返回true。 Folder list():返回当前邮件夹下面的所有子邮件夹。 boolean renameTo(Folder f) :修改邮件夹的名字,如果修改成功,就返回true。 Message expunge() :永久删除邮件夹中所有设置了Flags.Flag.DELETE标记的邮件。 Message getMessage(int msgnum) :获得特定的邮件。参数msgnum指定邮件的索引。邮件的索引从1开始。,14.8 操纵邮件夹,int getUnreadMessageCount():返回邮件夹中所有未读邮件(即没有设置Flags.Flag.SEEN标记的邮件)的数目。 int getMessageCount() :返回邮件夹中所有邮件的数目。在有些Folder类的实现中,如果邮件夹未打开,就返回-1。 void appendMessages(Message msgs):向邮件夹中加入邮件。 void copyMessages(Message msgs, Folder folder) :把当前邮件夹中的一些邮件拷贝到参数folder指定的目标邮件夹中。,14.8 操纵邮件夹,Store类的getFolder()方法返回的Folder对象总是处于关闭状态,并且有可能实际上并不存在。 以下程序代码在邮件服务器上创建了物理上的邮件夹draft: Folder folder=store.getFolder(“draft“); if(!folder.exists() folder.create(Folder.HOLDS_MESSAGES);,14.8 操纵邮件夹,在MailClientFolder类的deleteMessage()方法中: 如果邮件不在trash邮件夹中,首先把这个邮件在trash邮件夹中备份,然后把原来邮件夹中的邮件的Flags.Flag.DELETED标记设为true 。 如果邮件在trash邮件夹中,就直接把邮件的Flags.Flag.DELETED标记设为true。 在以上两种情况下,最后都调用待删除邮件所在邮件夹的expunge()方法,该方法永久删除邮件夹中所有Flags.Flag.DELETED标记为true的邮件。,14.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_WRITE); for(int i=0;iarrayOpt.length;i+) if(arrayOpti=0)continue; Message msg=folder.getMessage(i+1); if(!folder
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 职业发展与晋升机会创造策略
- 快速办理二手房买卖合同范文
- 企业内部团建活动组织规定
- 农业科技研发定向捐赠协议
- 员工激励与离职率降低
- 劳务准则上墙
- 农业企业客户资产管理计划
- 交通运输设备租赁资金管理
- 大型活动舞台背景墙绘协议
- 创意产业园区
- 潜油泵及潜油泵加油机讲义
- 医患沟通内容要求记录模板(入院、入院三日、术前、术后、出院)
- 航海学天文定位第四篇第6章天文定位
- 第8章 腹部检查(讲稿)
- 浅谈深度教学中小学数学U型学习模式
- 物理电学暗箱专题30道
- 湿法脱硫工艺计算书
- 江西上饶铅山汽车驾驶科目三考试线路
- 南京农业大学学生在校学习期间现实表现证明
- (医学PPT课件)NT检查规范
- 导电炭黑的用途及使用方法
评论
0/150
提交评论