SpringBoot实现邮箱验证码

介绍

我们使用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;
}
  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙域、白泽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值