在Web开发中,需要用到邮件收发组件的例子很多,例如开发一个购物网站时,若订单付款成功就需要给用户发送订单相关的邮件,在求职类网站中,应聘者也会收到面试通知的邮件等等,甚至有些公司也会开发单独的邮件收发系统。开发前,首先需要弄清楚邮件相关的协议,包括SMTP、POP3和IMAP(后面将介绍),并且需要登陆相关的邮件服务器开启这些协议服务(以新浪邮箱为例),如下图所示,在新浪邮箱中开启SMTP、POP3和IMAP服务。在Java邮件收发的开发中,常用到的就是JavaMail组件(后面将介绍)。
●SMTP、POP3和IMAP
(1)SMTP
SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
(2)POP3
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
(3)IMAP
MAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
●JavaMail简介
JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它可以方便地执行一些常用的邮件传输。我们可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。JavaMail包中用于处理电子邮件的核心类是:Session,Message,Address,Authenticator,Store,Transport, Folder等。Session定义了一个基本的邮件会话,它需要从Properties中读取类似于邮件服务器,用户名和密码等信息,JavaMail的邮件传输过程如下图所示。
●JavaMail常用类
(1)Java.util.Properties
JavaMail需要Properties来创建一个session对象。它将寻找字符串mail.smtp.host,属性值就是发送邮件的主机,如:
Properties props = new Properties ();
props.put("mail.smtp.host","[email protected]");//[email protected]就是字符串mail.smtp.host的属性。
(2)Javax.mail.Session
Session类定义了一个基本邮件会话session,是Java Mail API最高层入口类。所有其它类都是经由这个session才得以生效。Session对象用Java.util.Properties对象获取信息,如邮件服务器、用户名、密码及整个应用程序中共享的其它信息。这个Session类代表JavaMail中的一个邮件session。每一个基于JavaMail的应用程序至少有一个session但是可以有任意多的session。Session对象需要知道用来处理邮件的SMTP服务器。为了做到这一点,你可以参照下面的例子用Properties 来创建一个Session 对象:
Session sendMailSession;
sendMailSession = Session.getDefaultInstance(props);//创建了session会话
sendMailSession.setDebug(true);//设置debug模式调试发送信息,在控制台中或日志中有日志信息显示
(3)Javax.mail.Message、Javax.mail.MimeMessage
一旦获得Session对象,就可以继续创建要发送的消息。这由Message类来完成。因为Message是个抽象类,必需用一个子类,多数情况下为 Javax.mail.internet.MimeMessage。MimeMessage是个能理解MIME类型和头的电子邮件消息。Message对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session:
Message message;
message = new MimeMessage(sendMailSession);//创建一封邮件对象
message.setSubject("title");//写信,设置主题title
message.setContent("content", "text/html;charset=utf-8");//写信,设置正文内容content,响应方式和字符编码
(4)Javax.mail.Address、Javax.mail.internet.InternetAddress
一旦您创建了Session 和 Message,并将内容填入消息后,就可以用 Address 确定信件地址了。和 Message 一样,Address 也是个抽象类。您用的是 Javax.mail.internet.InternetAddress 类。代码如下:
Address address = new Address []{new InternetAddress("[email protected]"),new InternetAddress("[email protected]")}//创建address数组,同时向多地址发送
(5)Javax.mail.Transport
消息发送的最后一部分是使用Transport类。这个类用协议指定的语言发送消息。JavaMail Session对象的getTransport方法来初始化Transport。传过去的字符串申明了对象所要使用的协议,通常是SNTP。注意JavaMail并不是绝对支持每一个协议,目前支持IMAP、 SMTP和 POP3。它是抽象类,它的工作方式与Session有些类似。仅调用静态send() 方法,代码如下:
Transport transport;
transport = sendMailSession.getTransport();链接邮件服务器的认证信息
transport.connect("mailHost", "admin", "pass");//设置参数,mailHost表示邮件发送服务器,admin、pass表示使用该服务器的用户名和密码
transport.send(message);//发送消息
transport.sendMessage(message, address);//设置收件人地址,并且发送邮件
(6)Javax.mail.Store
Store类实现特定邮件协议上的读、写、监视、查找等操作。通过Store类的方法可以访问。
Store store = session.getSorte(pop3);// 获取Store对象
store.connect(popserver,username,password);// POP服务器的登陆认证
(7)Javax.mail.Folder
在连接到Store后,一个Folder对象即目录对象将通过Store的getFolder()方法被返回,我们可从这个Folder中读取邮件信息:
Folder folder = store.getFolder("INBOX");// 获得用户的邮件帐户
folder.open(Folder.READ_WRITE); // 设置对邮件帐户的访问权限
Message[] messages = folder.getMessages();// 得到邮箱帐户中的所有邮件
●邮件发送实例
如下图所示,在邮件发送界面可以填写收件人邮箱、邮件的主题和内容,填好之后点击发送(点击重置可清除所有内容),收件人登陆邮箱后可查看到收到的邮件,如下图所示。
开发前需要引入mail.jar包
●邮件发送实例完整代码:
sendMail.jsp页面:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<title>邮件发送title>
head>
<body>
当前邮箱:[email protected]
<form action="mailDeal.jsp" method="post">
收信人邮箱:<input type="text" name="to">
主题:<input type="text" name="title"><br>
内容:<br><textarea rows="10" cols="80" name="content">textarea><br>
<input type="submit" value="发送">
<input type="reset" value="重置">
form>
body>
html>
mailDeal.jsp页面:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<title>文件上传title>
head>
<body>
<% String mailHost="smtp.sina.com";//邮件服务器
String admin="lwb1084514417";//邮箱服务器用户名
String pass="********";//邮箱服务器密码,不可见
String fromUser="[email protected]";//发件人邮箱
request.setCharacterEncoding("utf-8");
String toUser = request.getParameter("to").trim();
String title = request.getParameter("title").trim();
String content = request.getParameter("content").trim();
//创建邮件发送相关对象
Properties props=new Properties();
Session sess=null;
Message message=null;
Transport transport=null;
try{
props.setProperty("mail.transport.protocol", "smtp");
sess=Session.getDefaultInstance(props);//创建了session会话
sess.setDebug(true);//设置debug模式调试发送信息,在控制台中或日志中有日志信息显示
message=new MimeMessage(sess);//创建一封邮件对象
message.setSubject(title);//写信
message.setContent(content, "text/html;charset=utf-8");//正文内容
message.setFrom(new InternetAddress(fromUser));//发件人地址
transport=sess.getTransport();//链接邮件服务器的认证信息
transport.connect(mailHost, admin, pass);//设置参数
transport.sendMessage(message, new Address []{new InternetAddress(toUser)});//设置收件人地址,并且发送邮件
}catch (Exception e) {
throw new RuntimeException(e);
}finally{
try {
transport.close();//关闭传输
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
%>
body>
html>
●邮件接收实例
如下图所示,可以看到邮箱账户[email protected]的所有邮件信息,包括邮件主题、发件人邮箱地址和邮件内容。具体的操作将在代码注释中给出。
●邮件接受实例完整代码:
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<html>
<head>
<title>邮件接收title>
head>
<body>
当前邮箱:[email protected]<br>
所有邮件:<br><hr>
<%
String pop3Server = "pop.sina.com";
String protocol = "pop3";
String username = "[email protected]";
String password = "lwb940804"; // QQ邮箱的SMTP的授权码,什么是授权码,它又是如何设置?
Properties props = new Properties();
props.setProperty("mail.transport.protocol", protocol); // 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host", pop3Server); // 发件人的邮箱的 SMTP服务器地址
Session sess = Session.getDefaultInstance(props);// 获取连接
sess.setDebug(false);
Store store = sess.getStore(protocol);// 获取Store对象
store.connect(pop3Server, username, password); // POP3服务器的登陆认证
// 通过POP3协议获得Store对象调用这个方法时,邮件夹名称只能指定为"INBOX"
Folder folder = store.getFolder("INBOX");// 获得用户的邮件帐户
folder.open(Folder.READ_WRITE); // 设置对邮件帐户的访问权限
Message[] messages = folder.getMessages();// 得到邮箱帐户中的所有邮件
for (Message message : messages) {
String subject = message.getSubject();// 获得邮件主题
String from = ((InternetAddress)message.getFrom()[0]).getAddress();// 获得发送者地址
String content = message.getContent().toString();// 获得邮件内容
%>
邮件主题:<%=subject %><br>
发件人地址:<%=from %><br>
内容:<%=content %>
<hr>
<%
}
folder.close(false);// 关闭邮件夹对象
store.close(); // 关闭连接对象
%>
body>