邮箱验证码功能开发
该文章用于记录怎么进行邮箱验证码开发。
总所周知,我们在某些网站进行注册的适合总是会遇到什么填写邮箱,邮箱接收验证码,验证通过后才可以继续注册,那么这个功能是怎么实现的呢?
一,准备工作
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("验证码错误");}}
验证码功能大概就是这样了。
相关文章:
邮箱验证码功能开发
该文章用于记录怎么进行邮箱验证码开发。 总所周知,我们在某些网站进行注册的适合总是会遇到什么填写邮箱,邮箱接收验证码,验证通过后才可以继续注册,那么这个功能是怎么实现的呢? 一,准备工作 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 依据方法,在 Inspec…...
根据脚手架archetype快速构建spring boot/cloud项目
1、找到archetype,并从私仓下载添加archetype到本地 点击IDEA的file,选择new project 选择maven项目,勾选create from archetype 填写archetype信息,(repository填写私仓地址) 2、选择自定义的脚手架arche…...
安灯系统在电力设备制造业中的应用效果
安灯系统作为面向制造业生产现场的专门应用软硬件系统,在电力设备制造企业中发挥着重要的作用。作为精益制造执行的核心工具,安灯系统为企业提供了快速联络生产、物料、维修、主管等部门的功能,以实时掌控和管理生产线状况,实现生…...
代码随想录打卡第二十五天
代码随想录–回溯部分 day 24 休息 day 25 回溯第三天 文章目录 代码随想录--回溯部分一、力扣93--复原IP地址二、力扣78--子集三、力扣90--子集Ⅱ 一、力扣93–复原IP地址 代码随想录题目链接:代码随想录 有效 IP 地址 正好由四个整数(每个整数位于 0…...
openharmony上传图片,并获取返回路径
适用条件: openharmony开发 4.0 release版本,对应能力API10 一直不断尝试,一会用官方提供的上传文件,一会用第三方库的axios都不行, 一会报错‘没权限,一会报错’路径错误,还有报错‘401参数错…...
git常用命令及git分支
git常用命令及git分支 git常用命令设置用户签名初始化本地库查看本地库状态将文件添加到暂存区提交到本地库查看历史记录版本穿梭 git分支什么是分支分支的好处分支的操作查看分支创建分支切换分支删除分支合并分支合并冲突 git常用命令 设置用户签名 //设置用户签名 git con…...
c# 依赖注入-服务的生命周期
在 C# 中,依赖注入服务的生命周期指的是在应用程序中管理和控制依赖项注入服务对象的生命周期的方式。常见的生命周期包括瞬态(transient)、作用域(scoped)和单例(singleton)三种。 瞬态&#…...
一站式短视频矩阵开发,高效托管!
短视频矩阵系统源码SaaS解决方案提供全面的开发服务,包括可视化视频编辑、矩阵式内容分发托管以及集成的多功能开发支持。 短视频矩阵:引爆您的数字营销革命 短视频矩阵系统是一套多功能集成解决方案,专为提升在短视频平台上的内容创作、管理…...
实践致知第16享:设置Word中某一页横着的效果及操作
一、背景需求 小姑电话说:现在有个word文档,里面有个表格太长(如下图所示),希望这一个设置成横的,其余页还是保持竖的! 二、解决方案 1、将鼠标放置在该页的最前面闪烁,然后选择“页面”》“↘…...
Leetcode—3011. 判断一个数组是否可以变为有序【中等】(__builtin_popcount()、ranges::is_sorted())
2024每日刷题(144) Leetcode—3011. 判断一个数组是否可以变为有序 O(n)复杂度实现代码 class Solution { public:bool canSortArray(vector<int>& nums) {// 二进制数位下1数目相同的元素就不进行组内排序// 只进行分组// 当前组的值若小于…...
盲盒一番赏小程序:开启惊喜之旅,探索无限创意!
在这个充满无限想象与惊喜的时代,盲盒已成为连接心灵与梦想的奇妙桥梁。为了将这份独特的乐趣与探索精神传递给每一位热爱生活、追求新鲜的你,我们自豪地推出了“盲盒一番赏”小程序——一个集创意、趣味、互动与社交于一体的盲盒新纪元,邀您…...
Linux基础知识之Linux文件系统权限
概述 文件权限控制对文件的访问可以针对文件所属用户、所属组和其他用户可以设置不同的权限权限具有优先级。user 权限覆盖 group 权限,后者覆盖 other 权限 权限:读取、写入和执行 权限 对文件的影响 对目录的影响 r (读取) 可以读取文件的内容 …...
Qt qml详细介绍
一.基本类型 QML的基本类型包括了很多不同的类型,这些类型可以用于定义用户界面元素、属性和信号。以下是一些常用的QML基本类型及其详细介绍: 数值类型:包括整数类型(int、uint、short、ushort等)和浮点数类型&#…...
深度解析:如何优雅地删除GitHub仓库中的特定commit历史
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
JS之短路操作符
短路操作符(Short-circuit Operator)是 JavaScript 中的一个概念,这些操作符同样适用于 TypeScript,因为 TypeScript 是 JavaScript 的类型超集。短路操作符主要包括逻辑“与”(&&)和逻辑“或”&am…...
【Linux】安装PHP扩展-redis
说明 本文档是在centos7.6的环境下,安装PHP7.4之后,安装对应的PHP扩展包redis。 一、下载redis扩展 pecl官方地址:PECL :: The PHP Extension Community Library 下载的版本是:redis-5.3.7.tgz 二、安装redis扩展 1.上传 redis 压缩包到…...
内衣洗衣机怎么选?分享五款人气巅峰机型,选对不选贵
随着科技的不断发展,内衣裤洗衣机成为了家庭必备的家电之一。选择一个好的品牌对于日后的使用体验至关重要。市场上内衣洗衣机型号繁多,究竟哪个牌子好用呢?下面给大家分享五款无论是口碑还是价格,都称得上是公认好用又实惠的内衣…...
OpenMesh入门,安装,运行示例Hello World
安装 环境 win10,qt5 源码下载编译 进入OpenMesh官网OpenMesh官网 https://www.graphics.rwth-aachen.de/software/openmesh/download/ 使用cmake gui 注意:先安装qt5 使用 CMake-Gui 构建 vs 2019 项目 注意 where is the source code 是<project…...
std::env是什么库?|Python一对一教学答疑
你好,我是悦创。 std::env 是 Rust 标准库中的一个模块,提供了访问操作系统环境的功能,比如处理环境变量、程序参数等。这个模块包含了一系列的函数和类型,用于管理与程序执行环境相关的信息。以下是 std::env 模块提供的一些主要…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...
生产管理系统开发:专业软件开发公司的实践与思考
生产管理系统开发的关键点 在当前制造业智能化升级的转型背景下,生产管理系统开发正逐步成为企业优化生产流程的重要技术手段。不同行业、不同规模的企业在推进生产管理数字化转型过程中,面临的挑战存在显著差异。本文结合具体实践案例,分析…...
