邮箱验证码功能开发

该文章用于记录怎么进行邮箱验证码开发。

总所周知,我们在某些网站进行注册的适合总是会遇到什么填写邮箱,邮箱接收验证码,验证通过后才可以继续注册,那么这个功能是怎么实现的呢?

一,准备工作

1.1 邮箱设置

要进行邮箱验证码验证,首先我们得要有一个邮箱。同时我们要在邮箱里面打开对应服务,我以QQ邮箱为例:

先点击设置

在设置中点击账号:

往下滑,在这里,点击开启服务:

然后就是按指示进行操作,最后就好了,可以得到授权码:

1.2 后端环境配置:

至于数据库什么的配置那就不详细赘述了,你的后端里面要有redis,这很关键。

在对应模块的pom.xml文件里导入如下依赖:

xml 复制代码
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

然后,到application.yml配置文件中进行配置:

yaml 复制代码
spring:
  mail:
    # 发送者邮箱
    username: 你的邮箱
    #申请到的授权码
    password: 你的授权码
    # 配置 SMTP 服务器地址
    host: smtp.qq.com
    # 端口号465或587
    port: 465
    protocol: smtps
    # 默认的邮件编码为UTF-8
    default-encoding: UTF-8
    # 配置SSL 加密工厂
    properties:
      mail:
        smtp:
          socketFactoryClass: javax.net.ssl.SSLSocketFactory
          #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
          debug: true
          ssl: true

二,代码实现步骤

2.1 随机验证码生成工具:

CodeGeneratorUtil.java:

java 复制代码
import java.util.UUID;

/**
 * @author Administrator
 * @date 2024/7/13 15:47
 * @description CodeGeneratorUtil
 */
public class CodeGeneratorUtil {
    /**
     * 生成指定长度的验证码
     * @param length 长度
     * @return
     */
    public static String generateCode(int length){
        return UUID.randomUUID().toString().substring(0, length);
    }
    
}

2.2 验证码发送工具:

MailMsg.java:

java 复制代码
import lombok.Value;
import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.time.Duration;

/**
 * @author Administrator
 * @date 2024/7/13 15:36
 * @description MailMsg
 */
@Component
public class MailMsg {
    @Resource
    private JavaMailSenderImpl mailSender;
    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    public boolean mail(String email) throws MessagingException {

        MimeMessage mimeMessage = mailSender.createMimeMessage();
        //生成随机验证码
        String code = CodeGeneratorUtil.generateCode(6);
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        //设置一个html邮件信息
        helper.setText("<p style='color: blue'>你的验证码为:\n" + code + "\n(有效期为五分钟)</p>", true);
        //设置邮件主题名
        helper.setSubject("验证码");
        //发给谁-》邮箱地址
        helper.setTo(email);
        //谁发的-》发送人邮箱
        helper.setFrom(你的邮箱);
        //将邮箱验证码以邮件地址为key存入redis,5分钟过期
        redisTemplate.opsForValue().set(email, code, Duration.ofMinutes(5));
        mailSender.send(mimeMessage);
        return true;
    }
}

这里就不得不提到redis的优点--过期删除策略了。在redis中,我们可以给一个字段设置过期时间,到时间就会自动删除字段,这个用来存验证码就太合适不过了。

大概是这样设置:
redisTemplate.opsForValue().set(key,value,time)

第一个参数是键,第二个参数是值,第三个参数是时间。

2.3 验证码发送接口:

在你的某个controller里面写这个就行了。

java 复制代码
	@ApiOperation(value = "发送邮箱验证码")
    @GetMapping(value = "/sendEmail/{email}")
    public Result<Object> sendCode(@PathVariable String email) throws MessagingException {
        log.info("邮箱码:{}",email);
        //从redis中取出验证码信息
        String code = redisTemplate.opsForValue().get(email);
        if (!StringUtils.isEmpty(code)) {
            return Result.error(email + ":" + code + "已存在,还未过期");
        }
        boolean b = mailMsg.mail(email);
        if (b) {
            return Result.success(" 验证码已发送至邮箱,请注意查收!");
        }
        return Result.error("邮箱不正确或为空!");
    }

2.4 注册功能

这里就属于是抛砖引玉,大伙们还有什么更好的想法和扩展呢?

java 复制代码
@PostMapping("/register")
    @ApiOperation("注册接口")
    public Result register(@RequestBody RegisterDTO registerDTO){
        log.info("用户注册:{}", registerDTO);
        String code = registerDTO.getCode();
        log.info("前端输入的验证码{}", code);
        String eml = registerDTO.getEmail();
        log.info("前端的对象为{},邮箱=》{}",registerDTO,eml);
        String s = redisTemplate.opsForValue().get(eml);
        log.info("从redis中获取code->{}",s);
        if (Objects.equals(s, code)) {
            log.info("验证码正确{}", code);
            userService.register(registerDTO);
            return Result.success(MessageConstant.Register_SUCCESS);
        }else{
            return Result.error("验证码错误");
        }
    }

验证码功能大概就是这样了。

相关推荐
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭9 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
AskHarries11 小时前
Spring Cloud OpenFeign快速入门demo
spring boot·后端
isolusion12 小时前
Springboot的创建方式
java·spring boot·后端
Yvemil712 小时前
《开启微服务之旅:Spring Boot Web开发举例》(一)
前端·spring boot·微服务
星河梦瑾14 小时前
SpringBoot相关漏洞学习资料
java·经验分享·spring boot·安全
计算机学长felix15 小时前
基于SpringBoot的“交流互动系统”的设计与实现(源码+数据库+文档+PPT)
spring boot·毕业设计
.生产的驴15 小时前
SpringBoot 对接第三方登录 手机号登录 手机号验证 微信小程序登录 结合Redis SaToken
java·spring boot·redis·后端·缓存·微信小程序·maven
顽疲15 小时前
springboot vue 会员收银系统 含源码 开发流程
vue.js·spring boot·后端
撒呼呼15 小时前
# 起步专用 - 哔哩哔哩全模块超还原设计!(内含接口文档、数据库设计)
数据库·spring boot·spring·mvc·springboot
因我你好久不见15 小时前
springboot java ffmpeg 视频压缩、提取视频帧图片、获取视频分辨率
java·spring boot·ffmpeg