chapter14-通过JavaMailAPI收发邮件

上传人:gp****x 文档编号:243086539 上传时间:2024-09-15 格式:PPT 页数:65 大小:261.50KB
返回 下载 相关 举报
chapter14-通过JavaMailAPI收发邮件_第1页
第1页 / 共65页
chapter14-通过JavaMailAPI收发邮件_第2页
第2页 / 共65页
chapter14-通过JavaMailAPI收发邮件_第3页
第3页 / 共65页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,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,操纵邮件夹,1,14.1 E-mail,协议简介,邮件服务器按照提供的服务类型,可以分为发送邮件服务器(简称发送服务器)和接收邮件服务器(简称接收服务器)。,发送邮件服务器使用邮件发送协议,现在常用的是,SMTP,,所以通常发送邮件服务器也称为,SMTP,服务器;,接收邮件服务器使用接收邮件协议,常用的有,POP3,协议和,IMAP,协议,所以通常接收邮件服务器也称为,POP3,服务器或,IMAP,服务器。,2,14.1 E-mail,协议简介,3,14.1.1 SMTP,简单邮件传输协议,SMTP,(,Simple Mail Transfer Protocol,),即简单邮件传输协议,是,Internet,传送,E-mail,的基本协议,也是,TCP/IP,协议组的成员。,SMTP,协议解决邮件系统如何通过一条链路,把邮件从一台机器传送到另一台机器上的问题。,SMTP,协议的特点是具有良好的可伸缩性,这也是它成功的关键。它既适用于广域网,也适用于局域网。,SMTP,协议由于非常简单,使得它得到了广泛的运用,在,Internet,上能够发送邮件的服务器几乎都支持,SMTP,协议。,4,14.1.2 POP3,邮局协议,POP3,(,Post Office Protocol 3,),即邮局协议第,3,版,是,Internet,接收邮件的基本协议,也是,TCP/IP,协议组的成员。,RFC1939,描述了,POP3,协议,网址为,“,”,。,POP3,既允许接收服务器向邮件用户发送邮件,也可以接收来自,SMTP,服务器的邮件。,邮件客户端软件会与,POP3,服务器交互,下载由,POP3,服务器接收到的邮件。基于,POP3,协议的邮件系统能提供快速、经济和方便的邮件接收服务,深受用户的青睐。,5,14.1.3,接收邮件的新协议,IMAP,IMAP,(,Internet Message Access Protocol,),即互联网消息访问协议,是一种功能比,POP3,更强大的新的接收邮件协议。目前最新的,IMAP,协议版本为,IMAP4,,,RFC2060,描述了,IMAP4,,网址为,“,”,。,IMAP4,与,POP3,协议一样提供了方便的下载邮件服务,允许用户在脱机状态下阅读已经下载到本地硬盘的邮件。但,IMAP4,的功能远远不只这些,它还具有以下功能:,摘要浏览邮件的功能。,选择性下载附件的功能。,鼓励用户把邮件一直存储在邮件服务器上。,允许用户把远程邮件服务器上的邮箱作为信息存储工具。,6,14.1.4 MIME,简介,MIME,(,Multipurpose Internet Mail Extensions,,多用途,Internet,邮件扩充标准)不是邮件传输协议,而是对邮件格式所作的规范。,RFC2045,、,RFC2046,和,RFC2047,对,MIME,作了描述。,MIME,是对,RFC822,的扩充,,RFC822,规定了内容只包括采用,ASCII,编码的纯文本的邮件的格式,而,MIME,允许在邮件中包含附件。,7,14.2 JavaMail API,简介,SUN,公司制定了,JavaMail API,,它封装了按照各种邮件通信协议,如,IMAP,、,POP3,和,SMTP,,与邮件服务器通信的细节,为,Java,应用程序提供了收发电子邮件的公共接口,参见图,14-2,。,8,14.2 JavaMail API,简介,JavaMail API,主要位于,javax.mail,包和,javax.mail.internet,中,图,14-3,为其中主要类的类框图。,9,14.2 JavaMail API,简介,1. javax.mail.Session,类:表示邮件会话,是,JavaMail API,的最高层入口类。,2,javax.mail.Store,类:表示接收邮件服务器上的注册用户的存储空间,通过,Store,类的,getFolder(),方法,可以访问用户的特定邮件夹。,3. javax.mail.Folder,类:代表邮件夹。,4. javax.mail.Message,类:代表电子邮件。,5. javax.mail.Address,类:代表邮件地址。,6. javax.mail.Transport,类:根据指定的邮件发送协议(通常是,SMTP,),通过指定的邮件发送服务器来发送邮件。,10,14.3,建立,JavaMail,应用程序的开发环境,JDK,中并不包含,JavaMail API,。为了开发,JavaMail,应用程序,需要从,SUN,公司的网站下载,JavaMail API,及其实现的类库,该类库由两个,JAR,文件组成,: mail.jar,和,activation.jar,。,另外,为了运行本课介绍的程序,还应该准备好可以访问的邮件服务器。本课选用,Merak,邮件服务器,它是一个商业邮件服务器,支持,STMP,、,POP3,和,IMAP,协议。可以从网站上下载它的试用版本。,11,14.4,创建,JavaMail,应用程序,假定邮件服务器安装在本地计算机上,客户程序访问邮件服务器的用户需要提供如下信息,:,String hostname = localhost;,String username = admin;,String password = 1234;,12,14.4,创建,JavaMail,应用程序,JavaMail,应用程序在初始化过程中需要执行如下步骤。,步骤(,1,)设置,JavaMail,属性:,Properties props = new Properties();,props.put(mail.transport.protocol, smtp);,props.put(mail.store.protocol, 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);,13,14.4,创建,JavaMail,应用程序,以上代码设置了如下,JavaMail,属性:,mail.transport.protocol,:指定邮件发送协议。,mail.store.protocol,:指定邮件接收协议。,mail.smtp.class,:指定支持,SMTP,协议的,Transport,具体类,允许由第三方提供。,mail.imap.class,:指定支持,IMAP,协议的,Store,具体类,允许由第三方提供。,mail.smtp.host,:指定采用,SMTP,协议的邮件发送服务器的,IP,地址或主机名。,14,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,类的实例。,15,14.4,创建,JavaMail,应用程序,步骤,(,4,)调用,Store,对象的,connect(),方法连接到接收邮件服务器。调用,connect(),方法时,应该指定接收邮件服务器的主机名或,IP,地址、用户名和口令。,store.connect(hostname,username, password);,16,14.4,创建,JavaMail,应用程序,获得了,Store,对象后,就可以通过它来访问邮件服务器上的特定邮件用户了。通常会对邮件用户执行以下操作。,操作(,1,)创建并发送邮件:,/,创建邮件,msg = new MimeMessage(mailsession);,InternetAddress toAddrs =InternetAddress.parse(, false);,/,设置邮件接收者,msg.setRecipients(Message.RecipientType.TO, toAddrs);,/,设置邮件的主题,msg.setSubject(hello);,/,设置邮件的发送者,msg.setFrom(new InternetAddress();,/,设置邮件的正文,msg.setText(How are you);,/,发送邮件,Transport.send(msg);,Transport,的静态方法,send(Message),负责发送邮件服务器,邮件发送协议由,mail.transport.protocol,属性指定,邮件发送服务器由,mail.smtp.host,属性指定。,17,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,邮件夹是邮件用户的保留邮件夹,用户不允许删除该邮件夹,邮件服务器把所有接收到的新邮件都存在该邮件夹中。,18,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();,19,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);,20,14.5,身份验证,21,14.6 URLName,类,javax.mail.URLName,类表示,URL,的名字,,URLName,类与,.URL,类的区别在于:,URLName,类不尝试连接目标地址。构造,URLName,对象时,无需指定协议处理器。,URLName,类可以表示非标准的,URL,地址。比如,URLName,对象可以表示接收邮件服务器上的特定邮件夹,形式为:,协议名,:/,用户名,:,口令,主机,:,端口,/,邮件夹,22,14.6 URLName,类,URLName,类中包括以下,getXXX(),方法:,getProtocol(),:获得,URL,名字中的协议。,getHost(),:获得,URL,名字中的主机。,getUsername(),:获得,URL,名字中的用户名。,getPassword(),:获得,URL,名字中的口令。,getFile(),:获得,URL,名字中的文件名或者邮件夹名。,23,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);,24,14.7,创建和读取复杂电子邮件,如图,14-9,所示,按照,MIME,规范,电子邮件包括邮件头和正文两部分。邮件头中包括日期、发送者地址、接收者地址和主题等信息。正文部分可以包括普通文本内容,还可以包括一个或多个附件。,25,14.7,创建和读取复杂电子邮件,javax.mail.Message,抽象类表示邮件,它的具体子类为,javax.mail.MimeMessage,类,它提供了读取和设置邮件中各个部分的,getXXX(),和,setXXX(),方法:,setSubject(String subject),方法设置邮件的主题。,setHeader(String name, String value),方法设置邮件头部的某一项。,setContent(Object o, String type),方法设置邮件的正文。,26,14.7.1,邮件地址,javax.mail.Address,抽象类表示邮件地址,它的最常用的子类是,javax.mail.InternetAddress,类。,InternetAddress,类表示,Internet,网上通用的邮件地址,形式为,或者,“,Admin,”,。,27,14.7.1,邮件地址,InternetAddress,类提供了一系列,get,和,set,方法,用来读取和设置,address,、,personal,和,charset,等属性,例如:,getAddress(),:读取,address,属性。,getPersonal(),:读取,personal,属性。,setAddress(String address),:设置,address,属性。,setPersonal(String personal),:设置,personal,属性。,28,14.7.1,邮件地址,以下两段代码是等价的:,InternetAddress addr=,new InternetAddress(,Admin);,或者:,InternetAddress addr=new InternetAddress();,addr.setAddress();,addr.setPersonal(Admin);,29,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,指定一个接收地址。,30,14.7.1,邮件地址,Message.RecipientType,类型的静态常量表示地址类型,包括:,Message.RecipientType.TO,:主接收地址。,Message.RecipientType.CC,:抄送地址。,Message.RecipientType.BCC,:广播地址。,31,14.7.1,邮件地址,以下程序代码设置了邮件的各项邮件地址:,MimeMessage msg=new MimeMessage(session);,InternetAddress from= new InternetAddress();,InternetAddress to =InternetAddress.parse(,);,InternetAddress cc= new InternetAddress();,InternetAddress bcc =InternetAddress.parse(,);,msg.setFrom(from);,msg.setRecipients(Message.RecipientType.TO, to);,msg.setRecipients(Message.RecipientType.CC, cc);,msg.setRecipients(Message.RecipientType.BCC, bcc);,32,14.7.2,邮件头部,MimeMessage,类的以下,getXXX(),和,setXXX(),方法用于读取和设置邮件头部的特定项:,String getHeader(String name),void setHeader(String name, String value),33,14.7.2,邮件头部,以下两段代码的作用是等价的,它们的作用都是设置邮件的主题:,msg.setHeader(subject,hello);,或者:,msg.setSubject(hello);,34,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();,35,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),方法判断邮件夹是否支持用户自定义的标记。,36,14.7.3,邮件标记,MimeMessage,类提供了三个与标记有关的方法:,void setFlags(Flags flags,boolean set),:设置或取消一组标记。,void setFlags(Flags.Flag,boolean set),:设置或取消特定标记。,boolean isSet(Flags.Flag flag),:察看是否设置了某个标记。,37,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);,38,14.7.3,邮件标记,如果邮件所在的邮件夹支持用户标记,还可以通过以下方式为邮件加上具有特殊含义的用户标记:,Flags flags=new Flags();,flags.add(private email);,flags.add(about travelling);,msg.setFlags(flags,true); /,表示这是一封关于旅游的私人信件,39,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);,40,14.7.4,邮件正文,邮件正文是邮件中最复杂的一部分,正文可以是纯文本,还可以包括若干附件。,JavaMail API,把邮件正文的各个组成部分以及整个邮件都抽象为部件,部件用,javax.mail.Part,接口表示。,一个,Part,对象和一个,DataHandler,对象关联,,DataHandler,对象负责处理部件包含的数据。,Part,接口有两个子接口:,MimePart,接口和,BodyPart,接口。,MimePart,接口表示符合,MIME,规范的部件。,BodyPart,接口表示可以作为邮件正文的组成部分的部件。,41,14.7.4,邮件正文,图,14-10 Part,接口及其相关类的类框图,42,14.7.4,邮件正文,MimeBodyPart,类实现了,MimePart,接口和,BodyPart,接口,因此,MimeBodyPart,对象可以作为,MimeMessage,的正文的组成部分。,MimeMessag,类的以下三个方法都用于设置正文:,void setText(Strint txt),void setContent(Object o,String type),void setContent(Multipart mp),43,14.7.4,邮件正文,如果,MimeMessage,仅包含纯文本内容,可以通过以下两种方式设置邮件正文:,msg.setText(How are you);,或者,msg.setContent(How are you,text/plain);,如果,MimeMessage,的正文包括多个组成部分,既有纯文本内容,还有若干附件,那就应该先创建一个包含正文的各个组成部分的,MimeMultipart,对象,然后调用,msg.setContent(Multipart mp),方法,把,MimeMultipart,对象作为邮件的正文。,44,14.7.4,邮件正文,例程,14-7,的,MailClientSendAttach,类创建了一个包括附件的邮件,然后发送该邮件。,这封邮件的正文包括三个组成部分,分别用三个,MimeBodyPart,对象来表示。第一个,MimeBodyPart,对象表示邮件的纯文本内容,其他两个,MimeBodyPart,对象分别表示两个附件。这些,MimeBodyPart,对象都加入到一个,MimeMultipart,对象中。,例程,14-7 MailClientSendAttach.java,import javax.mail.*;,import javax.mail.internet.*;,import javax.activation.*;,import java.util.*;,public class MailClientSendAttach extends MailClientForCitiz,private String fromAddr=; /,发送者地址,private String toAddr=; /,接收者地址,45,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);,46,14.7.4,邮件正文,/,加入第一个附件,MimeBodyPart mimeBodyPart2=new MimeBodyPart();,fds=new (attch1); /,得到数据源,mimeBodyPart2.setDataHandler(new DataHandler(fds);,mimeBodyPart2.setDisposition(Part.ATTACHMENT);,mimeBodyPart2.set(fds.getName(); /,设置文件名,multipart.addBodyPart(mimeBodyPart2);,/,加入第二个附件,MimeBodyPart mimeBodyPart3=new MimeBodyPart();,fds=new (attch2); /,得到数据源,mimeBodyPart3.setDataHandler(new DataHandler(fds);,mimeBodyPart3.setDisposition(Part.ATTACHMENT);,mimeBodyPart3.set(fds.getName(); /,设置文件名,multipart.addBodyPart(mimeBodyPart3);,msg.setContent(multipart); /,设置邮件的正文,Transport.send(msg); /,发送邮件,47,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();,48,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();,49,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 ();,String disposition=part.getDisposition();,String contentType=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),| !contentType.toLowerCase().startsWith(text/plain),(attachment,.data).getName();,50,14.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 BufferedOutputStream(new (file);,InputStream in=new BufferedInputStream(part.getInputStream();,int b;,while(b=in.read()!=-1)out.write(b);,out.close();,in.close();,51,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,。,52,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,开始。,53,14.8,操纵邮件夹,int getUnreadMessageCount(),:返回邮件夹中所有未读邮件(即没有设置,Flags.Flag.SEEN,标记的邮件)的数目。,int getMessageCount(),:返回邮件夹中所有邮件的数目。在有些,Folder,类的实现中,如果邮件夹未打开,就返回,-1,。,void appendMessages(Message msgs),:向邮件夹中加入邮件。,void copyMessages(Message msgs, Folder folder),:把当前邮件夹中的一些邮件拷贝到参数,folder,指定的目标邮件夹中。,54,14.8,操纵邮件夹,Store,类的,getFolder(),方法返回的,Folder,对象总是处于关闭状态,并且有可能实际上并不存在。,以下程序代码在邮件服务器上创建了物理上的邮件夹,draft,:,Folder folder=store.getFolder(draft);,if(!folder.exists() folder.create(Folder.HOLDS_MESSAGES);,55,14.8,操纵邮件夹,在,MailClientFolder,类的,deleteMessage(),方法中:,如果邮件不在,trash,邮件夹中,首先把这个邮件在,trash,邮件夹中备份,然后把原来邮件夹中的邮件的,Flags.Flag.DELETED,标记设为,true,。,如果邮件在,trash,邮件夹中,就直接把邮件的,Flags.Flag.DELETED,标记设为,true,。,在以上两种情况下,最后都调用待删除邮件所在邮件夹的,expunge(),方法,该方法永久删除邮件夹中所有,Flags.Flag.DELETED,标记为,true,的邮件。,56,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.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();,57,练习题,1,问题:以下哪个协议允许管理远程邮件服务器上的邮件夹?,选项,:,a) POP3,b) SMTP,c) HTTP,d) IMAP4,答案,: d,58,练习题,2,问题:以下哪些方法属于,Store,类的方法?,选项,:,a) connect(String host,String user,String password),b) getFolder(String name),c) send(Message msg),d) setText(String txt),e) close(),答案,: c,b,e,59,练习题,3,问题:对于以下这段代码,假定接收邮件服务器和发送邮件服务器都需要身份验证,,在哪些行会调用,Authenticator,对象的,getPasswordAuthentication(),方法?,Properties props = new Properties();,props.put(mail.smtp.host, localhost);,props.put(mail.smtp.auth,true);,Authenticator ma=new Authenticator() /,匿名类,public PasswordAuthentication getPasswordAuthentication() ,System.out.println(call getPasswordAuthentication();,return new PasswordAuthentication(username,password);,;,Session session = Session.getDefaultInstance(props,ma); /lineA,Store store = session.getStore(imap); /lineB,store.connect(receiveHost,null, null); /lineC,Message msg = createSimpleMessage(fromAddr,toAddr);,Transport.send(msg); /lineD,60,练习题,3,选项,:,a) lineA,b) lineB,c) lineC,d) lineD,答案,: c,d,61,练习题,4,问题:,假设登入到一个,IMAP,服务器的用户名为,“,Tom,”,,口令为,“,1234,”,,,IMAP,服务器的主机名为,myhost,,以下哪个,URL,地址代表该用户的,inbox,邮件夹?,选项,:,a) imap:/myhost/Tom/1234/inbox,b) imap:/inbox.myhost/Tom/1234/,c) imap:/1234:Tommyhost/inbox,d) imap:/Tom:1234myhost/inbox,答案,: d,62,练习题,5,问题:,以下哪些邮件标记只能被客户程序读取,而不能被客户程序修改?,选项,:,a) Flags.Flag.ANSWERED,b) Flags.Flag.DELETED,c) Flags.Flag.RECENT,d) Flags.Flag.SEEN,e) Flags.Flag.DRAFT,f) Flags.Flag.USER,答案,: c,f,63,练习题,6,问题:,MultiPart,与,BodyPart,之间是什么关系?,选项,:,a),继承,b),依赖,c),组成,d,)实现,答案,: c,64,练习题,7,问题:,Folder,类的,expunge(),方法有什么作用?,选项,:,a),永久删除邮件夹中所有设置了,Flags.Flag.DELETE,标记的邮件。,b),永久删除邮件夹中所有的邮件。,c),给邮件夹中所有邮件加上,Flags.Flag.DELETE,标记。,d),取消邮件夹中所有邮件的,Flags.Flag.DELETE,标记。,答案,: a,65,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 大学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!