当前位置: 首页 > news >正文

邮箱验证码功能开发

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

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

一,准备工作

1.1 邮箱设置

要进行邮箱验证码验证,首先我们得要有一个邮箱。同时我们要在邮箱里面打开对应服务,我以QQ邮箱为例:
先点击设置
在这里插入图片描述
在设置中点击账号:
在这里插入图片描述
往下滑,在这里,点击开启服务:
在这里插入图片描述
然后就是按指示进行操作,最后就好了,可以得到授权码:
在这里插入图片描述

1.2 后端环境配置:

至于数据库什么的配置那就不详细赘述了,你的后端里面要有redis,这很关键。
在对应模块的pom.xml文件里导入如下依赖:

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>

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

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

二,代码实现步骤

2.1 随机验证码生成工具:

CodeGeneratorUtil.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:


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 {@Resourceprivate JavaMailSenderImpl mailSender;@Autowiredprivate 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里面写这个就行了。

	@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 注册功能

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

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

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

相关文章:

邮箱验证码功能开发

该文章用于记录怎么进行邮箱验证码开发。 总所周知&#xff0c;我们在某些网站进行注册的适合总是会遇到什么填写邮箱&#xff0c;邮箱接收验证码&#xff0c;验证通过后才可以继续注册&#xff0c;那么这个功能是怎么实现的呢&#xff1f; 一&#xff0c;准备工作 1.1 邮箱…...

2024-07-15 Unity插件 Odin Inspector3 —— Button Attributes

文章目录 1 说明2 Button 特性2.1 Button2.2 ButtonGroup2.3 EnumPaging2.4 EnumToggleButtons2.5 InlineButton2.6 ResponsiveButtonGroup 1 说明 ​ 本文介绍 Odin Inspector 插件中有关 Button 特性的使用方法。 2 Button 特性 2.1 Button 依据方法&#xff0c;在 Inspec…...

根据脚手架archetype快速构建spring boot/cloud项目

1、找到archetype&#xff0c;并从私仓下载添加archetype到本地 点击IDEA的file&#xff0c;选择new project 选择maven项目&#xff0c;勾选create from archetype 填写archetype信息&#xff0c;&#xff08;repository填写私仓地址&#xff09; 2、选择自定义的脚手架arche…...

安灯系统在电力设备制造业中的应用效果

安灯系统作为面向制造业生产现场的专门应用软硬件系统&#xff0c;在电力设备制造企业中发挥着重要的作用。作为精益制造执行的核心工具&#xff0c;安灯系统为企业提供了快速联络生产、物料、维修、主管等部门的功能&#xff0c;以实时掌控和管理生产线状况&#xff0c;实现生…...

代码随想录打卡第二十五天

代码随想录–回溯部分 day 24 休息 day 25 回溯第三天 文章目录 代码随想录--回溯部分一、力扣93--复原IP地址二、力扣78--子集三、力扣90--子集Ⅱ 一、力扣93–复原IP地址 代码随想录题目链接&#xff1a;代码随想录 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0…...

openharmony上传图片,并获取返回路径

适用条件&#xff1a; openharmony开发 4.0 release版本&#xff0c;对应能力API10 一直不断尝试&#xff0c;一会用官方提供的上传文件&#xff0c;一会用第三方库的axios都不行&#xff0c; 一会报错‘没权限&#xff0c;一会报错’路径错误&#xff0c;还有报错‘401参数错…...

git常用命令及git分支

git常用命令及git分支 git常用命令设置用户签名初始化本地库查看本地库状态将文件添加到暂存区提交到本地库查看历史记录版本穿梭 git分支什么是分支分支的好处分支的操作查看分支创建分支切换分支删除分支合并分支合并冲突 git常用命令 设置用户签名 //设置用户签名 git con…...

c# 依赖注入-服务的生命周期

在 C# 中&#xff0c;依赖注入服务的生命周期指的是在应用程序中管理和控制依赖项注入服务对象的生命周期的方式。常见的生命周期包括瞬态&#xff08;transient&#xff09;、作用域&#xff08;scoped&#xff09;和单例&#xff08;singleton&#xff09;三种。 瞬态&#…...

一站式短视频矩阵开发,高效托管!

短视频矩阵系统源码SaaS解决方案提供全面的开发服务&#xff0c;包括可视化视频编辑、矩阵式内容分发托管以及集成的多功能开发支持。 短视频矩阵&#xff1a;引爆您的数字营销革命 短视频矩阵系统是一套多功能集成解决方案&#xff0c;专为提升在短视频平台上的内容创作、管理…...

实践致知第16享:设置Word中某一页横着的效果及操作

一、背景需求 小姑电话说&#xff1a;现在有个word文档,里面有个表格太长&#xff08;如下图所示&#xff09;&#xff0c;希望这一个设置成横的&#xff0c;其余页还是保持竖的&#xff01; 二、解决方案 1、将鼠标放置在该页的最前面闪烁&#xff0c;然后选择“页面”》“↘…...

Leetcode—3011. 判断一个数组是否可以变为有序【中等】(__builtin_popcount()、ranges::is_sorted())

2024每日刷题&#xff08;144&#xff09; Leetcode—3011. 判断一个数组是否可以变为有序 O(n)复杂度实现代码 class Solution { public:bool canSortArray(vector<int>& nums) {// 二进制数位下1数目相同的元素就不进行组内排序// 只进行分组// 当前组的值若小于…...

盲盒一番赏小程序:开启惊喜之旅,探索无限创意!

在这个充满无限想象与惊喜的时代&#xff0c;盲盒已成为连接心灵与梦想的奇妙桥梁。为了将这份独特的乐趣与探索精神传递给每一位热爱生活、追求新鲜的你&#xff0c;我们自豪地推出了“盲盒一番赏”小程序——一个集创意、趣味、互动与社交于一体的盲盒新纪元&#xff0c;邀您…...

Linux基础知识之Linux文件系统权限

概述 文件权限控制对文件的访问可以针对文件所属用户、所属组和其他用户可以设置不同的权限权限具有优先级。user 权限覆盖 group 权限&#xff0c;后者覆盖 other 权限 权限&#xff1a;读取、写入和执行 权限 对文件的影响 对目录的影响 r (读取) 可以读取文件的内容 …...

Qt qml详细介绍

一.基本类型 QML的基本类型包括了很多不同的类型&#xff0c;这些类型可以用于定义用户界面元素、属性和信号。以下是一些常用的QML基本类型及其详细介绍&#xff1a; 数值类型&#xff1a;包括整数类型&#xff08;int、uint、short、ushort等&#xff09;和浮点数类型&#…...

深度解析:如何优雅地删除GitHub仓库中的特定commit历史

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

JS之短路操作符

短路操作符&#xff08;Short-circuit Operator&#xff09;是 JavaScript 中的一个概念&#xff0c;这些操作符同样适用于 TypeScript&#xff0c;因为 TypeScript 是 JavaScript 的类型超集。短路操作符主要包括逻辑“与”&#xff08;&&&#xff09;和逻辑“或”&am…...

【Linux】安装PHP扩展-redis

说明 本文档是在centos7.6的环境下&#xff0c;安装PHP7.4之后&#xff0c;安装对应的PHP扩展包redis。 一、下载redis扩展 pecl官方地址:PECL :: The PHP Extension Community Library 下载的版本是&#xff1a;redis-5.3.7.tgz 二、安装redis扩展 1.上传 redis 压缩包到…...

内衣洗衣机怎么选?分享五款人气巅峰机型,选对不选贵

随着科技的不断发展&#xff0c;内衣裤洗衣机成为了家庭必备的家电之一。选择一个好的品牌对于日后的使用体验至关重要。市场上内衣洗衣机型号繁多&#xff0c;究竟哪个牌子好用呢&#xff1f;下面给大家分享五款无论是口碑还是价格&#xff0c;都称得上是公认好用又实惠的内衣…...

OpenMesh入门,安装,运行示例Hello World

安装 环境 win10&#xff0c;qt5 源码下载编译 进入OpenMesh官网OpenMesh官网 https://www.graphics.rwth-aachen.de/software/openmesh/download/ 使用cmake gui 注意&#xff1a;先安装qt5 使用 CMake-Gui 构建 vs 2019 项目 注意 where is the source code 是<project…...

std::env是什么库?|Python一对一教学答疑

你好&#xff0c;我是悦创。 std::env 是 Rust 标准库中的一个模块&#xff0c;提供了访问操作系统环境的功能&#xff0c;比如处理环境变量、程序参数等。这个模块包含了一系列的函数和类型&#xff0c;用于管理与程序执行环境相关的信息。以下是 std::env 模块提供的一些主要…...

AlwaysOnTop终极指南:如何让Windows窗口永远置顶的完整教程

AlwaysOnTop终极指南&#xff1a;如何让Windows窗口永远置顶的完整教程 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 你是否曾经在同时处理多个任务时&#xff0c;因为重要窗口…...

2026实测:租用RTX 4090 CUDA适配与PyTorch精准安装教程

RTX 4090搭载Ada Lovelace架构、4nm制程工艺&#xff0c;配备16384个CUDA核心、24GB GDDR6X显存、1TB/s显存带宽&#xff0c;FP32算力82.6 TFLOPS&#xff0c;是7B-13B大模型训练、图像识别、深度学习推理的核心主流算力。个人开发者、中小团队自建RTX 4090硬件&#xff0c;存在…...

Triton+KServe构建高稳定性AI模型服务架构

1. 项目概述&#xff1a;当模型走出Jupyter&#xff0c;真正开始呼吸真实世界空气“From Notebook to Production: Running ML in the Real World (Part 4)”——这个标题本身就像一句暗号&#xff0c;专为那些在Jupyter里调通了模型、画出了漂亮ROC曲线、却在把模型推上服务器…...

KMS_VL_ALL_AIO:告别激活烦恼的完整解决方案指南

KMS_VL_ALL_AIO&#xff1a;告别激活烦恼的完整解决方案指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经为了激活Windows系统而花费数小时研究复杂的命令行&#xff1f;或者面对O…...

如何在10分钟内搭建个人游戏串流服务器:Sunshine跨平台游戏流媒体完全指南

如何在10分钟内搭建个人游戏串流服务器&#xff1a;Sunshine跨平台游戏流媒体完全指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否梦想过在任何设备上畅玩PC游戏&#x…...

如何在Windows上实现高效屏幕标注:gInk免费工具完全指南

如何在Windows上实现高效屏幕标注&#xff1a;gInk免费工具完全指南 【免费下载链接】gInk An easy to use on-screen annotation software inspired by Epic Pen. 项目地址: https://gitcode.com/gh_mirrors/gi/gInk 你是否需要在演示时快速圈出重点&#xff0c;或在线…...

龙芯LoongArch开发板实战:从2K0500到3A5000的嵌入式开发指南

1. 项目概述&#xff1a;当国产龙芯遇上嵌入式开发板最近几年&#xff0c;国产芯片的讨论热度一直很高&#xff0c;但很多开发者朋友可能和我当初一样&#xff0c;感觉它们离实际的嵌入式项目开发还有点距离。要么是资料难找&#xff0c;要么是生态工具链不成熟&#xff0c;上手…...

EasyReport核心架构解析:揭秘报表引擎、查询器与数据执行器的设计原理

EasyReport核心架构解析&#xff1a;揭秘报表引擎、查询器与数据执行器的设计原理 【免费下载链接】EasyReport A simple and easy to use Web Report System for java.EasyReport是一个简单易用的Web报表工具(支持Hadoop,HBase及各种关系型数据库),它的主要功能是把SQL语句查询…...

【AI】多阶段执行:分阶段完成大型任务

多阶段执行&#xff1a;分阶段完成大型任务&#x1f4dd; 本章学习目标&#xff1a;本章介绍流程编排&#xff0c;让AI Agent执行更加规范可控。通过本章学习&#xff0c;你将全面掌握"多阶段执行&#xff1a;分阶段完成大型任务"这一核心主题。一、引言&#xff1a;…...

2026年PMP项目管理培训报考机构深度横评:北上广深考生通关率与投入产出比全解析

一、前言 项目管理认证在职场中的含金量持续攀升&#xff0c;PMP证书已从传统工程领域扩展至产品、研发、运营、咨询等多个岗位&#xff0c;成为简历筛选中的显著加分项。与此同时&#xff0c;国内PMP培训市场呈现高度分散态势&#xff0c;线上线下机构数量庞大&#xff0c;教学…...