-
背景
相信你一定有过使用邮件激活账号,或者通过邮件更改密码等如下图这样类似的经历了吧
接下来我们通过注册账号时发送激活邮件这样的真实案例去搞明白这些程序的背后奥秘 -
预处理
相信你有一定的网络技术的功底,那么你一定知道发送接收邮件也是需要协议去约束。POP3/IMAP是接收邮件的协议,SMTP是发送邮件协议。 打一个比方,有一天你给某期刊投稿。你使用qq邮箱给人发邮件,邮件把提交到qq邮箱的POP3服务器中,然后POP3服务器把你的邮件发送给网易POP3服务器中。很多人以为通过qq邮箱的POP3服务器应该发送给网易的SMTP服务器中,但是我们知道协议必须得一致,你可以理解像接口一样。然后网易POP3服务器把你的邮件提到SMTP服务器中,再由SMTP服务器发送到你个人邮箱中。以上是发送与接收邮件的简单流程。
我这里使用qq邮箱,在程序之前还需要把qq邮箱的POP3/IMAP服务打开,如下图。开启后,会给一个密钥,记好这个密钥,我们后面需要使用。
-
总体设计
当我们在注册一个账号,如下图,需要填写一些个人信息。点击注册,我们后台拿到这些数据,就在数据库增加一个user用户,在user用户我们需要设置一个Code状态码这样的字段。因为我们现在只是注册了账号,但是并没有激活账号,后续的功能必须得激活后使用。
数据库设计如下
注册完账号后,我们拿到注册时的邮箱,给该邮箱发送一个邮件,该邮件可以内置一个链接或者激活码,大同小异。点击链接,即可激活账号若是激活码则回填激活码,激活账号。
注意,我发现这个qq邮件不能内置超链接,可能处于保护吧。所以我这里是把链接直接写出来了
点击了链接,其实是向服务器发送了一个请求,而该请求是将Code状态码改变,达到激活的目的
我们可以发现状态码由0转为1,即为账号激活 -
源码分析
发送邮件的工具,需要使用mail包
两个参数email是qq邮箱,emailMsg是邮件内容
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 MailUtils {
public static void sendMail(String email, String emailMsg)
throws AddressException, MessagingException {
// 1.创建一个程序与邮件服务器会话对象 Session
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "SMTP");
props.setProperty("mail.host", "smtp.qq.com");
props.setProperty("mail.smtp.auth", "true");// 指定验证为true
// 创建验证器
Authenticator auth = new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("账号", "密钥");
}
};
Session session = Session.getInstance(props, auth);
// 2.创建一个Message,它相当于是邮件内容
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("xxxxxxxxxxxx@qq.com")); // 设置发送者
message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 设置发送方式与接收者
message.setSubject("用户激活");
// message.setText("这是一封激活邮件,请<a href='#'>点击</a>");
message.setContent(emailMsg, "text/html;charset=utf-8");
// 3.创建 Transport用于将邮件发送
Transport.send(message);
}
}