SpringBoot实现邮箱验证码

介绍

我们使用redis数据库保存临时的邮箱验证码信息

快速开始

1. 导入依赖



    org.springframework.boot
    spring-boot-starter-mail



    org.springframework.boot
    spring-boot-starter-data-redis




    org.apache.commons
    commons-pool2

2. 获取授权码

qq邮箱-->设置-->账户-->开启服务(POP3/SMTP服务)

按要求发送短信,即可获取授权码

SpringBoot实现邮箱验证码_第1张图片

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("医院官方")+"															<[email protected]>").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. 接收邮件

SpringBoot实现邮箱验证码_第2张图片

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;
}

你可能感兴趣的:(SpringBoot,优质博客,java,redis,spring,boot,email)