原理
邮箱验证其实本质上就是发送邮件的过程。
SMTP协议
SMTP(Simple Mail Transfer Protocol-简单邮件传输协议),是用于发送邮件的规则协议。SMTP属于TCP/IP协议簇。
所以SMTP服务器就是符合SMTP协议的发送邮件的服务器,作用就是用来发送邮件。
该协议默认端口号是25
POP3协议
POP3(Post Office Protocol - Version 3 邮局协议版本3)是用于支持使用客户端远程管理服务器上的电子邮件,因此,在收邮件时,需要使用该协议从对应的服务器上获取邮件。
邮件发送/接收过程

准备工作
- 开启邮箱中的服务
以163邮箱为例,登录一个用于发送验证码的邮箱账号,然后在设置中开启SMTP/POP3服务等,如下图所示:
分别点击开启IMAP/SMTP和POP3/SMTP服务,按照提示发送短信,并记录下授权码(授权码只显示一次,要做好记录)。
- 在SpringBoot工程中,导入email组件包
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.5</version>
</dependency>
开始实现
我这里只演示Java代码如何编写以及各方法的含义,至于如何生成验证码和前端界面的实现,大家就自己实现。
编写工具类:
public class EMailUtil {
public static void send(String sendTo){
HtmlEmail email=new HtmlEmail();
try{
email.setHostName("smtp.163.com");
email.setCharset("UTF-8");
email.addTo(sendTo);
email.setFrom("xxxxx@163.com","smaog");
email.setAuthentication("xxxxx@163.com","xxxxxxxxxx");
email.setSubject("test mail");
email.setMsg("this is a test message");
email.send();
}catch (Exception e){
e.printStackTrace();
}
}
}
- setHostName: 主机名,如果是用163邮箱发送就如上,如果是用qq邮箱发送,就是smtp.qq.com
- setCharset: 字符集,一般是UTF-8
- addTo:邮件接收方
- setFrom: 邮件发送方,也就是刚刚开通POP3服务的邮箱,第一个参数位邮箱地址,第二个参数为发送方的别名
- setAuthentication: 授权方,第一个参数为邮件发送方地址,第二个参数为刚刚记录下的授权码(注意:不是邮箱登录密码)
- setSubject: 邮件主题
- setMsg: 邮件内容
控制器实现:
@Controller
public class MailTest {
@RequestMapping("/test")
@ResponseBody
public String test(){
EMailUtil.send("xxxxxxxx@163.com");
return "test mail";
}
}
如果过程中出现了Sending the email to the following server failed : smtp.163.com:25这个错误,可能是误把授权码写成了密码或者授权码写错了。
最后发送的邮件效果如下:
总结
在实际的开发过程中,还有很多小细节,比如前端要实现邮箱的格式验证,发送验证码后倒计时,后端还要实现验证码的生成等。这些小细节可以自行查阅资料,最主要还是本文所实现的发送的功能。
2020-03-31 于 江苏南通
感谢!