一、概述
(一)应用场景
用JavaMail实现用户注册邮箱的验证以及激活。具体来说,就是当用户注册账号时,系统自动向用户账户(用户邮箱)发送一封激活或者确认邮件,包含某个链接,用户点击这个链接就可以激活或者成功注册这个账号了。
(二)JavaMail接口
Sun公司发布的处理email的相关Java API,提供给开发者处理电子邮件相关的编程接口,它可以方便地执行一些常用的邮件传输。
相关邮件协议如下,相关原理及具体内容请读者查阅相关资料。
- 邮件发送协议:SMTP协议,属于TCP/IP协议簇,默认端口号25;
- 接收邮件协议:POP3,属于TCP/IP协议簇。默认端口号110.
(三)邮件的收发过程
举个例子,邮箱A :abc@qq.com 向邮箱B:abc@163.com 发送一封邮件,具体过程如下:
- 用户A通过相关客户端,连接到QQ邮箱的SMTP服务器;
- 编写邮件主题,内容等等;
- QQ邮箱的SMTP服务器将连接163的SMTP服务器,并传输该邮件。传输完成,该邮件存储在163服务器上。
- 用户B通过客户端,连接到163的POP3服务器,找到上述邮件并返回。
二、代码实现
(一)相关说明
一般地,此种应用场景需要数据库的配合使用,创建相应的数据库(表)来存放用户的注册信息。这里不再实现用户注册页面、用户提交数据的获取、数据库数据的存取等。这里仅实现:在拿到用户注册邮箱之后,向此邮箱发送一个激活邮件,用户点击邮件的链接(一般采用随机生成唯一激活码,点击链接的回传这个激活码,再做处理),将激活这个账号。激活的方法一般是通过用户点击链接后,更改数据库(表)中的“激活”字段标志。比如“0”代表未激活,“1”代表激活。在导入mail.jar包之后就可以开始编码了。
(二)编码
SendActiveMail.java中封装了一个发送激活邮件的静态SendMail。封装成静态方法的原因在于实际应用中我们把这个类当成工具类来使用,使其可直接通过类名访问。邮件发送分三步走:
- 连接到对应邮箱的服务器;
- 创建邮件对象;
- 发送一封激活邮件。
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
public class SendActiveMail {
/**
* @param to 用户注册邮箱账号
* @param code 随机生成的激活码
* @throws MessagingException 抛出异常
* @throws AddressException 抛出异常
*/
public static void sendMail(String to,String code) throws AddressException, MessagingException{
/*创建连接对象,连接到对应邮箱的服务器*/
Properties properties=new Properties();
properties.setProperty("host", "主机名"); //properties对象用于设置主机名,发送服务器地址等信息。这里仅举例,其他信息省略
Authenticator authenticator=new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("username", "password");
}
}; //Authenticator对象用于设置登录到邮箱服务器的账户,即给注册用户发激活邮件的账户
Session session=Session.getInstance(properties, authenticator);
/*创建邮件对象*/
Message message=new MimeMessage(session); //可通过message对象设置邮件相关信息。如下:
message.setFrom(new InternetAddress("username")); //设置发件账户,应和Authenticator对象保持一致
message.setRecipient(RecipientType.TO, new InternetAddress(to)); //设置收件账户,即传递的参数to
message.setSubject("这里是邮件主题");
message.setContent("<a href='http://mailActive/ActiveServlet?code="+code+"'>点击这里来激活</a>", "text/html;charset=UTF-8"); //设置邮件正文,为html标签内容.并回传code
/*发送一封激活邮件*/
Transport.send(message);
}
}
如上所示,当用户点击链接之后,只需要在ActiveServlet里面进行处理并更改用户表的“激活”字段即可。