本文讲解是基于前后端分离项目
关于项目使用邮箱忘记密码的功能
- 前端需要设计一个页面,点击找回密码,跳转到找回密码界面。
- 找回密码界面有三个数据项:邮箱号(当然也可以是手机号,不过本篇文章主要研究邮箱的方式)、验证码。
- 用户输入邮箱,点击发送验证码。此时前端调用后端的接口(数据部分会带上邮箱号)
- 后端接收到邮箱,会先在数据库查找该邮箱号是否存在。如果不存在,则返回前端一些可读的错误信息。如果查询到邮箱对应有存在用户,则可以执行向该邮箱发送验证码的功能。
- 想要通过Java向指定的邮箱发送验证码,首先我们能要了解两个核心类
首先需要引入pom依赖:
这里其实就是spring的context包,只要有这个包就可以进行邮件的传输了:
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
MailSender
MailSender
:邮件发送器,主要功能是指定邮箱主机名、SMTP端口、发送方的qq邮箱和授权码,我们可以定义一个配置类,使用@Bean的方式配置相关信息
/**
* qq邮箱配置类
*/
@Configuration
public class MailConfig {
private static final String USERNAME="211213@qq.com"; // 指定发送邮件的账户
private static final String PASSWORD="dAWEDWEFWEFED"; //指定发送邮箱的授权码
/**
* 配置MailSender
* MailSender是一个接口,其一个实现类为JavaMailSenderImpl
* @return
*/
@Bean
public MailSender mailSender(){
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost("smtp.qq.com"); //指定用来发送邮件服务器的主机名
mailSender.setPort(587); //默认端口,标准的SMTP端口
mailSender.setUsername(USERNAME); //配置自己的qq邮箱
mailSender.setPassword(PASSWORD); //配置自己的qq邮箱发送授权码
return mailSender;
}
}
这里需要配置password即授权码,下面介绍授权码的获取方式
获取qq邮箱授权码
这里我们又遇到了一个核心数据,授权码,我们使用的是qq邮箱,所以进入qq邮箱界面,按如下操作获取授权码:
点击了步骤2后会自动弹出获取授权码功能,如下成功获取授权码:
SimpleMailMessage
另一个核心类:SimpleMailMessage
:
发送器配置了过后,我们就可以指定要发送的消息了。
这里一个重要的消息类为SimpleMailMessage,它主要用来封装邮件的相关信息,通过set方法指定要发送的信息。
我们可以创建一个MailUtil,专门用来发送消息:
public class MailUtil {
//注意这里一定要和Mail配置中的邮箱对应,不然无法成功发送
public static final String FROM_EMAIL="2234234234@qq.com";
/**
* 发送邮件的方法,传入的参数 邮件发送器,目标邮箱,关键验证码信息
* @param mailSender
* @param toEmail
* @param code
*/
public static void sendMessageToMail(MailSender mailSender,String toEmail, String code){
SimpleMailMessage message = new SimpleMailMessage(); //消息体构造器
message.setFrom(FROM_EMAIL); //发件人
message.setTo(toEmail); //收件人
message.setSubject("某某网站-用户找回密码"); //主题
message.setText("您本次的验证码是:" +code); //正文内容
mailSender.send(message);
System.out.println(code);
}
}
生成六位随机数字字符串
另外再提一嘴,code验证码通常是6位数字,这里我在提供一个用于生成6为数字的字符串方法:
/**
* 生成六位随机数
*/
public static String getSixRandom(){
Random random = new Random();
String result = "";
for(int i = 0;i<6;i++){
result+=random.nextInt(10);
}
return result;
}
后端需要向指定邮箱发送验证码,并将此一验证码通过用户Id为键的方式存进redis中,下次验证验证码是否正确会用到。
- 前端接受到邮箱发送过来的验证码,填入后点击确定,调用后端接口。后端验证指定的id是否再redis中存在对应的验证码并检验是否相等,若相等,前端则弹出修改密码的窗口,之后后端将密码密文加密后保存到数据库。