介绍
我们使用redis数据库保存临时的邮箱验证码信息
快速开始
1. 导入依赖
<!--mail邮件发送pom支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--redis场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis 连接池 -->
<!--新版本连接池lettuce-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2. 获取授权码
qq邮箱-->设置-->账户-->开启服务(POP3/SMTP服务)
按要求发送短信,即可获取授权码
3. 配置文件
- username:是你的邮箱,不是用户名
- password:是授权码,不是密码
- host:是SMTP服务器,不是IP地址
#****************************mail***************************
spring:
mail:
# SMTP服务器,这个是QQ邮箱的 其他邮箱请另行百度
host: smtp.qq.com
# 发送验证码的邮箱
username: ***@qq.com
# 授权码
password: ***
# 编码
default-encoding: utf-8
# 其它参数
properties:
mail:
smtp:
# 如果是用 SSL 方式,需要配置如下属性,使用qq邮箱的话需要开启
ssl:
enable: true
required: true
# 邮件接收时间的限制,单位毫秒
timeout: 10000
# 连接时间的限制,单位毫秒
connectiontimeout: 10000
# 邮件发送时间的限制,单位毫秒
writetimeout: 10000
4. 编写代码发送邮件
思路:先判断这个邮箱是否在redis已经存在key,防止重复发送
@Resource(name = "redisTemplateDefault")
private StringRedisTemplate stringRedisTemplate;
@Resource
private JavaMailSender mailSender;
@GetMapping("/sendEmail/{email}")
public String sendEmail(@PathVariable String email) throws UnsupportedEncodingException, AddressException {
String key = "msg_"+email;
ValueOperations valueOperations = stringRedisTemplate.opsForValue();
String already_have = (String) valueOperations.get(key);
if(already_have == null){
// 随机生成一个6位数字型的字符串
String code = "123456";
// 邮件对象
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("医院小程序邮箱验证码");
message.setText("尊敬的用户您好!\n\n感谢您使用XX医院。\n\n尊敬的: "+email+"您的校验验证码为: "+code+",有效期2分钟,请不要把验证码信息泄露给其他人,如非本人请勿操作");
message.setTo(email);
// 对方看到的发送人
message.setFrom(new InternetAddress(MimeUtility.encodeText("医院官方")+" <2774668116@qq.com>").toString());
//发送邮件
try {
javaMailSender.send(message);
valueOperations.set(key,code,5L, TimeUnit.MINUTES);
log.info("邮件发送成功");
}catch (Exception e){
log.error("邮件发送出现异常");
log.error("异常信息为"+e.getMessage());
log.error("异常堆栈信息为-->");
e.printStackTrace();
}
return code;
}else{
return already_have;
}
}
5. 接收邮件
6. 数据存储到redis数据库
7. 校验邮箱验证码
思路:先检查redis中是否有key位对应email的键值对,没有代表验证码过期,如果有就判断用户输入的验证码与value是否相同,进而判断验证码是否正确。
public Integer verifyCode(String email, String code) {
int result = 1;
ValueOperations valueOperations = stringRedisTemplate.opsForValue();
String msgKey = "msg_" + email;
Object value = valueOperations.get(msgKey);
if(value == null){
result = -1;
}else if(!code.equals(value)) {
result = 0;
}
// 如果验证码正确,则删除从redis
if(result == 1){
stringRedisTemplate.delete(msgKey);
}
/*
1 验证码正确
0 验证码错误
-1 验证码过期
*/
return result;
}