邮箱验证码功能开发

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

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

一,准备工作

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("验证码错误");
        }
    }

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

相关推荐
菜鸟‍5 小时前
【后端项目】苍穹外卖day01-开发环境搭建
java·开发语言·spring boot
indexsunny6 小时前
互联网大厂Java求职面试实战:核心技术与业务场景解析
java·spring boot·redis·微服务·kafka·互联网大厂·面试技巧
程序猿大波6 小时前
基于java,SpringBoot和Vue餐饮公司食堂管理系统设计
java·vue.js·spring boot
wuyaolong0077 小时前
Spring Boot 3.4 正式发布,结构化日志!
java·spring boot·后端
a5629916198 小时前
【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目
java·spring boot·spring
编程小风筝10 小时前
如何用redission实现springboot的分布式锁?
spring boot·分布式·后端
码喽7号11 小时前
Springboot学习六:MybatisPlus的多表查询以及分页查询
java·spring boot·学习
不吃香菜学java11 小时前
苍穹外卖-新增菜品需求分析
java·spring boot·spring·tomcat·maven·ssm
智能工业品检测-奇妙智能12 小时前
开源知识库平台有哪些
服务器·人工智能·spring boot·开源·openclaw·奇妙智能
计算机学姐13 小时前
基于SpringBoot的中药材店铺管理系统
java·vue.js·spring boot·后端·spring·tomcat·推荐算法