第十讲 java mail 技术

Post on 21-Mar-2016

154 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

第十讲 Java Mail 技术. 本讲内容. 常用电子邮件协议 Java Mail 体系及其主要对象 Java Mail 编程. 消息传递. 是 软件组件 或者 应用程序 之间通信的一种方法。 在通信模型中增加了一层 抽象 ,能够实现 松散耦合 的 分布式通信 。 发送者和接收者都是与 中间层 发生联系,只需要知道所用的消息的 格式 和 目的地 ( 消息中间件机制 ) 。. 消息传递 ( 续 ). 远程方法调用 ( RMI ) 要求应用程序知道远端应用程序的方法,属于 紧密耦合 的技术。 电子邮件是 人与人 或者 人与软件应用程序 之间的一种通信方法。. - PowerPoint PPT Presentation

TRANSCRIPT

1

第十讲 Java Mail 技术

2

本讲内容 常用电子邮件协议 Java Mail 体系及其主要对象 Java Mail 编程

3

消息传递 是软件组件或者应用程序之间通信的一种方法。 在通信模型中增加了一层抽象,能够实现松散耦合的分布式通信。 发送者和接收者都是与中间层发生联系,只需要知道所用的消息的格式和目的地( 消息中间件机制 ) 。

4

消息传递 ( 续 ) 远程方法调用 (RMI) 要求应用程序知道远端应用程序的方法,属于紧密耦合的技术。 电子邮件是人与人或者人与软件应用程序之间的一种通信方法。

5

邮件概述 电子邮件 (E-mail) 系统。 E-mail 客户端 ( 邮件 GUI 程序,如 MS Outlook, Foxmail; Web 应用程序,如 Hotmail) 。 E-mail 服务器 ( 邮件消息路由、存储 ) 。

6

E-mail 传输过程

E-mail 接收方 POP3 服务器

E-mail 发送方 SMTP 服务器

7

电子邮件协议 SMTP(Simple Mail Transfer Protocol)

参照 RFC821 定义了可靠、有效、接力的 E-mail 发送过程 请求 / 响应协议,以普通文本形式传输,不能传输图象等非文本信息,有安全方面的缺陷。

POP3(Post Office Protocol Version 3) 参照 RFC1939 定义了从邮件服务器中读取邮件消息的机制,只让一个用户访问邮箱。 仍采用 C/S 工作模式。 支持离线工作协议,使用户不必长时间与邮件服务器连接,减少了服务器和网络的整体开销。

8

电子邮件协议 ( 续 ) IMAP(Internet Message Access Protocol)

定义了多台计算机访问和管理邮件消息的机制,支持对邮箱的并发访问。 提供有选择地从邮件服务器接收邮件、基于服务器的信息处理,实现 POP3 所不能的共享邮件信箱和共享邮件。 高性能、可扩展性。 三种操作模式: 在线方式 ( 如 Hotmail) ; 离线方式 ( 如 Foxmail) ; 分离方式 ( 邮件一部分在 Mail 服务器端,一部分在客户端 ) 。

9

电子邮件协议 ( 续 ) MIME (Multipurpose Internet Mail Extensions)

不是邮件传输协议,只定义了需要传输的消息、附件及其他类型数据的格式。 增强了在 RFC 822 中定义的电子邮件报文的能力,允许传输二进制数据。 用于将数据从 8 位二进制编码的格式(如声音、图象和中文等)转换成使用 7 位的 ASCII 码格式。

10

JavaMail 邮件系统是企业级应用的重要组成部分,对邮件的各类操作通常基于 SMTP 和 POP3 协议。 JavaMail 是一套用于存取邮件服务器的 API 抽象类(标准扩展包),提供了邮件编写、存储、传输、接收、发送等丰富的功能,是 JAVA 编程中实现邮件功能的核心。 JavaMail API 并不是绝对支持每一种因特网邮件协议,目前实现了 IMAP 、 SMTP 、 POP3 、MIME 等。

11

JavaMail 与 JAF Java Mail 需要使用 Sun 的 JAF (Java Beans Activation Framework) 即 JavaBeans 活动框架,以处理任意数据块的输入及相应处理,如 MIME 编码的邮件附件,否则 Java Mail 将不能运行。 JAF 提供了一个标准服务用于确定任意片段的数据类型,并且封装对它的访问、发现对它有效的操作和创建合适的 JavaBeans 组件来执行这些操作。 J2EE1.3 API包含 JavaMail API1.2 、 JAF1.0。

12

Java Mail 体系 J2EE 通过 Java Mail API为 Java 程序开发者提供了一个客户机访问邮件服务器的通用交互接口和相关的组件规范。 JavaMail 本身根据 RFC822 和 Internet MIME消息标准,为邮件消息传递系统实现了一些包含于 JavaMail API包中的基本的类。

13

Java Mail 体系(续) 整个 Java Mail 体系采用的是一种层次结构,分为三层:

抽象层(抽象类、接口和抽象方法,位于 javax.mail 内); Internet 邮件实现层(实现部分抽象层元素,遵循RFC822 和 MIME ,位于 javax.mail.internet 内); 协议实现层(由 ISP 实现对特定协议的支持)。

14

Java Mail 体系(续)

邮件服务器 (POP3/SMTP/IMTP 等协议实现层 )

使用 JavaMail 的 J2EE 应用程序J2EE 组件 ( 用来实现邮件发送、接收、处理 )

Java Mail APIJava Mail 抽象层

Internet 邮件实现层

Java Mail 体系结构

15

Java Mail 体系(续) 类的层次化构架以及 JAF规范使得客户端可以通过 JavaMail API 实现不同数据类型、不同传输协议、不同存储方式数据的接受、发送与存储。

16

JavaMail API Java Mail API包括两个部分

应用程序接口。 服务提供接口。

J2EE 应用程序组件可以使用 Java Mail API来发送 E-mail 通知。

17

JavaMail API (续) 一部分,由 javax.mail 中七个主要对象组成,即 Session 、 Message 、 Address 、 Authenticator 、 Transport 、 Store 和 Folder ,用以完成常见的发送消息、检索消息、删除消息、认证、回复消息、转发消息、管理附件、处理基于HTML 文件格式的消息及搜索或过滤邮件列表等电子邮件任务。

18

JavaMail API (续) 另一部分,主要包括 Part 、 Message 、Bodypart 、 Multipart 、 Mimepart 、MimeMessage 、 MimeBodypart 和 MimeMultipart 等类和接口,用以完成电子邮件的阅读、撰写等任务。

19

JavaMail API 主要对象 javax.mail.Session 类

定义全局与个人邮件的相关属性,以及基本的邮件会话,是 Java Mail API最高层入口类。 Session 对象利用 java.util.Properties 对象获取诸如邮件服务器、用户名、密码等信息,以及其他可在整个应用程序中共享的信息。 Session 是 final 类,无法被继承,也不能使用 new语句来创建实例,但提供静态方法 getInstance() 和 getDefaultInstance()来获取 Session 实例。 对于实现特定访问与传输协议的 Store 对象和 Transport 对象, Session 类还扮演着工厂的角色。 每一个基于 JavaMail 的应用程序至少有一个 session ,但是可以有任意多的 session 。

20

JavaMail API 主要对象 ( 续 ) javax.mail.Message 类

是一个抽象类,用于定义邮件信息的一系列属性和邮件信息所包含的内容,内容是通过 DataHandler 对象包装后的数据。 实现了 Part 接口,该接口定义用于定义和格式化数据内容的属性,以及和邮件系统交互的接口。 Message 对象通过 JAF 与其中的内容进行交互,使得可用同一个方法处理任何数据,使用任何合适的传输协议传输数据。 JavaMail API还支持多成分消息,其中每个成分都会定义各自的属性和内容,使用 BodyPart 对象代替了原来的各个单独成分。 Message 类的各个子类实现了一些标准的邮件格式,如 javax.mail.internet.MIMEMessage 类。 Message 对象可以从 Folder 对象中搜索获取,或者通过初始化新的 Message 对象的适当子类获取。

21

JavaMail API 主要对象 ( 续 ) javax.mail.Address 类

也是一种抽象类,使用子类 javax.mail.internet.InternetAddress为邮件标上 E-mail 形式的地址,以与消息连接起来。 地址的 3 种预定义类型: Message.RecipientType.TO ; Message.RecipientType.CC ; Message.RecipientType.BCC 。 JavaMail API没有提供检查电子邮件地址有效性的机制。

22

JavaMail API 主要对象 ( 续 ) javax.mail.Authenticator 类

一种验证程序类,通过用户名和密码来访问受保护的资源即邮件服务器。 需要先创建一个抽象类的子类,并从 getPasswordAuthentication() 方 法返回 PasswordAuthentication 实例,还必需向 Session 类注册 Authenticator ,以供需要认证时被通知。 可以通过弹出邮件服务器登录对话框,也可以从配置文件中,读取用户名和密码,将其作为 PasswordAuthentication 对象返回给调用程序。

23

JavaMail API 主要对象 ( 续 ) javax.mail.Transport 类

一个抽象类,使用和 SMTP 协议相关的语言来发送消息。 静态的基本 send() 方法机制会为每一个方法调用都建立一个独立的连接,而当需要发送多条消息时,应当采用相应的保持消息间活动服务器的连接的方法。

24

JavaMail API 主要对象 ( 续 ) javax.mail.Store 类

Store 类实现特定邮件协议上的读、写、监视、查找等操作。 Store 定义的存储器包括一个分层的目录体系,消息存储在目录内。 客户程序可以通过提供认证信息(主机名、用户名、密码)以 connect() 方法来获取一个实现了数据库访问协议的 Store 对象,从而访问消息存储器。 客户机程序可以从会话对象属性中获取认证信息,或者通过访问会话的 Authenticator 对象来与用户交互,要求用户输入认证信息。 在连接 Store 类后,就可以获取一个 Folder 类,在读取其中的消息前必须先打开该类。

25

JavaMail API 主要对象 ( 续 ) java.mail.Folder 类

Folder 类用于分级组织邮件,并提供按照 javax.mail.Message 格式访问 E-mail 的能力。 Folder代表的目录可以容纳消息或子目录,从而提供一个类似于树的分层体系。 客户程序通过消息序列号或直接通过相应的 Message对象引用目录中的消息。 对于 POP3 协议,唯一可用的文件夹是 INBOX;如果使用的是 IMAP 协议,则可以使用其他的文件夹。

26

JavaMail 存储 采用文件夹的形式存储,每个文件夹中又可以包含多个子文件夹或邮件,最终形成树的层次结构。 Folder 类声明了用于获取、添加、复制、删除邮件的方法。 Store 类定义了一个数据库,用来维护文件夹的层次结构以及其中包含的邮件信息。

27

JavaMail API 实现邮件发送的基本步骤 在 Content-Type字段中创建头信息 (Header) 和一些已知的数据类型信息,使用 Part 接口和 Message 类定义邮件信息,邮件中的数据通过 JAF框架下的 Data-Handler 类存储。 创建会话对象,用于验证和控制用户对邮件存储和传输的访问。 发送邮件至接收者列表。 从邮件服务器搜索所需的邮件信息。 对所需邮件信息执行由 JAF 的 Aware JavaBean 组件实现的浏览、打印等高级命令。

28

邮件服务器安装 安装邮件服务器

到网站 http://www.argosoft.com/下载免费 ArgoSoft 邮件服务器安装文件 agsmail.exe 。

双击 agsmail.exe 文件进入邮件服务器安装界面,按照提示信息,先后选择“ Setup--->Settings--->Install--->Start Installtion” ,安装并启动邮件服务器。

29

邮件服务器安装(续) 配置邮件服务器

在“ ArGoSoft Mail Server”窗口中,对邮件服务器进行配置。 首先,选择“ Tools--->Option---> General--->LocalHost”设置邮件服务器主机名称,选择“ Tools--->Option---> Local Domains”设置域名。 其次,选择“ Tools--->Users--->User Setup--->Add New User”,给邮件服务器添加用户。 退出 ArGoSoft ,然后重新启动,使上述配置生效。

30

邮件服务器安装(续) 测试邮件服务器

通过邮件客户端程序(如 Outlook Express 、 Foxmail)进行收发邮件测试。 以 Outlook Express为例,选择“工具 ---> 帐户 --->Internet帐户 ---> 邮件 --->Internet 连接向导”,按照提示依次输入显示名、邮件地址、邮件接收服务器( POP3)、接收邮件服务器地址( 127.0.0.1)、发送邮件服务器地址( 127.0.0.1)、帐户名、密码,完成相应帐户的设置。 单击 Outlook Express 的“新建邮件”按钮,从一个用户向另一个用户发送一封邮件,再选择“工具 --->发送和接收 --->发送和接收全部邮件”,测试邮件服务器工作状态。

31

发送简单邮件 NewMail.jsp

用来建立邮件信息的表单,并将表单内容发送给后端 Servlet 处理。 SendMail.jsp

一个 Servlet ,负责邮件的发送。

32

发送简单邮件:NewMail.jsp<HTML><META http-equiv="Content-Type" content="text/html; charset=GB2312"/><title>New Mail</title><BODY><FORM action=<%=request.getContextPath()+"/SimpleMail"%> method="post"><TABLE align="center"><TR><TD width="50%">收件人 :<BR/> <input name="to" size="25" > </input></TD><TD width="50%">发件人 :<BR /><INPUT name="from" size="25" /></TD></TR><TR><TD colspan="2">主题 :<BR /><INPUT name="subject" size="50" /></TD></TR>

33

发送简单邮件:NewMail.jsp (续)<TR><TD colspan="2"><P>邮件正文 :<BR/><textarea name="text" rows ="5" cols= "55"></textarea> </P></TD></TR></TABLE><center><INPUT type="submit" name="cb_submit" value=" 发送 "/><INPUT type="reset" name="cb_reset" value=" 重写 "/></center></FORM></BODY></HTML>

34

发送简单邮件:SendMail.javapackage com.mail;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.mail.*;import java.util.*;import javax.mail.internet.*;

35

发送简单邮件:SendMail.java (续)public class SendMail extends HttpServlet {protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}

protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {PrintWriter out = response.getWriter();String host ="127.0.0.1" ;

36

发送简单邮件:SendMail.java (续)try{Properties props = new Properties();Session sendMailSession;Store store;Transport transport; sendMailSession = Session.getInstance(props, null);props.put("mail.smtp.host", host);Message newMessage = new MimeMessage(sendMailSession);newMessage.setFrom(new InternetAddress(request.getParameter("from")));newMessage.setRecipient(Message.RecipientType.TO, new InternetAddress ( request.getParameter ("to")));

37

发送简单邮件:SendMail.java (续)String subject = request.getParameter("subject");if(subject!=null){subject = new String(subject.getBytes("iso-8859-1"));}newMessage.setSubject(subject,”gb2312”);newMessage.setSentDate(new Date());String text = request.getParameter("text");if(text!=null){text = new String(text.getBytes("iso-8859-1"));}

38

发送简单邮件:SendMail.java (续)newMessage.setText(text ,”gb2312”);Transport.send(newMessage);////显示发送成功的提示 out.println(" the Email send sucess!");}catch(MessagingException m){ out.println(m.toString());}}}

39

SMTP身份认证 只有通过身份认证的用户才有权利使用 SMTP 服务器发送邮件,即需要认证功能的邮件发送。 将 ArGoSoft设置为需要 SMTP认证 :在“ ArGoSoft Mail Server”窗口中,选择“ Tools--->Options--->General--->DNS Server(127.0.0.1)--->Allow Relay”,选择“ Tools--->Options--->SMTP Authentication--->Enable SMTP Authentication--->SMTP User Name--->SMTP Password--->Confirm Password” ,重新启动邮件服务器。

40

SMTP身份认证:Auth.javapackage com.mail;import java.util.Properties;import javax.mail.Authenticator;import javax.mail.PasswordAuthentication;public class Auth extends Authenticator {String username="";String password=""; public Auth(String username,String password){ this.username=username; this.password=password; }public PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication( username, password); }}

41

SMTP身份认证:sendAuthmail.javapackage com.mail;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.mail.*;import javax.mail.internet.*;import java.util.*;import java.io.PrintWriter;

42

SMTP身份认证:sendAuthmail.java (续)public class SendAuthmail extends HttpServlet {protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {PrintWriter out = response.getWriter();

43

SMTP身份认证:sendAuthmail.java (续)//初始化收件人邮件地址、发件人邮件地址和主机名,下面的各//初始化字符串均为任意设置String to = "teacher@hyl.com";String from = "student@hyl.com";String host ="127.0.0.1" ;//创建一个属性对象Properties props = new Properties();// 指定发送邮件服务器,使用 smtp 协议props.put("mail.smtp.host", host);props.put("mail.smtp.auth","true"); Auth au=new Auth("hyl","111"); //获取会话Session session = Session.getInstance(props, au);

44

SMTP身份认证:sendAuthmail.java (续)try {// 创建消息,设置邮件发件人地址、收件人地址、主题MimeMessage msg = new MimeMessage(session);msg.setFrom(new InternetAddress(from));msg.addRecipient(Message.RecipientType.TO, new InternetAddress(to));msg.setSubject("send Example");// 开始设置消息内容 msg.setSentDate(new Date());String text="Hi, this is Email by authentication!";msg.setText(text);// 发送邮件Transport.send(msg);////显示发送成功的提示 out.println(" the Email send sucess!");

45

SMTP身份认证:sendAuthmail.java (续)} catch (MessagingException e){// 异常处理out.println(" the Email send failed!");out.println(e.toString());}}}

46

发送 HTML邮件:form.htmlhtml><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title> JavaMail - 发送 HTML邮件 </title></head><body><table border="0" cellspacing="0" cellpadding="0"><form method="post" action="MimeMail">

47

发送 HTML邮件:form.html (续)<tr><td>发信人: </td><td><input type="text" name="from" size="80"></td></tr><tr><td>收信人: </td><td><input type="text" name="to" size="80"></td></tr><tr><td>抄送人: </td><td><input type="text" name="cc" size="80"></td></tr><tr><td>暗送人: </td><td><input type="text" name="bcc" size="80"></td></tr>

48

发送 HTML邮件:form.html (续)<tr><td>主题: </td><td><input type="text" name="subject" size="80"></td></tr><tr><td valign="top">内容: </td><td><textarea name="body" rows="5" cols="80"></textarea></td></tr><tr><td colspan="2" align="center"><input type="submit" value="发送 "></td></tr></form></table></body></html>

49

发送 HTML邮件:SendMimeMail.javapackage com.mail;import java.io.IOException;import javax.mail.*;import javax.mail.internet.*;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

50

发送 HTML邮件:SendMimeMail.java (续)public class SendMimeMail extends HttpServlet {protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// 变量声明String smtp,from,to,cc,bcc,subject,body;

51

发送 HTML邮件:SendMimeMail.java (续)// 获得用户输入数据smtp = "127.0.0.1";from = request.getParameter("from");to = request.getParameter("to");cc = request.getParameter("cc");bcc = request.getParameter("bcc");subject = request.getParameter("subject");if(subject!=null){subject = new String(subject.getBytes("iso-8859-1"));}body = request.getParameter("body"); ///////////////////////java.util.Properties props;// 系统属性Session mailSession;// 邮件会话对象MimeMessage mimeMsg; //MIME 邮件对象

52

发送 HTML邮件:SendMimeMail.java (续)try{//设置系统属性props = java.lang.System.getProperties(); //获得系统属性对象props.put("mail.smtp.host",smtp); //设置 SMTP 主机//获得邮件会话对象mailSession = Session.getDefaultInstance(props,null); //创建MIME 邮件对象mimeMsg = new MimeMessage(mailSession);//设置发信人mimeMsg.setFrom(new InternetAddress(from));//设置收信人if(to!=null){ mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));}

53

发送 HTML邮件:SendMimeMail.java (续)//设置抄送人if(cc!=null){mimeMsg.setRecipients(javax.mail.Message.RecipientType.CC,InternetAddress.parse(cc));} //设置暗送人if(bcc!=null){ mimeMsg.setRecipients(javax.mail.Message.RecipientType.BCC,InternetAddress.parse(bcc));} //设置邮件主题mimeMsg.setSubject(subject,"gb2312");

54

发送 HTML邮件:SendMimeMail.java (续)// 发送邮件//设置邮件内容,将邮件 body部分转化为 HTML格式mimeMsg.setDataHandler(new javax.activation.DataHandler(new StringDataSource (body,"text/html"))); // 发送邮件Transport.send(mimeMsg); }catch (Exception e){ response.getWriter().println(e.toString()); }}}

55

接收邮件 接收邮件的方式和服务器有很大的关系:

是 IMAP 服务器还是普通的 POP 服务器;支持多少文件夹;支持多少种邮件标记。

示例:MailLogon.html ,用来获取登录邮服所需要的信息;ReceiveSimpleMail ,用来连接邮服获取邮件信息;mailContent ,用来显示邮件的内容。

56

接收邮件:MailLogon.html<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title> JavaMail - 登录邮件服务器 </title></head><body><table border="0" cellspacing="0" cellpadding="0"><form method="post" action="ReceiveMail">

57

接收邮件:MailLogon.html (续)<tr><td>用户名称: </td><td><input type="text" name="user" size="80"></td></tr><tr><td>用户密码: </td><td><input type="text" name="password" size="80"></td></tr><tr><td>邮局协议: </td><td><input type="text" name="protocol" size="80"></td></tr>

58

接收邮件:MailLogon.html (续)<td colspan="2" align="center"><input type="submit" value="接收邮件 "></td></tr></form></table></body></html>

59

接收邮件:ReceiveSimpleMail.javapackage com.mail;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.*;import javax.mail.*;import javax.mail.internet.*;import javax.servlet.RequestDispatcher;

60

接收邮件:ReceiveSimpleMail.java(续)public class ReceiveSimpleMail extends HttpServlet {

protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {

61

接收邮件:ReceiveSimpleMail.java(续)String host ="127.0.0.1" ;String user=request.getParameter("user");String

password=request.getParameter("password");String protocol=request.getParameter("protocol");String url=null;String root=null;

62

接收邮件:ReceiveSimpleMail.java(续)try{Properties props = System.getProperties();Session sess= Session.getDefaultInstance(props ,null);sess.setDebug(true);Store store = null;store = sess.getStore(protocol);store.connect(host, user, password);Folder folder = store.getFolder("INBOX");folder.open(Folder.READ_ONLY);

63

接收邮件:ReceiveSimpleMail.java(续)Message message[] = folder.getMessages();int size=message.length;if(size==0){RequestDispatcher rd =request.getRequestDispatcher("/emptyMailBox.jsp");rd.forward(request,response);}MimeMessage mm=(MimeMessage)message[0];request.setAttribute("mail",mm);RequestDispatcher rd =request.getRequestDispatcher("/mailcontent.jsp");rd.forward(request,response);

64

接收邮件:ReceiveSimpleMail.java(续)}catch (MessagingException e){

System.out.println(e.toString());}

}}

65

接收邮件:mailcontent.jsp<%@ page import="javax.mail.*" %><%@ page import="javax.mail.internet.*" %><%MimeMessage mm =(MimeMessage)request.getAttribute("mail");out.println("主题: "+mm.getSubject()+"<br>");out.println("编码方式: "+mm.getEncoding()+"<br>");out.println("邮件 ID: "+mm.getMessageID()+"<br>");out.println("邮件序号: "+mm.getMessageNumber()+"<br>");out.println("发送日期: "+mm.getSentDate()+"<br>");out.println("接收日期 "+mm.getReceivedDate()+"<br>");out.println("邮件大小: "+mm.getSize()+" 字节 <br>");out.println(" 标志: "+"");

66

接收邮件:mailcontent.jsp (续)Flags flag=mm.getFlags();if (flag.contains(Flags.Flag.ANSWERED)){out.println("ANSWERD");}else if (flag.contains(Flags.Flag.DELETED)){out.println("DELETED");}else if (flag.contains(Flags.Flag.DRAFT)){out.println("DRAFT");}else if (flag.contains(Flags.Flag.FLAGGED)){out.println("FLAGGED");}

67

接收邮件:mailcontent.jsp (续)else if (flag.contains(Flags.Flag.RECENT)){out.println("RECENT");}else if (flag.contains(Flags.Flag.SEEN)){out.println("SEEN");}else if (flag.contains(Flags.Flag.USER)){out.println("USER");}else{out.println("non flag");}

68

接收邮件:mailcontent.jsp (续)out.println("<br>");out.println("文件夹: "+mm.getFolder().getURLName().toString()+"<br>");out.println("发件人: "+"");Address []addr=mm.getFrom();for(int i=0;i<addr.length;i++){out.println(""+addr[i].toString()+" &nbsp;");}out.println("<br>");out.println(" 转发到: "+"");Address []addrTo=mm.getAllRecipients();for(int i=0;i<addrTo.length;i++){out.println(""+addrTo[i].toString()+" &nbsp;");}

69

接收邮件:mailcontent.jsp (续)out.println("<br>");out.println(" 回复到: "+"");Address []addrReply=mm.getReplyTo();for(int i=0;i<addrTo.length;i++){out.println(""+addrReply[i].toString()+" &nbsp;");}out.println("<br>");out.println(" 正文 "+mm.getContent()+"<br>");%>%>

70

处理附件 附件是邮件消息的相关资源,通常指不包含在消息正文里文本文件、电子表格或图象等。 发送附件,每个 DataHandler代表附件。如果从文件中读附件,其数据源是 FileDataSource ;如果从 URL中读,其数据源是 URLDataSource 。 接收附件,标有从 part.getDisposition()获得的Part.ATTACHMENT配置的 Part 是附件,而没有配置和带 Part.INLINE配置的部件也可能是附件。

71

发送附件 Attachmail.html ,用来提交发送邮件所需要的信息,包括附件信息。 SendAttachMail.java ,用来发送带附件的邮件。

72

发送附件:AttachMail.html<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"><title> JavaMail - 发送 HTML邮件 </title></head><body><table border="0" cellspacing="0" cellpadding="0"><form method="post" action="SendAttachmentMail">

73

发送附件:AttachMail.html (续)<tr><td>发信人: </td><td><input type="text" name="from" size="80"></td></tr><tr><td>收信人: </td><td><input type="text" name="to" size="80"></td></tr><tr><td>主题: </td><td><input type="text" name="subject" size="80"></td></tr><tr><td valign="top">内容: </td><td><textarea name="body" rows="5" cols="80"></textarea></td></tr>

74

发送附件:AttachMail.html (续)<tr><td valign="top">附件: </td><td><INPUT TYPE="file" NAME="thefile"></td></tr><tr><td colspan="2" align="center"><input type="submit" value="发送 "></td></tr></form></table></body></html>

75

发送附件:SendAttachmentMail.javapackage com.mail;import java.io.IOException;import javax.activation.*;import javax.mail.*;import javax.mail.internet.*;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;

76

发送附件: SendAttachmentMail.java (续)public class SendAttachmentMail extends HttpServlet {

protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {// 变量声明String smtp,from,to,cc,bcc,subject,body;

77

发送附件: SendAttachmentMail.java (续)//获得用户输入数据smtp = "127.0.0.1";from = request.getParameter("from");to = request.getParameter("to");subject = request.getParameter("subject");if(subject!=null){subject = new String(subject.getBytes("iso-8859-1"));}body = request.getParameter("body"); ///////////////////////java.util.Properties props;// 系统属性Session mailSession;// 邮件会话对象MimeMessage mimeMsg; //MIME 邮件对象

78

发送附件: SendAttachmentMail.java (续)try{//设置系统属性props = java.lang.System.getProperties(); //获得系统属性对象 props.put("mail.smtp.host",smtp); //设置 SMTP 主机 //获得邮件会话对象mailSession = Session.getDefaultInstance(props,null); //创建MIME 邮件对象 mimeMsg = new MimeMessage(mailSession); //设置发信人mimeMsg.setFrom(new InternetAddress(from)); //设置收信人if(to!=null){ mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));}

79

发送附件: SendAttachmentMail.java (续)//设置邮件主题mimeMsg.setSubject(subject,"gb2312"); // 处理邮件体正文部分BodyPart messageBodyPart = new MimeBodyPart(); // Fill the messageString contentMessage=request.getParameter("body");messageBodyPart.setText(contentMessage); Multipart multipart = new MimeMultipart();multipart.addBodyPart(messageBodyPart);

80

发送附件: SendAttachmentMail.java (续)// Part two is attachmentString filename=request.getParameter("thefile");messageBodyPart = new MimeBodyPart();DataSource source = new FileDataSource(filename);messageBodyPart.setDataHandler(new DataHandler(source));messageBodyPart.setFileName(filename);multipart.addBodyPart(messageBodyPart); // Put parts in messagemimeMsg.setContent(multipart);

81

发送附件: SendAttachmentMail.java (续)// Send the messageTransport.send(mimeMsg);

}catch (Exception e){ response.getWriter().println(e.toString()); }

}}

82

接收附件:ReceiveMimeMail.javapackage com.mail;import java.io.File;import java.io.FileOutputStream;import java.io.*;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.text.SimpleDateFormat;import java.util.*;import javax.mail.*;import javax.mail.internet.*;

83

接收附件:ReceiveMimeMail.java (续)public class ReceiveMimeMail extends HttpServlet {protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {doPost(request,response);}protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=GB2312"); PrintWriter out = response.getWriter();

84

接收附件:ReceiveMimeMail.java (续)String szUser="teacher";String szPwd="654321";String szHost="127.0.0.1";

String filepath="c:\\";SimpleDateFormat smpDateFormat;smpDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm");

85

接收附件:ReceiveMimeMail.java (续)try{ Properties props = new Properties(); Session mailsession = Session.getDefaultInstance(props, null);//获取会话对象 Store store = mailsession.getStore("pop3"); //获取邮箱 store.connect(szHost,szUser,szPwd); Folder folder = store.getFolder("INBOX"); //获取收件箱 folder.open(Folder.READ_ONLY); Message message[] = folder.getMessages(); //获取信件

86

接收附件:ReceiveMimeMail.java (续) if(message.length==0){ //没有邮件 } int nid=0; String szFrom=((InternetAddress)message[nid].getFrom()[0]).getAddress(); // 取得真实发件人地址 String szSubject=MimeUtility.decodeText(message[nid].getSubject()); String szDate=smpDateFormat.format(message[nid].getSentDate()); String szBody=""; String szAttach="";

87

接收附件:ReceiveMimeMail.java (续)out.println("<table border='0' width='100%' cellpadding='2'><tr>");out.println("<td width='100%' colspan='2' bgcolor='#F0F0F0'>");out.println("<table border='0' width='100%' cellpadding='2'><tr>");out.println("<td width='15%' align='center'>发件人 :</td>");out.println("<td width='85%'><font face='Fixedsys'>" + szFrom +"</font></td></tr>");out.println("<tr><td align='center'>日 &nbsp;&nbsp;&nbsp; 期 :</td>");out.println("<td><font face='Fixedsys'>" + szDate +"</font></td></tr>");out.println("<tr><td align='center'>主 &nbsp;&nbsp;&nbsp; 题 :</td>");out.println("<td>"+ szSubject +"</td></tr></table>");out.println("</td></tr>");

88

接收附件:ReceiveMimeMail.java (续) // 提取邮件正文內容 String szType=message[nid].getContentType(); System.out.println(" 正文 ********" + szType); Object out_content = message[nid].getContent(); if(!(out_content instanceof Multipart)) //无附件 { szBody=message[nid].getContent().toString();

89

接收附件:ReceiveMimeMail.java (续) }else{ // 有附件 Multipart mp = (Multipart)message[nid].getContent(); String szFile=""; File ffile; //String szpath=""; for (int i=0,n=mp.getCount(); i<n; i++) { Part part = mp.getBodyPart(i); String szMbp=part.getContentType(); System.out.println("IDX:" + i+ " :类型 " + szMbp); String disposition = part.getDisposition();

90

接收附件:ReceiveMimeMail.java (续)if((disposition != null) && ((disposition.equals(Part.ATTACHMENT)||(disposition.equals(Part.INLINE))))){ //创建文件 , 并从输入流中读取信息 , 存入到文件中 szFile=MimeUtility.decodeText(part.getFileName()); String fullpath=filepath + szFile; ffile = new File(fullpath); FileOutputStream outfile = new FileOutputStream(ffile); BufferedInputStream br = new BufferedInputStream(part.getInputStream()); BufferedOutputStream bw = new BufferedOutputStream(outfile); int b; while ((b = br.read()) != -1) bw.write(b); bw.flush(); szAttach=szAttach+"<br>" +fullpath ;

91

接收附件:ReceiveMimeMail.java (续)}else if(disposition==null){ MimeBodyPart mbp = (MimeBodyPart)part; if (mbp.isMimeType("text/plain")||mbp.isMimeType("text/html")){ // 普通正文 szBody=mbp.getContent().toString(); szBody=szBody.replaceAll("\r\n","<br>"); }else if(mbp.isMimeType("multipart/alternative")) { //HTML 正文 szBody=((Multipart)part.getContent()).getBodyPart(0).getContent().toString(); } } } }

92

接收附件:ReceiveMimeMail.java (续) System.out.println("內容 :" + szBody); out.println("<tr><td width='75%' height='215' valign='top'>" + szBody +"</td>"); out.println("<td width='25%' bgcolor='#F0F0F0' valign='top'><p align='center'><b>附件 </b></p>"); out.println("<p>"+ szAttach +"</p></td>"); out.println("</tr><table>"); //Close connection folder.close(false); store.close();}catch(javax.mail.MessagingException e){ System.out.println(e.getMessage()); return ;}}}

93

小结 通常不会使用 JavaMail API构建邮件服务器,而是使用已有的邮件服务器 ( 如 Apache JAMES) ,然后根据需要进行配置。 通过 JAF 可以访问邮件中任意类型的数据, JAF 在 JavaMail 中作为一种规范来封装需要传输的数据以及传递相关命令,所有和数据的交互都需要通过 JAF框架实现。

94

下课了。。。

休息一会儿。。。

top related