前言
现在许多pc程序都有着使用邮箱验证码实现登录注册的功能,那么我们应该如何完成邮箱验证码功能呢,我们可以使用springboot内置的springboot-mail再结合redis来完成这个功能。
代码实现
一、引入springboot-mail和redis依赖
<!--邮箱依赖-->
<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>
二、邮箱常量类
public class MailConstant {
/**
* 邮箱验证redis前缀
*/
public static final String CODE_KEY_PREFIX = "mail:";
}
三、邮箱工具类
@Slf4j
@Service
public class MailUtils {
@Resource
RedisTemplate<String, Integer> redisTemplate;
@Resource
private JavaMailSenderImpl mailSender;
public void sendMail(Mail mail) throws MailSendException {
try {
MimeMessageHelper messageHelper = new MimeMessageHelper(mailSender.createMimeMessage(), true);
if (mail.getFrom() == null || mail.getFrom().isEmpty()) {
mail.setFrom("xxx");
}
//邮件发信人
messageHelper.setFrom(mailSender.getUsername() + '(' + mail.getFrom() + ')');
//邮件收信人
messageHelper.setTo(mail.getTo().split(","));
//邮件主题
messageHelper.setSubject(mail.getSubject());
//邮件内容
messageHelper.setText(mail.getText());
//发送邮件
mailSender.send(messageHelper.getMimeMessage());
} catch (Exception e) {
log.warn("邮件发送失败:{}", e.getMessage());
throw new MailSendException("邮件发送失败:" + e.getMessage());
}
}
/**
* 发送验证码邮件
*
* @param mail 邮件信息
*/
public void sendVerificationCode(Mail mail) {
// 判断当前待发送邮箱是否已经有验证码
String key = CODE_KEY_PREFIX + mail.getTo();
Integer code = redisTemplate.opsForValue().get(key);
if (code != null) {
throw new UserException("当前邮箱已经发送验证码");
}
// 生成随机 6位验证码
int idenCode = (int) ((Math.random() * 9 + 1) * 100000);
mail.setSubject("xxx");
mail.setText("验证码:" + idenCode);
redisTemplate.opsForValue().set(key, idenCode, 60, TimeUnit.SECONDS);
sendMail(mail);
}
}
四、代码调用
4.1 发送邮箱
/**
* 发送邮箱验证码
*
* @param email 用户邮箱
* @return 发送结果
*/
@PostMapping("send/code")
public Result<?> sendUserMail(String email) {
Mail mail = new Mail();
mail.setTo(email);
mailUtils.sendVerificationCode(mail);
return Result.ok(null, "发送成功");
}
4.2 用户注册
@Override
public boolean userRegister(User user, Integer captcha) {
//判断用户是否已经注册
User exist = getOne(Wrappers.<User>lambdaQuery().eq(User::getMail, user.getMail()));
if(exist!=null){
throw new UserException("用户已注册");
}
// 判断验证码是否相同
String key = CODE_KEY_PREFIX + user.getMail();
Integer authcode = (Integer) redisTemplate.opsForValue().get(key);
if (authcode == null) {
throw new UserException("验证码已过期,请重新发送");
}
if (!authcode.equals(captcha)) {
throw new UserException("验证码错误");
}
return userMapper.insert(user)>0;
}
总结
以上就是springboot实现邮箱验证码登录注册的基本实现,觉得有用的大家可以点点赞。