电子邮件的发送和接收.ppt_第1页
电子邮件的发送和接收.ppt_第2页
电子邮件的发送和接收.ppt_第3页
电子邮件的发送和接收.ppt_第4页
电子邮件的发送和接收.ppt_第5页
已阅读5页,还剩101页未读 继续免费阅读

下载本文档

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

文档简介

1、第13章 电子邮件的发送和接收,电子邮件(electronic mail,简称e-mail)是因特网上使用最多的一种应用,它为用户在因特网上设立了存放邮件的电子邮箱,发信人可以随时将电子邮件发送到收信人的电子邮箱,收信人也可以随时上网读取,发信人与收信人以异步的方式通信。,Network Programming,第13章 电子邮件的发送和接收,邮件传输原理 1、电子邮件系统的构成 一个电子邮件系统包括三个主要的构件,即用户代理,邮件消息传输代理(邮件服务器),和电子邮件使用的协议。如图所示:,Network Programming,第13章 电子邮件的发送和接收,2、 电子邮件系统的实现,Ne

2、twork Programming,13.1 E-mail协议简介,邮件服务器按照提供的服务类型,可以分为发送邮件服务器(简称发送服务器)和接收邮件服务器(简称接收服务器)。 发送邮件服务器使用邮件发送协议,现在常用的是SMTP,所以通常发送邮件服务器也称为SMTP服务器; 接收邮件服务器使用接收邮件协议,常用的有POP3协议和IMAP协议,所以通常接收邮件服务器也称为POP3服务器或IMAP服务器。,Network Programming,13.1 .1SMTP协议简介,SMTP(Simple Mail Transfer Protocol),即简单邮件传输协议,是Internet传送E-ma

3、il的基本协议,也是TCP/IP协议组的成员。 SMTP协议解决邮件系统如何通过一条链路,把邮件从一台机器传送到另一台机器上的问题。 SMTP协议的特点是具有良好的可伸缩性,这也是它成功的关键。它既适用于广域网,也适用于局域网。 SMTP协议由于非常简单,使得它得到了广泛的运用,在Internet上能够发送邮件的服务器几乎都支持SMTP协议。,Network Programming,13.1 E-mail协议简介,Network Programming,13.1 .1SMTP协议简介,SMTP协议采用C/S模式,专用于电子邮件的发送,规定了发信人把邮件发送到收信人的电子邮箱的全过程中,SMTP

4、客户与SMTP服务器这两个相互通信的进程之间应如何交换信息。即规定了SMTP的会话过程。用户直接使用的是用于编写和发送的客户端软件,而通常的SMTP服务器运行在远程站点上。客户/服务器之间的通信是通过TCP/IP协议进行的。 SMTP的命令和响应都是基于文本,以命令行为单位,换行符为CR/LF。响应信息一般只有一行,由一个3位数的代码开始,后面可附上很简短的文字说明。 SMTP要经过建立连接、传送邮件和释放连接3个阶段。具体如下:,Network Programming,13.1 .1SMTP协议简介,具体为: (1)建立TCP连接。 (2)客户端向服务器发送HELLO命令以标识发件人自己的身

5、份,然后客户端发送MAIL命令。 (3)服务器端以OK作为响应,表示准备接收。 (4)客户端发送RCPT命令。 (说明收信人的电子邮件地址) (5)服务器端表示是否愿意为收件人接收邮件。 (6)协商结束,发送邮件,用命令DATA发送输入内容。 (7)结束此次发送,用QUIT命令退出。 电子邮件系统发邮件时是根据收信人的地址后缀来定位邮件服务器的。SMTP通过用户代理程序(UA)完成邮件的编辑、收取和阅读等功能;通过邮件传输代理程序(MTA)将邮件传送到目的地。,Network Programming,13.1.2 POP3协议简介,POP3(Post Office Protocol 3)即邮局

6、协议的第3个版本, 它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。 它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件, 而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。 POP3协议是TCP/IP协议族中的一员,,由RFC 1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。,Network Programming,13.1 .3 IMAP协议简介,Internet Mail Access Protocol互联网

7、邮件访问协议。IMAP协议它的主要作用是邮件客户端(例如MS Outlook Express)可以通过这种协议从邮件服务器上获取邮件的信息,下载邮件等。 它与POP3协议的主要区别是用户可以不用把所有的邮件全部下载,可以通过客户端直接对服务器上的邮件进行操作。 用户可以通过浏览信件头来决定是否收取、删除和检索邮件的特定部分,还可以在服务器上创建或更改文件夹或邮箱,它除了支持POP3协议的脱机操作模式外,还支持联机操作和断连接操作。它为用户提供了有选择的从邮件服务器接收邮件的功能、基于服务器的信息处理功能和共享信箱功能。,Network Programming,13.1.4 MIME简介,MIM

8、E(Multipurpose Internet Mail Extensions,多用途Internet邮件扩充标准)不是邮件传输协议,而是对邮件格式所作的规范。它扩展了电子邮件标准,使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。 MIME规定了用于表示各种各样的数据类型的符号化方法。MIME是通过标准化电子邮件报文的头部的附加领域(fields)而实现的;这些头部的附加领域,描述新的报文类型的内容和组织形式。,Network Programming,13.1.4 MIME简介,Network Programming,13.1.4 MIME简介,内容类型(Content-Ty

9、pe),这个头部领域用于指定消息的类型type有下面的形式。 Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的; Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据; Application:用于传输应用程序数据或者二进制数据; Message:用于包装一个E-mail消息; Image:用于传输静态图片数据; Audio:用于传输音频或者音声数据; Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。,Network Programming,13.2 JavaMail API简介,SUN公司制定了JavaM

10、ail API,它封装了按照各种邮件通信协议,如IMAP、POP3和SMTP,与邮件服务器通信的细节,为Java应用程序提供了收发电子邮件的公共接口,参见图,Network Programming,13.2 JavaMail API简介,JavaMail API主要位于javax.mail包和ernet中,图为其中主要类的类框图。,Network Programming,13.2 JavaMail API简介,1. javax.mail.Session类:表示邮件会话,是JavaMail API的最高层入口类。 Session类定义了基本的邮件会话。就像Http会话

11、那样,我们进行收发邮件的工作都是基于这个会话的。Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息。 Session类的构造方法是私有的,所以我们可以使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的Session对象: Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null);,Network Programming,13.2 Ja

12、vaMail API简介,2、javax.mail.Store类:表示接收邮件服务器上的注册用户的存储空间,通过Store类的getFolder()方法,可以访问用户的特定邮件夹。 通过javax.mail.Store类可以访问javax.mail.Folder类。 我们需要从Session中获取特定类型的Store,然后连接到 Store,在连接Store的过程中,极有可能需要用到用户名、密码或者Authenticator。 Store store = session.getStore(imap); Store store = session.getStore(pop3); store.co

13、nnect(host, username, password);,Network Programming,13.2 JavaMail API简介,3、javax.mail.Folder类代表邮件夹,邮件都放在邮件夹中,Folder提供了管理邮件夹及邮件的各种方法 在连接到Store后,一个Folder对象即目录对象将通过Store的getFolder()方法被返回,我们可从这个Folder中读取邮件信息: Folder folder = store.getFolder(INBOX); folder.open(Folder.READ_ONLY);,Network Programming,13.2

14、 JavaMail API简介,4、javax.mail.Message类代表电子邮件,封装了实际email消息的所有细节,如标题、发送/接收地址、发送日期等,提供了读取和设置邮件内容的方法。Message是一 个抽象类,大多数情况下,我们使用ernet.MimeMessage这个子类,该类是使用MIME类型、MIME信息头的 邮箱信息。 为了建立一个MimeMessage对象,我们必须将Session对象作为MimeMessage构造方法的参数传入: MimeMessage message = new MimeMessage(session); message.s

15、etFrom(new InternetAddress(from); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to); message.setSubject(Hello JavaMail); message.setText(Welcome to JavaMail);,Network Programming,13.2 JavaMail API简介,5、javax.mail.Address类:邮件地址类,像Message一样,Address类也是一个抽象类,所以我们将使用erne

16、t.InternetAddress这个子类。通过传入代表邮件地址的字符串,我们可以建立一个邮件地址类: Address address = new InternetAddress();,Network Programming,13.2 JavaMail API简介,6、javax.mail.Transport类:在发送信息时,Transport类将被用到。这个类实现了发送信息的协议(通称为SMTP),此类是一个抽象类,我们可以使用这个类的静态方法send()来发送消息。 Transport transport = session.getTransp

17、ort(smtp); transport.connect(host, username, password); transport.sendMessage(message,message.getAllRecipients(); transport.close();,Network Programming,13.2 JavaMail API简介,7、 javax.mail.Authenticator类:像 类那样,JavaMail API通过使用授权者类(Authenticator是一个抽象类)以用户名、密码的方式访问那些受到保护的资源,在这里“资源”就是指邮件服务器。 下面代码片断中的MyAu

18、thenticator就是一个Authenticator的子类。 Properties props = new Properties(); Authenticator auth = new MyAuthenticator(); Session session = Session.getDefaultInstance(props, auth);,Network Programming,13.3 建立JavaMail应用程序的开发环境,JDK中并不包含JavaMail API。为了开发JavaMail应用程序,需要从SUN公司的网站下载JavaMail API及其实现的类库,该类库由两个JAR文件

19、组成: mail.jar和activation.jar。,Network Programming,13.3 建立JavaMail应用程序的开发环境,1安装JavaMail 为了使用JavaMail API,需要从 注意:在安装JavaMail实现之后,我们将在demo目录中发现许多有趣的简单实例程序。 在 安装了JavaMail之后,我们还需要安装JavaBeans Activation Framework,因为这个框架是JavaMail API所需要的。如果我们使用J2EE的话,那么我们并无需单独下载JavaMail,因为它存在于J2EE.jar中,只需将J2EE.jar加入到 CLASSP

20、ATH即可,Network Programming,13.3 建立JavaMail应用程序的开发环境,2安装JavaBeans Activation Framework 从 载JavaBeans Activation Framework,并将其添加到CLASSPATH中。此框架增加了对任何数据块的分类、以及对它们的处理的特性。这些特性是JavaMail API需要的。虽然听起来这些特性非常模糊,但是它对于我们的JavaMail API来说只是提供了基本的MIME类型支持。 到此为止,我们应当把mail.jar和activation.jar都添加到了CLASSPATH中。 当然如果从方便的角度讲

21、,直接把这两个Jar文件复制到JRE目录的lib/ext目录中也可以。,Network Programming,13.4 创建JavaMail应用程序,JavaMail应用程序在初始化过程中需要执行如下步骤。 步骤(1)设置JavaMail属性: Properties props = new Properties(); props.put(“tocol”, “smtp”);/指定邮件发送协议 props.put(tocol, imap);/指定邮件接收协议 props.put(mail.smtp.class, com.sun.ma

22、il.smtp.SMTPTransport); /指定支持SMTP协议的Transport具体类,允许由第三方提供。 props.put(mail.imap.class, com.sun.mail.imap.IMAPStore); /指定支持IMAP协议的Store具体类,允许由第三方提供。 props.put(mail.smtp.host, hostname); /指定采用SMTP协议的邮件发送服务器的IP地址或主机名。,Network Programming,13.4 创建JavaMail应用程序,步骤(2)调用javax.mail.Session类的静态方法Session.getDefa

23、ultInstance()获得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()方法

24、返回com.sun.mail.imap.IMAPStore类的实例。,Network Programming,13.4 创建JavaMail应用程序,步骤(4)调用Store对象的connect()方法连接到接收邮件服务器。调用connect()方法时,应该指定接收邮件服务器的主机名或IP地址、用户名和口令。 store.connect(hostname,username, password);,Network Programming,13.4 创建JavaMail应用程序,获得了Store对象后,就可以通过它来访问邮件服务器上的特定邮件用户了。通常会对邮件用户执行以下操作。 操作(一)创建并

25、发送邮件: /创建邮件 msg = new MimeMessage(mailsession); InternetAddress toAddrs =InternetAddress.parse(, false); /设置邮件接收者 msg.setRecipients(Message.RecipientType.TO, toAddrs); /设置邮件的主题 msg.setSubject(hello);,Network Programming,13.4 创建JavaMail应用程序,/设置邮件的发送者 msg.setFrom(new InternetAddress(); /设置邮件的正文 msg.se

26、tText(How are you); /发送邮件 Transport.send(msg); Transport的静态方法send(Message)负责发送邮件服务器,邮件发送协议由tocol属性指定,邮件发送服务器由mail.smtp.host属性指定。,Network Programming,13.4 创建JavaMail应用程序,操作(二)打开inbox邮件夹收取邮件: /获得名为“inbox”的邮件夹 Folder folder=store.getFolder(inbox); /打开邮件夹 folder.open(Folder.READ_ONLY);

27、 /获得邮件夹中的邮件数目 System.out.println(You have +folder.getMessageCount()+ messages in inbox.); /获得邮件夹中的未读邮件数目 System.out.println(You have +folder.getUnreadMessageCount()+ unread messages in inbox.); 在IMAP协议中,inbox邮件夹是邮件用户的保留邮件夹,用户不允许删除该邮件夹,邮件服务器把所有接收到的新邮件都存在该邮件夹中。,Network Programming,13.4 创建JavaMail应用程序,

28、操作(三)从邮件夹中读取邮件: /从邮件夹中读取第一封邮件 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();,Network Programming,13.5 身份验证,在实际应用中,往往希望在

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

30、ession.getDefaultInstance(props,ma); (3)连接到接收邮件服务器时,把用户名和口令设为null: store.connect(receiveHost,null, null);,Network Programming,13.5 身份验证,Network Programming,13.6 URLName类,javax.mail.URLName类表示URL的名字,URLName类与.URL类的区别在于: URLName类不尝试连接目标地址。构造URLName对象时,无需指定协议处理器。 URLName类可以表示非标准的URL地址。比如URLName对象可以表示接收

31、邮件服务器上的特定邮件夹,形式为: 协议名:/用户名:口令主机:端口/邮件夹,Network Programming,13.6 URLName类,URLName类中包括以下getXXX()方法: getProtocol():获得URL名字中的协议。 getHost():获得URL名字中的主机。 getUsername():获得URL名字中的用户名。 getPassword():获得URL名字中的口令。 getFile():获得URL名字中的文件名或者邮件夹名,Network Programming,13.6 URLName类,URLName类中包括以下getXXX()方法: getProtoc

32、ol():获得URL名字中的协议。 getHost():获得URL名字中的主机。 getUsername():获得URL名字中的用户名。 getPassword():获得URL名字中的口令。 getFile():获得URL名字中的文件名或者邮件夹名。,Network Programming,13.6 URLName类,例程14-5的MailClientURLName类的init(URLName urlName)方法从一个URLName对象中获取连接到接收邮件服务器的各种信息。这个URLName对象表示的URL名字为:imap:/admin:1234localhost/ public void

33、init(URLName urlName)throws Exception receiveProtocol=urlName.getProtocol(); receiveHost=urlName.getHost(); username=urlName.getUsername(); password=urlName.getPassword();,Network Programming,13.6 URLName类,/设置属性 Properties props = new Properties(); props.put(mail.smtp.host, sendHost); /创建Session对象 s

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

35、.7 创建和读取复杂电子邮件,javax.mail.Message抽象类表示邮件,它的具体子类为javax.mail.MimeMessage类,它提供了读取和设置邮件中各个部分的getXXX()和setXXX()方法: setSubject(String subject)方法设置邮件的主题。 setHeader(String name, String value)方法设置邮件头部的某一项。 setContent(Object o, String type)方法设置邮件的正文。,Network Programming,13.7 .1邮件地址,javax.mail.Address抽象类表示邮件地址

36、,它的最常用的子类是javax.mail.InternetAddress类。 InternetAddress类表示Internet网上通用的邮件地址,形式为,或者“Admin”。 InternetAddress类提供了一系列get和set方法,用来读取和设置address、personal和charset等属性,例如: getAddress():读取address属性。 getPersonal():读取personal属性。 setAddress(String address):设置address属性。 setPersonal(String personal):设置personal属性。,Ne

37、twork Programming,13.7 .1邮件地址,以下两段代码是等价的: InternetAddress addr= new InternetAddress(,Admin); 或者: InternetAddress addr=new InternetAddress(); addr.setAddress(); addr.setPersonal(Admin);,Network Programming,13.7 .1邮件地址,MimeMessage类的以下方法用于读取或设置邮件中的地址信息: Address getFrom():读取发送者的邮件地址。 Address getRecipien

38、ts(Message.RecipientType type):读取特定接收类型的邮件地址。 void setFrom(Address address):设置发送者的邮件地址。 void setRecipients(Message.RecipientType type, Address addresses):设置特定接收类型的邮件地址,参数addresses指定多个接收地址。 void setRecipients(Message.RecipientType type, String addresses) : 设置特定接收类型的邮件地址,参数addresses指定一个接收地址。,Network P

39、rogramming,13.7 .1邮件地址,Message.RecipientType 类型的静态常量表示地址类型,包括: Message.RecipientType.TO:主接收地址。 Message.RecipientType.CC:抄送地址。 Message.RecipientType.BCC:广播地址。,Network Programming,13.7 .1邮件地址,以下程序代码设置了邮件的各项邮件地址: MimeMessage msg=new MimeMessage(session); InternetAddress from= new InternetAddress(); Int

40、ernetAddress to =InternetAddress.parse(,java_); InternetAddress cc= new InternetAddress(linda_); InternetAddress bcc =InternetAddress.parse(,); msg.setFrom(from); msg.setRecipients(Message.RecipientType.TO, to); msg.setRecipients(Message.RecipientType.CC, cc); msg.setRecipients(Message.RecipientType

41、.BCC, bcc);,Network Programming,13.7.2 邮件头部,MimeMessage类的以下getXXX()和setXXX()方法用于读取和设置邮件头部的特定项: String getHeader(String name) void setHeader(String name, String value) 以下两段代码的作用是等价的,它们的作用都是设置邮件的主题: msg.setHeader(subject,hello); 或者: msg.setSubject(hello);,Network Programming,13.7.2 邮件头部,MimeMessage类的g

42、etAllHeaders()方法返回一个包含Header对象的Enumeration对象,每个Header对象表示邮件头部的一项。 以下程序代码遍历邮件头部的所有项: for(Enumeration e=msg.getAllHeaders(); e.hasMoreElements();) Header header=e.nextElement(); System.out.println(header.getName()+:“ +header.getValue(); ,Network Programming,13.7.3 邮件标记,多数接收邮件服务器允许邮件包含特定的标记信息,这些标记可以使用户

43、更方便的管理邮件。 JavaMail API用javax.mail.Flags类的Flags.Flag内部类的静态实例来表示标记: Flags.Flag.ANSWERED:表示邮件已经回复。该标记由客户程序设置。 Flags.Flag.DELETED:表示邮件已经被删除。该标记由客户程序设置。 Flags.Flag.RECENT:表示刚刚被添加到邮件夹的邮件,即最近一次打开邮件夹时,被添加到邮件夹的邮件。该标记由Folder类的实现来设置,客户程序只能读取该标记。,Network Programming,13.7.3 邮件标记,Flags.Flag.FLAGGED:表示邮件已经作了某种标记。客

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

45、定义的标记。,Network Programming,13.7.3 邮件标记,MimeMessage类提供了三个与标记有关的方法: void setFlags(Flags flags,boolean set):设置或取消一组标记。 void setFlags(Flags.Flag,boolean set):设置或取消特定标记。 boolean isSet(Flags.Flag flag):察看是否设置了某个标记。,Network Programming,13.7.3 邮件标记,以下两段程序代码是等价的,它们的作用都是为一个邮件设置SEEN和ANSWERED标记: Flags flags=new

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

47、l); flags.add(about travelling); msg.setFlags(flags,true); /表示这是一封关于旅游的私人信件,Network Programming,Network Programming,13.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.ANS

48、WERED) System.out.println(ANSWERED); else if(msg.isSet(Flags.Flag.RECENT) System.out.println(RECENT);,Network Programming,13.7.3 邮件标记,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)

49、/读取用户标记 String userFlags=msg.getFlags().getUserFlags(); for(int i=0;iuserFlags.length;i+) System.out.println(User Flag:+userFlagsi); ,Network Programming,13.7.4 邮件正文,邮件正文是邮件中最复杂的一部分,正文可以是纯文本,还可以包括若干附件。 JavaMail API把邮件正文的各个组成部分以及整个邮件都抽象为部件,部件用javax.mail.Part接口表示。 一个Part对象和一个DataHandler对象关联,DataHandle

50、r对象负责处理部件包含的数据。 Part接口有两个子接口:MimePart接口和BodyPart接口。 MimePart接口表示符合MIME规范的部件。 BodyPart接口表示可以作为邮件正文的组成部分的部件。,Network Programming,13.7.4 邮件正文,Part接口及其相关类的类框图,Network Programming,13.7.4 邮件正文,MimeBodyPart类实现了MimePart接口和BodyPart接口,因此MimeBodyPart对象可以作为MimeMessage的正文的组成部分。 MimeMessag类的以下三个方法都用于设置正文: void se

51、tText(Strint txt) void setContent(Object o,String type) void setContent(Multipart mp),Network Programming,13.7.4 邮件正文,如果MimeMessage仅包含纯文本内容,可以通过以下两种方式设置邮件正文: msg.setText(How are you); 或者 msg.setContent(How are you,text/plain); 如果MimeMessage的正文包括多个组成部分,既有纯文本内容,还有若干附件,那就应该先创建一个包含正文的各个组成部分的MimeMultipar

52、t对象,然后调用msg.setContent(Multipart mp)方法,把MimeMultipart对象作为邮件的正文。,Network Programming,13.7.4 邮件正文,例程的MailClientSendAttach类创建了一个包括附件的邮件,然后发送该邮件。 这封邮件的正文包括三个组成部分,分别用三个MimeBodyPart对象来表示。第一个MimeBodyPart对象表示邮件的纯文本内容,其他两个MimeBodyPart对象分别表示两个附件。这些MimeBodyPart对象都加入到一个MimeMultipart对象中。,Network Programming,Netw

53、ork Programming,13.7.4 邮件正文,例程 MailClientSendAttach.java import javax.mail.*; import ernet.*; import javax.activation.*; import java.util.*; public class MailClientSendAttach extends MailClientForCitiz private String fromAddr=java_; /发送者地址 private String toAddr=java_; /接收者地址,Network Pr

54、ogramming,Network Programming,13.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)

55、; msg.setSentDate(new Date(); msg.setFrom(new InternetAddress(fromAddr);,Network Programming,13.7.4 邮件正文,String attch1=attch1.rar; String attch2=attch2.rar; Multipart multipart=new MimeMultipart(); /加入文本内容 MimeBodyPart mimeBodyPart1=new MimeBodyPart(); mimeBodyPart1.setText(How are you); multipart.a

56、ddBodyPart(mimeBodyPart1);,Network Programming,13.7.4 邮件正文,/加入第一个附件 MimeBodyPart mimeBodyPart2=new MimeBodyPart(); FileDataSource fds=new FileDataSource(attch1);/得到数据源 mimeBodyPart2.setDataHandler(new DataHandler(fds); mimeBodyPart2.setDisposition(Part.ATTACHMENT);/标识本部件为附件 mimeBodyPart2.setFileName

57、(fds.getName(); /设置文件名(与原文件名同) multipart.addBodyPart(mimeBodyPart2); /将附件添加到正文对象,Network Programming,13.7.4 邮件正文,/加入第二个附件 MimeBodyPart mimeBodyPart3=new MimeBodyPart(); fds=new FileDataSource(attch2); /得到数据源 mimeBodyPart3.setDataHandler(new DataHandler(fds); mimeBodyPart3.setDisposition(Part.ATTACHM

58、ENT); mimeBodyPart3.setFileName(fds.getName(); /设置文件名 multipart.addBodyPart(mimeBodyPart3); msg.setContent(multipart); /设置邮件的正文 Transport.send(msg); /发送邮件 ,Network Programming,13.7.4 邮件正文,public static void main(String args)throws Exception MailClientSendAttach client=new MailClientSendAttach(); cli

59、ent.init(); client.sendMessage(client.fromAddr,client.toAddr); client.close(); ,Network Programming,13.7.5 邮件接收,例程的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); ,Network Programming,13.7

温馨提示

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

评论

0/150

提交评论