发送邮箱验证码

5,132 阅读2分钟

原理

邮箱验证其实本质上就是发送邮件的过程。

SMTP协议

SMTP(Simple Mail Transfer Protocol-简单邮件传输协议),是用于发送邮件的规则协议。SMTP属于TCP/IP协议簇。

所以SMTP服务器就是符合SMTP协议的发送邮件的服务器,作用就是用来发送邮件。

该协议默认端口号是25

POP3协议

POP3(Post Office Protocol - Version 3 邮局协议版本3)是用于支持使用客户端远程管理服务器上的电子邮件,因此,在收邮件时,需要使用该协议从对应的服务器上获取邮件。

邮件发送/接收过程

邮件收发过程

准备工作

  1. 开启邮箱中的服务

以163邮箱为例,登录一个用于发送验证码的邮箱账号,然后在设置中开启SMTP/POP3服务等,如下图所示:

邮箱开启POP3等服务

分别点击开启IMAP/SMTP和POP3/SMTP服务,按照提示发送短信,并记录下授权码(授权码只显示一次,要做好记录)。

  1. 在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 于 江苏南通

感谢!