![chapter14通过JavaMailAPI收发邮件_第1页](http://file4.renrendoc.com/view3/M01/0F/3A/wKhkFmYJmc6AferUAACUavZw9uI579.jpg)
![chapter14通过JavaMailAPI收发邮件_第2页](http://file4.renrendoc.com/view3/M01/0F/3A/wKhkFmYJmc6AferUAACUavZw9uI5792.jpg)
![chapter14通过JavaMailAPI收发邮件_第3页](http://file4.renrendoc.com/view3/M01/0F/3A/wKhkFmYJmc6AferUAACUavZw9uI5793.jpg)
![chapter14通过JavaMailAPI收发邮件_第4页](http://file4.renrendoc.com/view3/M01/0F/3A/wKhkFmYJmc6AferUAACUavZw9uI5794.jpg)
![chapter14通过JavaMailAPI收发邮件_第5页](http://file4.renrendoc.com/view3/M01/0F/3A/wKhkFmYJmc6AferUAACUavZw9uI5795.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年电子书阅读器项目可行性研究报告
- 2025至2031年中国独立收线机行业投资前景及策略咨询研究报告
- 2025年机车空调电源整机测试仪项目可行性研究报告
- 2025年室内型温度传感器/变送器项目可行性研究报告
- 2025至2031年中国刚性防水干混砂浆行业投资前景及策略咨询研究报告
- 2025年冲浪板项目可行性研究报告
- 2025年上嘴过滤瓶项目可行性研究报告
- 2025至2030年高光水性高耐磨上光油项目投资价值分析报告
- 2025至2030年金属瓷牙项目投资价值分析报告
- 2025至2030年耐磨高锰钢轧臼壁项目投资价值分析报告
- 消防器材与消防设施的维护与检查
- 【理特咨询】2024生成式人工智能GenAI在生物医药大健康行业应用进展报告
- 2025年中国中煤能源股份有限公司招聘笔试参考题库含答案解析
- 2024年度碳陶刹车盘分析报告
- 2025年春新外研版(三起)英语三年级下册课件 Unit6第1课时Startup
- 2025年1月 浙江首考英语试卷
- 十首最美的唐诗
- 2024年中考二轮专题复习道德与法治主观题答题技巧(小论文)之演讲稿
- 质检工作计划书2025质检部工作计划范文
- 施工现场5S管理规范
- 《缠论的实战技法》课件
评论
0/150
提交评论