目录:
前言
一、POM依赖
二、获取验证码
三、配置文件
四、业务代码
1.service接口
2.service实现类
3.相关工具类Util
4.查询Redis数据库
5.接收邮件
前言
邮箱验证码是一个常见的功能,常用于邮箱绑定、修改密码等操作上,本篇博客只要讲的是如何使用springboot实现验证码的发送功能。我使用redis数据库保存临时的邮箱验证码信息。
一、POM依赖
<dependencies>
<!--mail邮件发送-->
<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>
</dependencies>
二、获取验证码
步骤:1.登录QQ邮箱-->2.设置-->3.账户安全-->4.开启服务(POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务)
按要求发送短信,即可获取授权码(获取的授权码记得保存,之后会用到哦)
三、配置文件
- username:是你的邮箱,不是用户名
- password:是授权码,不是密码
- host:是SMTP服务器,不是IP地址
spring:
# mail邮箱
mail:
# SMTP服务器(我用的是QQ邮箱的SMTP服务器地址,如果用的其它邮箱请另行百度搜索)
host: smtp.qq.com
# 发送验证码的邮箱(发件人的邮箱)
username: ***@qq.com
# 授权码
password: ***
# 编码
default-encoding: utf-8
# 其它参数
properties:
mail:
smtp:
# 如果是用SSL方式,需要配置如下属性,使用qq邮箱的话需要开启
ssl:
enable: true
required: true
# 邮件接收时间的限制,单位毫秒
timeout: 10000
# 连接时间的限制,单位毫秒
connection-timeout: 10000
# 邮件发送时间的限制,单位毫秒
write-timeout: 10000
PS:我这里用的是QQ邮箱做的演示,如果用的其它邮箱请另行百度搜索,替换SMTP地址。
四、业务代码
1.service接口
// 发送邮件
String sendEmail(String email);
2.service实现类
PS:需要先判断这个邮箱是否在redis中已经存在key,防止重复发送。
import com.test.java.util.VerifyCodeUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;
import java.util.concurrent.TimeUnit;
/**
* 用户业务实现类
*/
@Service
@Slf4j
public class UserServiceImpl implements UserService {
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private JavaMailSender javaMailSender;
@Resource
private VerifyCodeUtil verifyCodeUtil;
@Override
public String sendEmail(String email) {
if (StringUtils.isBlank(email)) {
throw new RuntimeException("未填写收件人邮箱");
}
// 定义Redis的key
String key = "msg_" + email;
ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
String verifyCode = valueOperations.get(key);
if (verifyCode == null) {
// 随机生成一个6位数字型的字符串
String code = verifyCodeUtil.generateVerifyCode(6);
// 邮件对象(邮件模板,根据自身业务修改)
SimpleMailMessage message = new SimpleMailMessage();
message.setSubject("**游戏注册邮箱验证码");
message.setText("尊敬的用户您好!\n\n感谢您注册**游戏。\n\n尊敬的: " + email + "您的校验验证码为: " + code + ",有效期5分钟,请不要把验证码信息泄露给其他人,如非本人请勿操作");
message.setTo(email);
try {
// 对方看到的发送人(发件人的邮箱,根据实际业务进行修改,一般填写的是企业邮箱)
message.setFrom(new InternetAddress(MimeUtility.encodeText("**游戏官方") + "<1*********@qq.com>").toString());
// 发送邮件
javaMailSender.send(message);
// 将生成的验证码存入Redis数据库中,并设置过期时间
valueOperations.set(key, code, 5L, TimeUnit.MINUTES);
log.info("邮件发送成功");
return "邮件发送成功";
} catch (Exception e) {
log.error("邮件发送出现异常");
log.error("异常信息为" + e.getMessage());
log.error("异常堆栈信息为-->");
return "邮件发送失败";
//e.printStackTrace();
//throw new RuntimeException(e);
}
} else {
return "验证码已发送至您的邮箱,请注意查收";
}
}
3.相关工具类Util
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Random;
/**
* 验证码相关工具类
*/
@Component
public class VerifyCodeUtil {
@Resource
private StringRedisTemplate stringRedisTemplate;
/**
* 随机生成指定长度字符串验证码
*
* @param length 验证码长度
*/
public String generateVerifyCode(int length) {
String strRange = "1234567890";
StringBuilder strBuilder = new StringBuilder();
for (int i = 0; i < length; ++i) {
char ch = strRange.charAt((new Random()).nextInt(strRange.length()));
strBuilder.append(ch);
}
return strBuilder.toString();
}
/**
* 校验验证码(可用作帐号登录、注册、修改信息等业务)
* 思路:先检查redis中是否有key位对应email的键值对,没有代表验证码过期;如果有就判断用户输入的验证码与value是否相同,进而判断验证码是否正确。
*/
public Integer checkVerifyCode(String email, String code) {
int result = 1;
ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
String msgKey = "msg_" + email;
String verifyCode = valueOperations.get(msgKey);
/*校验验证码:0验证码错误、1验证码正确、2验证码过期*/
if (verifyCode == null) {
result = 2;
} else if (!code.equals(verifyCode)) {
result = 0;
}
// 如果验证码正确,则从redis删除
if (result == 1) {
stringRedisTemplate.delete(msgKey);
}
return result;
}
}
4.查询Redis数据库
5.接收邮件
如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。