




已阅读5页,还剩101页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
S,第13章电子邮件的发送和接收,电子邮件(electronicmail,简称e-mail)是因特网上使用最多的一种应用,它为用户在因特网上设立了存放邮件的电子邮箱,发信人可以随时将电子邮件发送到收信人的电子邮箱,收信人也可以随时上网读取,发信人与收信人以异步的方式通信。,NetworkProgramming,S,第13章电子邮件的发送和接收,邮件传输原理1、电子邮件系统的构成一个电子邮件系统包括三个主要的构件,即用户代理,邮件消息传输代理(邮件服务器),和电子邮件使用的协议。如图所示:,NetworkProgramming,S,第13章电子邮件的发送和接收,2、电子邮件系统的实现,NetworkProgramming,S,13.1E-mail协议简介,邮件服务器按照提供的服务类型,可以分为发送邮件服务器(简称发送服务器)和接收邮件服务器(简称接收服务器)。发送邮件服务器使用邮件发送协议,现在常用的是SMTP,所以通常发送邮件服务器也称为SMTP服务器;接收邮件服务器使用接收邮件协议,常用的有POP3协议和IMAP协议,所以通常接收邮件服务器也称为POP3服务器或IMAP服务器。,NetworkProgramming,S,13.1.1SMTP协议简介,SMTP(SimpleMailTransferProtocol),即简单邮件传输协议,是Internet传送E-mail的基本协议,也是TCP/IP协议组的成员。SMTP协议解决邮件系统如何通过一条链路,把邮件从一台机器传送到另一台机器上的问题。SMTP协议的特点是具有良好的可伸缩性,这也是它成功的关键。它既适用于广域网,也适用于局域网。SMTP协议由于非常简单,使得它得到了广泛的运用,在Internet上能够发送邮件的服务器几乎都支持SMTP协议。,NetworkProgramming,S,13.1E-mail协议简介,NetworkProgramming,S,13.1.1SMTP协议简介,SMTP协议采用C/S模式,专用于电子邮件的发送,规定了发信人把邮件发送到收信人的电子邮箱的全过程中,SMTP客户与SMTP服务器这两个相互通信的进程之间应如何交换信息。即规定了SMTP的会话过程。用户直接使用的是用于编写和发送的客户端软件,而通常的SMTP服务器运行在远程站点上。客户/服务器之间的通信是通过TCP/IP协议进行的。SMTP的命令和响应都是基于文本,以命令行为单位,换行符为CR/LF。响应信息一般只有一行,由一个3位数的代码开始,后面可附上很简短的文字说明。SMTP要经过建立连接、传送邮件和释放连接3个阶段。具体如下:,NetworkProgramming,S,13.1.1SMTP协议简介,具体为:(1)建立TCP连接。(2)客户端向服务器发送HELLO命令以标识发件人自己的身份,然后客户端发送MAIL命令。(3)服务器端以OK作为响应,表示准备接收。(4)客户端发送RCPT命令。(说明收信人的电子邮件地址)(5)服务器端表示是否愿意为收件人接收邮件。(6)协商结束,发送邮件,用命令DATA发送输入内容。(7)结束此次发送,用QUIT命令退出。电子邮件系统发邮件时是根据收信人的地址后缀来定位邮件服务器的。SMTP通过用户代理程序(UA)完成邮件的编辑、收取和阅读等功能;通过邮件传输代理程序(MTA)将邮件传送到目的地。,NetworkProgramming,S,13.1.2POP3协议简介,POP3(PostOfficeProtocol3)即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。POP3协议是TCP/IP协议族中的一员,,由RFC1939定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。,NetworkProgramming,S,13.1.3IMAP协议简介,InternetMailAccessProtocol互联网邮件访问协议。IMAP协议它的主要作用是邮件客户端(例如MSOutlookExpress)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。用户可以通过浏览信件头来决定是否收取、删除和检索邮件的特定部分,还可以在服务器上创建或更改文件夹或邮箱,它除了支持POP3协议的脱机操作模式外,还支持联机操作和断连接操作。它为用户提供了有选择的从邮件服务器接收邮件的功能、基于服务器的信息处理功能和共享信箱功能。,NetworkProgramming,S,13.1.4MIME简介,MIME(MultipurposeInternetMailExtensions,多用途Internet邮件扩充标准)不是邮件传输协议,而是对邮件格式所作的规范。它扩展了电子邮件标准,使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。MIME规定了用于表示各种各样的数据类型的符号化方法。MIME是通过标准化电子邮件报文的头部的附加领域(fields)而实现的;这些头部的附加领域,描述新的报文类型的内容和组织形式。,NetworkProgramming,S,13.1.4MIME简介,NetworkProgramming,S,13.1.4MIME简介,内容类型(Content-Type),这个头部领域用于指定消息的类型type有下面的形式。Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;Application:用于传输应用程序数据或者二进制数据;Message:用于包装一个E-mail消息;Image:用于传输静态图片数据;Audio:用于传输音频或者音声数据;Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。,NetworkProgramming,S,13.2JavaMailAPI简介,SUN公司制定了JavaMailAPI,它封装了按照各种邮件通信协议,如IMAP、POP3和SMTP,与邮件服务器通信的细节,为Java应用程序提供了收发电子邮件的公共接口,参见图,NetworkProgramming,S,13.2JavaMailAPI简介,JavaMailAPI主要位于javax.mail包和ernet中,图为其中主要类的类框图。,NetworkProgramming,S,13.2JavaMailAPI简介,1.javax.mail.Session类:表示邮件会话,是JavaMailAPI的最高层入口类。Session类定义了基本的邮件会话。就像Http会话那样,我们进行收发邮件的工作都是基于这个会话的。Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息。Session类的构造方法是私有的,所以我们可以使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的Session对象:Propertiesprops=newProperties();Sessionsession=Session.getDefaultInstance(props,null);,NetworkProgramming,S,13.2JavaMailAPI简介,2、javax.mail.Store类:表示接收邮件服务器上的注册用户的存储空间,通过Store类的getFolder()方法,可以访问用户的特定邮件夹。通过javax.mail.Store类可以访问javax.mail.Folder类。我们需要从Session中获取特定类型的Store,然后连接到Store,在连接Store的过程中,极有可能需要用到用户名、密码或者Authenticator。Storestore=session.getStore(imap);Storestore=session.getStore(pop3);store.connect(host,username,password);,NetworkProgramming,S,13.2JavaMailAPI简介,3、javax.mail.Folder类代表邮件夹,邮件都放在邮件夹中,Folder提供了管理邮件夹及邮件的各种方法在连接到Store后,一个Folder对象即目录对象将通过Store的getFolder()方法被返回,我们可从这个Folder中读取邮件信息:Folderfolder=store.getFolder(INBOX);folder.open(Folder.READ_ONLY);,NetworkProgramming,S,13.2JavaMailAPI简介,4、javax.mail.Message类代表电子邮件,封装了实际email消息的所有细节,如标题、发送/接收地址、发送日期等,提供了读取和设置邮件内容的方法。Message是一个抽象类,大多数情况下,我们使用ernet.MimeMessage这个子类,该类是使用MIME类型、MIME信息头的邮箱信息。为了建立一个MimeMessage对象,我们必须将Session对象作为MimeMessage构造方法的参数传入:MimeMessagemessage=newMimeMessage(session);message.setFrom(newInternetAddress(from);message.addRecipient(Message.RecipientType.TO,newInternetAddress(to);message.setSubject(HelloJavaMail);message.setText(WelcometoJavaMail);,NetworkProgramming,S,13.2JavaMailAPI简介,5、javax.mail.Address类:邮件地址类,像Message一样,Address类也是一个抽象类,所以我们将使用ernet.InternetAddress这个子类。通过传入代表邮件地址的字符串,我们可以建立一个邮件地址类:Addressaddress=newInternetAddress();,NetworkProgramming,S,13.2JavaMailAPI简介,6、javax.mail.Transport类:在发送信息时,Transport类将被用到。这个类实现了发送信息的协议(通称为SMTP),此类是一个抽象类,我们可以使用这个类的静态方法send()来发送消息。Transporttransport=session.getTransport(smtp);transport.connect(host,username,password);transport.sendMessage(message,message.getAllRecipients();transport.close();,NetworkProgramming,S,13.2JavaMailAPI简介,7、javax.mail.Authenticator类:像类那样,JavaMailAPI通过使用授权者类(Authenticator是一个抽象类)以用户名、密码的方式访问那些受到保护的资源,在这里“资源”就是指邮件服务器。下面代码片断中的MyAuthenticator就是一个Authenticator的子类。Propertiesprops=newProperties();Authenticatorauth=newMyAuthenticator();Sessionsession=Session.getDefaultInstance(props,auth);,NetworkProgramming,S,13.3建立JavaMail应用程序的开发环境,JDK中并不包含JavaMailAPI。为了开发JavaMail应用程序,需要从SUN公司的网站下载JavaMailAPI及其实现的类库,该类库由两个JAR文件组成:mail.jar和activation.jar。,NetworkProgramming,S,13.3建立JavaMail应用程序的开发环境,1安装JavaMail为了使用JavaMailAPI,需要从,NetworkProgramming,S,13.3建立JavaMail应用程序的开发环境,2安装JavaBeansActivationFramework从,NetworkProgramming,S,13.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);/指定支持SMTP协议的Transport具体类,允许由第三方提供。props.put(mail.imap.class,com.sun.mail.imap.IMAPStore);/指定支持IMAP协议的Store具体类,允许由第三方提供。props.put(mail.smtp.host,hostname);/指定采用SMTP协议的邮件发送服务器的IP地址或主机名。,NetworkProgramming,S,13.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类的实例。,NetworkProgramming,S,13.4创建JavaMail应用程序,步骤(4)调用Store对象的connect()方法连接到接收邮件服务器。调用connect()方法时,应该指定接收邮件服务器的主机名或IP地址、用户名和口令。store.connect(hostname,username,password);,NetworkProgramming,S,13.4创建JavaMail应用程序,获得了Store对象后,就可以通过它来访问邮件服务器上的特定邮件用户了。通常会对邮件用户执行以下操作。操作(一)创建并发送邮件:/创建邮件msg=newMimeMessage(mailsession);InternetAddresstoAddrs=InternetAddress.parse(admin,false);/设置邮件接收者msg.setRecipients(Message.RecipientType.TO,toAddrs);/设置邮件的主题msg.setSubject(hello);,NetworkProgramming,S,13.4创建JavaMail应用程序,/设置邮件的发送者msg.setFrom(newInternetAddress(admin);/设置邮件的正文msg.setText(Howareyou);/发送邮件Transport.send(msg);Transport的静态方法send(Message)负责发送邮件服务器,邮件发送协议由tocol属性指定,邮件发送服务器由mail.smtp.host属性指定。,NetworkProgramming,S,13.4创建JavaMail应用程序,操作(二)打开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邮件夹是邮件用户的保留邮件夹,用户不允许删除该邮件夹,邮件服务器把所有接收到的新邮件都存在该邮件夹中。,NetworkProgramming,S,13.4创建JavaMail应用程序,操作(三)从邮件夹中读取邮件:/从邮件夹中读取第一封邮件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();,NetworkProgramming,S,13.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);,NetworkProgramming,S,13.5身份验证,NetworkProgramming,S,13.6URLName类,javax.mail.URLName类表示URL的名字,URLName类与.URL类的区别在于:URLName类不尝试连接目标地址。构造URLName对象时,无需指定协议处理器。URLName类可以表示非标准的URL地址。比如URLName对象可以表示接收邮件服务器上的特定邮件夹,形式为:协议名:/用户名:口令主机:端口/邮件夹,NetworkProgramming,S,13.6URLName类,URLName类中包括以下getXXX()方法:getProtocol():获得URL名字中的协议。getHost():获得URL名字中的主机。getUsername():获得URL名字中的用户名。getPassword():获得URL名字中的口令。getFile():获得URL名字中的文件名或者邮件夹名,NetworkProgramming,S,13.6URLName类,URLName类中包括以下getXXX()方法:getProtocol():获得URL名字中的协议。getHost():获得URL名字中的主机。getUsername():获得URL名字中的用户名。getPassword():获得URL名字中的口令。getFile():获得URL名字中的文件名或者邮件夹名。,NetworkProgramming,S,13.6URLName类,例程14-5的MailClientURLName类的init(URLNameurlName)方法从一个URLName对象中获取连接到接收邮件服务器的各种信息。这个URLName对象表示的URL名字为:imap:/admin:1234localhost/publicvoidinit(URLNameurlName)throwsExceptionreceiveProtocol=urlName.getProtocol();receiveHost=urlName.getHost();username=urlName.getUsername();password=urlName.getPassword();,NetworkProgramming,S,13.6URLName类,/设置属性Propertiesprops=newProperties();props.put(mail.smtp.host,sendHost);/创建Session对象session=Session.getDefaultInstance(props);/创建Store对象store=session.getStore(receiveProtocol);/连接到邮件服务器store.connect(receiveHost,username,password);,NetworkProgramming,S,13.7创建和读取复杂电子邮件,如图所示,按照MIME规范,电子邮件包括邮件头和正文两部分。邮件头中包括日期、发送者地址、接收者地址和主题等信息。正文部分可以包括普通文本内容,还可以包括一个或多个附件。,NetworkProgramming,S,13.7创建和读取复杂电子邮件,javax.mail.Message抽象类表示邮件,它的具体子类为javax.mail.MimeMessage类,它提供了读取和设置邮件中各个部分的getXXX()和setXXX()方法:setSubject(Stringsubject)方法设置邮件的主题。setHeader(Stringname,Stringvalue)方法设置邮件头部的某一项。setContent(Objecto,Stringtype)方法设置邮件的正文。,NetworkProgramming,S,13.7.1邮件地址,javax.mail.Address抽象类表示邮件地址,它的最常用的子类是javax.mail.InternetAddress类。InternetAddress类表示Internet网上通用的邮件地址,形式为admin,或者“Admin”。InternetAddress类提供了一系列get和set方法,用来读取和设置address、personal和charset等属性,例如:getAddress():读取address属性。getPersonal():读取personal属性。setAddress(Stringaddress):设置address属性。setPersonal(Stringpersonal):设置personal属性。,NetworkProgramming,S,13.7.1邮件地址,以下两段代码是等价的:InternetAddressaddr=newInternetAddress(admin,Admin);或者:InternetAddressaddr=newInternetAddress();addr.setAddress(admin);addr.setPersonal(Admin);,NetworkProgramming,S,13.7.1邮件地址,MimeMessage类的以下方法用于读取或设置邮件中的地址信息:AddressgetFrom():读取发送者的邮件地址。AddressgetRecipients(Message.RecipientTypetype):读取特定接收类型的邮件地址。voidsetFrom(Addressaddress):设置发送者的邮件地址。voidsetRecipients(Message.RecipientTypetype,Addressaddresses):设置特定接收类型的邮件地址,参数addresses指定多个接收地址。voidsetRecipients(Message.RecipientTypetype,Stringaddresses):设置特定接收类型的邮件地址,参数addresses指定一个接收地址。,NetworkProgramming,S,13.7.1邮件地址,Message.RecipientType类型的静态常量表示地址类型,包括:Message.RecipientType.TO:主接收地址。Message.RecipientType.CC:抄送地址。Message.RecipientType.BCC:广播地址。,NetworkProgramming,S,13.7.1邮件地址,以下程序代码设置了邮件的各项邮件地址:MimeMessagemsg=newMimeMessage(session);InternetAddressfrom=newInternetAddress(admin);InternetAddressto=InternetAddress.parse(admin,java_mail);InternetAddresscc=newInternetAddress(linda_j2ee);InternetAddressbcc=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);,NetworkProgramming,S,13.7.2邮件头部,MimeMessage类的以下getXXX()和setXXX()方法用于读取和设置邮件头部的特定项:StringgetHeader(Stringname)voidsetHeader(Stringname,Stringvalue)以下两段代码的作用是等价的,它们的作用都是设置邮件的主题:msg.setHeader(subject,hello);或者:msg.setSubject(hello);,NetworkProgramming,S,13.7.2邮件头部,MimeMessage类的getAllHeaders()方法返回一个包含Header对象的Enumeration对象,每个Header对象表示邮件头部的一项。以下程序代码遍历邮件头部的所有项:for(Enumeratione=msg.getAllHeaders();e.hasMoreElements();)Headerheader=e.nextElement();System.out.println(header.getName()+:“+header.getValue();,NetworkProgramming,S,13.7.3邮件标记,多数接收邮件服务器允许邮件包含特定的标记信息,这些标记可以使用户更方便的管理邮件。JavaMailAPI用javax.mail.Flags类的Flags.Flag内部类的静态实例来表示标记:Flags.Flag.ANSWERED:表示邮件已经回复。该标记由客户程序设置。Flags.Flag.DELETED:表示邮件已经被删除。该标记由客户程序设置。Flags.Flag.RECENT:表示刚刚被添加到邮件夹的邮件,即最近一次打开邮件夹时,被添加到邮件夹的邮件。该标记由Folder类的实现来设置,客户程序只能读取该标记。,NetworkProgramming,S,13.7.3邮件标记,Flags.Flag.FLAGGED:表示邮件已经作了某种标记。客户程序可以设置该标记。Flags.Flag.SEEN:表示邮件已经被阅读。该标记由JavaMailAPI的实现来设置。当客户程序调用了邮件的getContent()方法时,该邮件被加上Flags.Flag.SEEN标记。客户程序可以修改这个标记。Flags.Flag.DRAFT:表示邮件是草稿。该标记由客户程序设置。Flags.Flag.USER:表示邮件所在的邮件夹支持用户自定义的标记。该标记由接收邮件服务器设置,客户程序只能读取该标记。客户程序可以通过folder.getPermanentFlags().contains(Flags.Flag.USER)方法判断邮件夹是否支持用户自定义的标记。,NetworkProgramming,S,13.7.3邮件标记,MimeMessage类提供了三个与标记有关的方法:voidsetFlags(Flagsflags,booleanset):设置或取消一组标记。voidsetFlags(Flags.Flag,booleanset):设置或取消特定标记。booleanisSet(Flags.Flagflag):察看是否设置了某个标记。,NetworkProgramming,S,13.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);,NetworkProgramming,S,13.7.3邮件标记,如果邮件所在的邮件夹支持用户标记,还可以通过以下方式为邮件加上具有特殊含义的用户标记:Flagsflags=newFlags();flags.add(privateemail);flags.add(abouttravelling);msg.setFlags(flags,true);/表示这是一封关于旅游的私人信件,NetworkProgramming,NetworkProgramming,S,13.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);,NetworkProgramming,S,13.7.3邮件标记,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)/读取用户标记StringuserFlags=msg.getFlags().getUserFlags();for(inti=0;iuserFlags.length;i+)System.out.println(UserFlag:+userFlagsi);,NetworkProgramming,S,13.7.4邮件正文,邮件正文是邮件中最复杂的一部分,正文可以是纯文本,还可以包括若干附件。JavaMailAPI把邮件正文的各个组成部分以及整个邮件都抽象为部件,部件用javax.mail.Part接口表示。一个Part对象和一个DataHandler对象关联,DataHandler对象负责处理部件包含的数据。Part接口有两个子接口:MimePart接口和BodyPart接口。MimePart接口表示符合MIME规范的部件。BodyPart接口表示可以作为邮件正文的组成部分的部件。,NetworkProgramming,S,13.7.4邮件正文,Part接口及其相关类的类框图,NetworkProgramming,S,13.7.4邮件正文,MimeBodyPart类实现了MimePart接口和BodyPart接口,因此MimeBodyPart对象可以作为MimeMessage的正文的组成部分。MimeMessag类的以下三个方法都用于设置正文:voidsetText(Strinttxt)voidsetContent(Objecto,Stringtype)voidsetContent(Multipartmp),NetworkProgramming,S,13.7.4邮件正文,如果MimeMessage仅包含纯文本内容,可以通过以下两种方式设置邮件正文:msg.setText(Howareyou);或者msg.setContent(Howareyou,text/plain);如果MimeMessage的正文包括多个组成部分,既有纯文本内容,还有若干附件,那就应该先创建一个包含正文的各个组成部分的MimeMultipart对象,然后调用msg.setContent(Multipartmp)方法,把MimeMultipart对象作为邮件的正文。,NetworkProgramming,S,13.7.4邮件正文,例程的MailClientSendAttach类创建了一个包括附件的邮件,然后发送该邮件。这封邮件的正文包括三个组成部分,分别用三个MimeBodyPart对象来表示。第一个MimeBodyPart对象表示邮件的纯文本内容,其他两个MimeBodyPart对象分别表示两个附件。这些MimeBodyPart对象都加入到一个MimeMultipart对象中。,NetworkProgramming,NetworkProgramming,S,13.7.4邮件正文,例程MailClientSendAttach.javaimportjavax.mail.*;ernet.*;importjavax.activation.*;importjava.util.*;publicclassMailClientSendAttachextendsMailClientForCitizprivateStringfromAddr=java_mail;/发送者地址privateStringtoAddr=java_mail;/接收者地址,NetworkProgramming,NetworkProgramming,S,13.7.4邮件正文,publicvoidsendMessage(StringfromAddr,StringtoAddr)throwsException/创建一个邮件Messagemsg=newMimeMessage(session);InternetAddresstoAddrs=InternetAddress.parse(toAddr,false);msg.setRecipients(Message.RecipientType.TO,toAddrs);msg.setSubject(hello);msg.setSentDate(newDate();msg.setFrom(newInternetAddress(fromAddr);,NetworkProgramming,S,13.7.4邮件正文,Stringattch1=attch1.rar;Stringattch2=attch2.rar;Multipartmultipart=newMimeMultipart();/加入文本内容MimeBodyPartmimeBodyPart1=newMimeBodyPart();mimeBodyPart1.setText(Howareyou);multipart.addBodyPart(mimeBodyPart1);,NetworkProgramming,S,13.7.4邮件正文,/加入第一个附件MimeBodyPartmimeBodyPart2=newMimeBodyPart();FileDataSourcefds=newFileDataSource(attch1);/得到数据源mimeBodyPart2.setDataHandler(newDataHandler(fds);mimeBodyPart2.setDisposition(Part.ATTACHMENT);/标识本部件为附件mimeBodyPart2.setFileName(fds.getName();/设置文件名(与原文件名同)multipart.addBodyPart(mimeBodyPart2);/将附件添加到正文对象,NetworkProgramming,S,13.7.4邮件正文,/加入第二个附件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);/发送邮件,NetworkProgramming,S,13.7.4邮件正文,publicstaticvoidmain(Stringargs)throwsExceptionMailClientSendAttachclient=newMailClientSendAttach();client.init();client.sendMessage(client.fromAddr,client.toAddr);client.close();,NetworkProgramming,S,13.7.5邮件接收,例程的MailClientReadAttach类的processMessage(Messagemsg)方法演示如何解析并处理可能包括附件的邮件。publicstaticvoidprocessMessage(Messagemsg)throwsExceptionprocessMessageHeader(msg);/处理邮件头部Objectbody=msg.getContent();/获得邮件正文if(bodyinstanceofMultipart)processMultipart(Multipart)body);elseprocessPart(msg);,NetworkProgramming,S,13.7.5邮件接收(处理邮件头部),publicstaticvoidprocessMessageHeader(Messagemsg)throwsExceptionfor(Enumeratione=msg.getAllHeaders();e.hasMoreElements();)Headerheader=e.nextElement();System.out.println(header.getName()+:+header.getValue();,NetworkProgramming,S,13.7.5邮件接收(邮件正文),附件的获取:从消息中获取附件比发送它们棘手些,因为MIME没有简单的关于附件的概念。当消息包含附件时,消息的内容是个Multipart对象。接着,您需要处理每个Part,获取主要内容和附件。标有从part.getDisposition()获得的Part.ATTACHMENT配置(disposition)的部件(Part)无疑就是附件。但是,没有配置(以及一个非文本MIME类型)和带Part.INLINE配置的部件也可能是附件。当配置要么是Part.ATTACHMENT,要么是Part.INLINE时,这个消息部件的内容就能被保存。只要用getFileName()和getInputStream()就能分别得到原始文件名和输入流。,NetworkProgramming,S,13.7.5邮件接收(邮件正文),publicstaticvoidprocessMultipart(Multipartmp)throwsExceptionfor(inti=0;imp.getCount();i+)();/Miltipart的数量,比如多个附件processPart(mp.getBodyPart(i);publicstaticvoidprocessPart(Partpart)throwsExceptionStr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 未来企业市场策略与风险管理的有效结合试题及答案
- 2025年法学概论学习成果评估及答案
- 2025届黑龙江省哈尔滨市69中学八下数学期末考试模拟试题含解析
- 2025届湖南省长沙市大附中博才实验中学数学八下期末复习检测模拟试题含解析
- 网络知识深度解析试题及答案
- 2025届四川省广安市名校数学七下期末质量跟踪监视试题含解析
- 2025年计算机二级VB考试必读试题及答案
- 法学概论法律与社会变革的互动关系试题及答案
- 重庆市巴南区七校共同体2025年数学八下期末学业质量监测试题含解析
- 河北省唐山市路北区2025年七年级数学第二学期期末经典试题含解析
- 营销策划模版课件
- 第1本书出体旅程journeys out of the body精教版2003版
- 消防系统介绍与维护管理-副本详解知识讲解
- GB_T9578-2021 工业参比炭黑4#(高清最新版)
- (精选)社区管理网上形成性考核作业
- 灸法操作规程完整
- 热力学与统计物理PPT课件
- 恩格勒系统整理17页
- 时钟监控用户手册
- 道路路面恢复施工方案
- 二年级下册三位数列竖式计算(一千道)
评论
0/150
提交评论