940 likes | 1.12k Views
第十讲 Java Mail 技术. 本讲内容. 常用电子邮件协议 Java Mail 体系及其主要对象 Java Mail 编程. 消息传递. 是 软件组件 或者 应用程序 之间通信的一种方法。 在通信模型中增加了一层 抽象 ,能够实现 松散耦合 的 分布式通信 。 发送者和接收者都是与 中间层 发生联系,只需要知道所用的消息的 格式 和 目的地 ( 消息中间件机制 ) 。. 消息传递 ( 续 ). 远程方法调用 ( RMI ) 要求应用程序知道远端应用程序的方法,属于 紧密耦合 的技术。 电子邮件是 人与人 或者 人与软件应用程序 之间的一种通信方法。.
E N D
本讲内容 • 常用电子邮件协议 • Java Mail体系及其主要对象 • Java Mail编程
消息传递 • 是软件组件或者应用程序之间通信的一种方法。 • 在通信模型中增加了一层抽象,能够实现松散耦合的分布式通信。 • 发送者和接收者都是与中间层发生联系,只需要知道所用的消息的格式和目的地(消息中间件机制) 。
消息传递(续) • 远程方法调用(RMI)要求应用程序知道远端应用程序的方法,属于紧密耦合的技术。 • 电子邮件是人与人或者人与软件应用程序之间的一种通信方法。
邮件概述 • 电子邮件(E-mail)系统。 • E-mail客户端(邮件GUI程序,如MS Outlook, Foxmail; Web应用程序,如Hotmail)。 • E-mail服务器(邮件消息路由、存储)。
E-mail传输过程 E-mail发送方 SMTP服务器 E-mail接收方 POP3服务器
电子邮件协议 • SMTP(Simple Mail Transfer Protocol) • 参照RFC821定义了可靠、有效、接力的E-mail发送过程 • 请求/响应协议,以普通文本形式传输,不能传输图象等非文本信息,有安全方面的缺陷。 • POP3(Post Office Protocol Version 3) • 参照RFC1939定义了从邮件服务器中读取邮件消息的机制,只让一个用户访问邮箱。 • 仍采用C/S工作模式。 • 支持离线工作协议,使用户不必长时间与邮件服务器连接,减少了服务器和网络的整体开销。
电子邮件协议(续) • IMAP(Internet Message Access Protocol) • 定义了多台计算机访问和管理邮件消息的机制,支持对邮箱的并发访问。 • 提供有选择地从邮件服务器接收邮件、基于服务器的信息处理,实现POP3所不能的共享邮件信箱和共享邮件。 • 高性能、可扩展性。 • 三种操作模式: 在线方式(如Hotmail); 离线方式(如Foxmail); 分离方式(邮件一部分在Mail服务器端,一部分在客户端)。
电子邮件协议(续) • MIME (Multipurpose Internet Mail Extensions) • 不是邮件传输协议,只定义了需要传输的消息、附件及其他类型数据的格式。 • 增强了在RFC 822中定义的电子邮件报文的能力,允许传输二进制数据。 • 用于将数据从8位二进制编码的格式(如声音、图象和中文等)转换成使用7位的ASCII码格式。
JavaMail • 邮件系统是企业级应用的重要组成部分,对邮件的各类操作通常基于SMTP和POP3协议。 • JavaMail是一套用于存取邮件服务器的API抽象类(标准扩展包),提供了邮件编写、存储、传输、接收、发送等丰富的功能,是JAVA编程中实现邮件功能的核心。 • JavaMail API并不是绝对支持每一种因特网邮件协议,目前实现了IMAP、SMTP 、POP3、MIME等。
JavaMail与JAF • Java Mail需要使用Sun的JAF (Java Beans Activation Framework) 即JavaBeans活动框架,以处理任意数据块的输入及相应处理,如MIME编码的邮件附件,否则Java Mail 将不能运行。 • JAF提供了一个标准服务用于确定任意片段的数据类型,并且封装对它的访问、发现对它有效的操作和创建合适的JavaBeans组件来执行这些操作。 • J2EE1.3 API包含JavaMail API1.2、JAF1.0。
Java Mail体系 • J2EE通过Java Mail API为Java程序开发者提供了一个客户机访问邮件服务器的通用交互接口和相关的组件规范。 • JavaMail本身根据RFC822和Internet MIME消息标准,为邮件消息传递系统实现了一些包含于JavaMail API包中的基本的类。
Java Mail体系(续) • 整个Java Mail体系采用的是一种层次结构,分为三层: • 抽象层(抽象类、接口和抽象方法,位于javax.mail内); • Internet邮件实现层(实现部分抽象层元素,遵循RFC822和MIME,位于javax.mail.internet内); • 协议实现层(由ISP实现对特定协议的支持)。
Java Mail体系(续) 使用JavaMail的J2EE应用程序 J2EE组件(用来实现邮件发送、接收、处理) Java Mail抽象层 Java Mail API Internet邮件实现层 邮件服务器(POP3/SMTP/IMTP等协议实现层) Java Mail体系结构
Java Mail体系(续) • 类的层次化构架以及JAF规范使得客户端可以通过JavaMail API实现不同数据类型、不同传输协议、不同存储方式数据的接受、发送与存储。
JavaMail API • Java Mail API包括两个部分 • 应用程序接口。 • 服务提供接口。 • J2EE应用程序组件可以使用Java Mail API来发送E-mail通知。
JavaMail API(续) • 一部分,由javax.mail中七个主要对象组成,即Session、Message、Address、Authenticator、Transport、Store和Folder,用以完成常见的发送消息、检索消息、删除消息、认证、回复消息、转发消息、管理附件、处理基于HTML文件格式的消息及搜索或过滤邮件列表等电子邮件任务。
JavaMail API(续) • 另一部分,主要包括Part、Message、Bodypart、Multipart、Mimepart、MimeMessage、MimeBodypart和MimeMultipart等类和接口,用以完成电子邮件的阅读、撰写等任务。
JavaMail API主要对象 • javax.mail.Session类 • 定义全局与个人邮件的相关属性,以及基本的邮件会话,是Java Mail API最高层入口类。 • Session对象利用java.util.Properties对象获取诸如邮件服务器、用户名、密码等信息,以及其他可在整个应用程序中共享的信息。 • Session是final类,无法被继承,也不能使用new语句来创建实例,但提供静态方法getInstance()和getDefaultInstance()来获取Session实例。 • 对于实现特定访问与传输协议的Store对象和Transport对象,Session类还扮演着工厂的角色。 • 每一个基于 JavaMail 的应用程序至少有一个session,但是可以有任意多的session。
JavaMail API主要对象(续) • javax.mail.Message类 • 是一个抽象类,用于定义邮件信息的一系列属性和邮件信息所包含的内容,内容是通过DataHandler对象包装后的数据。 • 实现了Part接口,该接口定义用于定义和格式化数据内容的属性,以及和邮件系统交互的接口。 • Message对象通过JAF与其中的内容进行交互,使得可用同一个方法处理任何数据,使用任何合适的传输协议传输数据。 • JavaMail API还支持多成分消息,其中每个成分都会定义各自的属性和内容,使用BodyPart对象代替了原来的各个单独成分。 • Message类的各个子类实现了一些标准的邮件格式,如javax.mail.internet.MIMEMessage类。 • Message对象可以从Folder对象中搜索获取,或者通过初始化新的Message对象的适当子类获取。
JavaMail API主要对象(续) • javax.mail.Address类 • 也是一种抽象类,使用子类javax.mail.internet.InternetAddress为邮件标上E-mail形式的地址,以与消息连接起来。 • 地址的3种预定义类型: Message.RecipientType.TO; Message.RecipientType.CC ; Message.RecipientType.BCC。 • JavaMail API没有提供检查电子邮件地址有效性的机制。
JavaMail API主要对象(续) • javax.mail.Authenticator类 • 一种验证程序类,通过用户名和密码来访问受保护的资源即邮件服务器。 • 需要先创建一个抽象类的子类,并从getPasswordAuthentication()方法返回PasswordAuthentication 实例,还必需向Session类注册Authenticator,以供需要认证时被通知。 • 可以通过弹出邮件服务器登录对话框,也可以从配置文件中,读取用户名和密码,将其作为PasswordAuthentication对象返回给调用程序。
JavaMail API主要对象(续) • javax.mail.Transport类 • 一个抽象类,使用和SMTP协议相关的语言来发送消息。 • 静态的基本send()方法机制会为每一个方法调用都建立一个独立的连接,而当需要发送多条消息时,应当采用相应的保持消息间活动服务器的连接的方法。
JavaMail API主要对象(续) • javax.mail.Store类 • Store类实现特定邮件协议上的读、写、监视、查找等操作。 • Store定义的存储器包括一个分层的目录体系,消息存储在目录内。 • 客户程序可以通过提供认证信息(主机名、用户名、密码)以connect()方法来获取一个实现了数据库访问协议的Store对象,从而访问消息存储器。 • 客户机程序可以从会话对象属性中获取认证信息,或者通过访问会话的Authenticator对象来与用户交互,要求用户输入认证信息。 • 在连接Store类后,就可以获取一个Folder类,在读取其中的消息前必须先打开该类。
JavaMail API主要对象(续) • java.mail.Folder类 • Folder类用于分级组织邮件,并提供按照javax.mail.Message格式访问E-mail的能力。 • Folder代表的目录可以容纳消息或子目录,从而提供一个类似于树的分层体系。 • 客户程序通过消息序列号或直接通过相应的Message对象引用目录中的消息。 • 对于POP3协议,唯一可用的文件夹是INBOX;如果使用的是IMAP协议,则可以使用其他的文件夹。
JavaMail 存储 • 采用文件夹的形式存储,每个文件夹中又可以包含多个子文件夹或邮件,最终形成树的层次结构。 • Folder类声明了用于获取、添加、复制、删除邮件的方法。 • Store类定义了一个数据库,用来维护文件夹的层次结构以及其中包含的邮件信息。
JavaMail API实现邮件发送的基本步骤 • 在Content-Type字段中创建头信息(Header)和一些已知的数据类型信息,使用Part接口和Message类定义邮件信息,邮件中的数据通过JAF框架下的Data-Handler类存储。 • 创建会话对象,用于验证和控制用户对邮件存储和传输的访问。 • 发送邮件至接收者列表。 • 从邮件服务器搜索所需的邮件信息。 • 对所需邮件信息执行由JAF的Aware JavaBean组件实现的浏览、打印等高级命令。
邮件服务器安装 • 安装邮件服务器 • 到网站http://www.argosoft.com/下载免费ArgoSoft邮件服务器安装文件agsmail.exe。 • 双击agsmail.exe文件进入邮件服务器安装界面,按照提示信息,先后选择“Setup--->Settings--->Install--->Start Installtion”,安装并启动邮件服务器。
邮件服务器安装(续) • 配置邮件服务器 • 在“ArGoSoft Mail Server”窗口中,对邮件服务器进行配置。 • 首先,选择“Tools--->Option---> General--->LocalHost”设置邮件服务器主机名称,选择“Tools--->Option---> Local Domains”设置域名。 • 其次,选择“Tools--->Users--->User Setup--->Add New User”,给邮件服务器添加用户。 • 退出ArGoSoft,然后重新启动,使上述配置生效。
邮件服务器安装(续) • 测试邮件服务器 • 通过邮件客户端程序(如Outlook Express、Foxmail)进行收发邮件测试。 • 以Outlook Express为例,选择“工具--->帐户--->Internet帐户--->邮件--->Internet连接向导”,按照提示依次输入显示名、邮件地址、邮件接收服务器(POP3)、接收邮件服务器地址(127.0.0.1)、发送邮件服务器地址(127.0.0.1)、帐户名、密码,完成相应帐户的设置。 • 单击Outlook Express的“新建邮件”按钮,从一个用户向另一个用户发送一封邮件,再选择“工具--->发送和接收--->发送和接收全部邮件”,测试邮件服务器工作状态。
发送简单邮件 • NewMail.jsp 用来建立邮件信息的表单,并将表单内容发送给后端Servlet处理。 • SendMail.jsp 一个Servlet,负责邮件的发送。
发送简单邮件: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>
发送简单邮件: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>
发送简单邮件:SendMail.java package 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.*;
发送简单邮件: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" ;
发送简单邮件: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")));
发送简单邮件: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")); }
发送简单邮件:SendMail.java(续) newMessage.setText(text ,”gb2312”); Transport.send(newMessage); ////显示发送成功的提示 out.println(" the Email send sucess!"); }catch(MessagingException m) { out.println(m.toString()); } } }
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”,重新启动邮件服务器。
SMTP身份认证:Auth.java package 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); } }
SMTP身份认证:sendAuthmail.java package 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;
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();
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);
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!");
SMTP身份认证:sendAuthmail.java(续) } catch (MessagingException e) { //异常处理 out.println(" the Email send failed!"); out.println(e.toString()); } } }
发送HTML邮件:form.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="MimeMail">
发送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>
发送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>
发送HTML邮件:SendMimeMail.java package 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;
发送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;