Java集成【邮箱验证找回密码】功能
目录
1.添加依赖
2.选择一个自己的邮箱,作为发件人角色。
3.编写邮箱配置【配置发件人邮箱】
4.编写邮箱配置类
5.编写controller业务代码
6.演示效果
7.总结流程
8.注意
结语
一.发送邮箱验证码
1.添加依赖
<!--导入邮箱依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>3.1.5</version>
</dependency>
2.选择一个自己的邮箱,作为发件人角色。
说白了,用户找回密码时,需要发件人发送给用户邮箱一个验证码,那么这个发件人邮箱,需要我们自己选取。
此时我就选择用我自己的QQ邮箱,作为发件人。
下面就需要我们去QQ邮箱,开启POP3/SMTP服务,获取授权码。
3.编写邮箱配置【配置发件人邮箱】
我们在【2】中,选取了我们自己的QQ邮箱,充当发件人角色。
那么我们此时,就需要将该QQ邮箱的配置信息(包含账号、授权码等等),配置到Java的application.yml文件中。
配置好以后,Java就可以在需要时,自动使用我们的QQ邮箱,给忘记密码的用户的邮箱发送验证码了。
4.编写邮箱配置类
其实【3】就够用了,但是有时候只完成3的配置,仍然无法注入JavaMailSender的实例。
@Configuration
public class MailConfig {@Beanpublic JavaMailSender javaMailSender() {JavaMailSenderImpl mailSender = new JavaMailSenderImpl();// 设置QQ邮箱SMTP服务器mailSender.setHost("smtp.qq.com");mailSender.setPort(587); // QQ邮箱默认端口587(TLS)或465(SSL)// 设置邮箱账号和授权码(注意:password是授权码,不是QQ密码)mailSender.setUsername("发件邮箱账号");mailSender.setPassword("授权码");// 设置编码mailSender.setDefaultEncoding("UTF-8");// 设置SMTP协议属性Properties props = mailSender.getJavaMailProperties();props.put("mail.smtp.auth", "true"); // 启用认证props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密props.put("mail.smtp.starttls.required", "true"); // 必须使用TLSreturn mailSender;}
}
5.编写controller业务代码
由于发送邮件内容不多,所以我们就将所有代码都写到一个controller层即可,就不再创建service层了。
@RestController//表明这是一个controller层,并且自动将对象转为JSON格式返回
@RequestMapping("/api/email")//该controller的访问路径
public class SendEmailController {@Autowiredprivate JavaMailSender javaMailSender;@Autowiredprivate UserMapper userMapper;//发送邮件@PostMapping("/sendEmail")public Result sendEmail(@RequestBody EmailDto emailDto){//1.先查找数据库,是否存在该用户的账号,如果不存在,则返回错误信息“该账号不存在”User user = userMapper.queryUserByUsername(emailDto.getUsername());if(user == null){return new Result(404, "该账号不存在");}//2.如果该账号存在,则判断该邮箱是否绑定了该账号,如果没绑定,则返回错误信息“账号与邮箱未绑定”if(!user.getEmail().equals(emailDto.getEmail())){return new Result(404, "账号与邮箱未绑定");}//3.如果绑定了,则往该用户的邮箱中,发送一个验证码(多少位自己决定,一般是6位)//生成6位验证码Random random = new Random();int code = random.nextInt(900000) + 100000;//范围:100000-999999(6位随机数的范围)。SimpleMailMessage message = new SimpleMailMessage();message.setFrom("发件人邮箱");//设置发件人邮箱message.setTo(emailDto.getEmail());//设置收件人邮箱message.setSubject("东软HIS系统验证码");//邮件标题message.setText("邮箱验证码为:" + code + ",请勿发送给他人");//邮件内容try {javaMailSender.send(message);//4.将该验证码存入redis,有效时间设置为2分钟,以便后续验证该用户在前端输入的验证码是否正确。TODOreturn new Result(200, "发送成功");}catch (Exception e){throw new RuntimeException("发送邮箱验证码失败,请稍后再试");}}}
6.演示效果
情况1:账号不存在
情况2:账号与邮箱未绑定
情况3:账号与邮箱绑定。
可见此时我们的QQ小号的邮箱2037730735@qq.com也确实收到了这个邮箱验证码。
7.总结流程
①找一个自己的邮箱(QQ、163、outlook等都可以),作为发件人,并将该邮箱的信息配置到java后端
②收件人的邮箱,是从前端传递过来的(即:谁忘记了密码,谁就输入他自己的邮箱,作为验证码的收件人)。
③验证码发送成功后,应当存入redis,并设置有效时间(如:2分钟),以便用户在前端输入验证码后,验证正确性。
8.注意
上述发送邮箱验证码成功后,应当将验证码存入redis,我们此时还没写写部分内容,稍后会完善的。
我们上述例子中,发件人是我的QQ大号的邮箱(不方便透露,所以打码了), 收件人是我的QQ小号的邮箱2037730735@qq.com。
二.下载、启动、连接redis
1.下载redis
去redis官网:
官网:https://redis.io
中文网:https://www.redis.net.cn/
选择对应操作系统的安装包:
Redis的Windows版属于绿色软件(说白了就是一个压缩包),直接解压即可使用,解压后的目录结构如下:
2.设置redis密码
redis默认没有密码,肯定是不安全的,因此要在配置文件中,设置一个密码:
3.启动redis
第一步:解压Windows操作系统对应的Redis压缩包,到D:\develop_tools目录下
第二步:启动Redis服务
4.Redis图形化界面工具的下载和使用
我们使用RESP这款redis图形化界面工具:
使用图形化界面工具RESP,连接redis:
连接成功后的界面如下:
三.在Java中,操作redis
1.介绍Spring Data Redis
要想通过Java操作Redis,需要借助“Redis的Java客户端” —— Spring Data Redis
Spring Data Redis是Spring的一部分,对Redis底层开发包进行了高度封装。在Spring项目中,可以使用Spring Data Redis来简化操作。
注意:Redis的Java客户端有很多,我们只是选择了其中的一种,也就是Spring Data Redis。
2.Spring Data Redis的操作步骤
①导入Spring Data Redis的maven坐标
<!--导入spring data redis的依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>3.2.7</version>
</dependency>
②配置Redis数据源
此处我的Redis密码是root,这个密码是后来自己设置的,我在前面文章里讲到过这一操作。
注意:Redis数据库有16个库,分别是DB0 ~ DB15,我们上面指定使用DB0这个库。
如果在yml配置文件中不指定使用哪一个库,则默认使用DB0这个库。
③在需要时,直接注入StringRedisTemplate实例即可。
3.效果展示
使用ApiFox发送请求:
响应信息:
可见此时,确实给用户casually的邮箱2037730735@qq.com发送了6位验证码567801。同时也确实将该验证码存入了redis中, 且过期时间为90秒。
后续就可以根据redis中存入的验证码,来判断用户前端输入的邮箱验证码是否正确。如果用户输入的验证码和redis中的一致,则说明是本人,就给他修改密码的权限;如果用户输入的验证码和redis中的不一致,则说明不是本人,直接提示错误信息即可。
结语
以上就是Java集成【邮箱验证找回密码】功能的详细过程。
喜欢本篇文章的话,可以留个免费的关注呦~~
相关文章:

Java集成【邮箱验证找回密码】功能
目录 1.添加依赖 2.选择一个自己的邮箱,作为发件人角色。 3.编写邮箱配置【配置发件人邮箱】 4.编写邮箱配置类 5.编写controller业务代码 6.演示效果 7.总结流程 8.注意 结语 一.发送邮箱验证码 1.添加依赖 <!--导入邮箱依赖--> <dependency&g…...

HarmonyOS 5.0应用开发——MVVM模式的应用
【高心星出品】 文章目录 MVVM模式的应用ArkUI开发模式图架构设计原则案例运行效果项目结构功能特性开发环境model层viewmodel层view层 MVVM模式的应用 MVVM(Model-View-ViewModel)模式是一种广泛用于应用开发的架构模式,它有助于分离应用程…...

程序员鱼皮最新项目-----AI超级智能体教程(一)
文章目录 1.前言1.什么是AI大模型2.什么是多模态3.阿里云百炼平台介绍3.1文本调试展示3.2阿里云和dashscope的关系3.3平台智能体应用3.4工作流的创建3.5智能体编排应用 1.前言 最近鱼皮大佬出了一套关于这个AI 的教程,关注鱼皮大佬很久了,鱼皮大佬确实在…...

【AI模型学习】双流网络——更强大的网络设计
文章目录 一 背景1.1 背景1.2 研究目标 二 模型2.1 双流架构2.2 光流 三 实验四 思考4.1 多流架构4.2 fusion策略4.3 fusion的early与late 先简单聊了双流网络最初在视频中的起源,之后把重点放在 “多流结构"和"fusion” 上。 一 背景 1.1 背景 Two-Str…...

HarmonyOS:一多能力介绍:一次开发,多端部署
概述 如果一个应用需要在多个设备上提供同样的内容,则需要适配不同的屏幕尺寸和硬件,开发成本较高。HarmonyOS 系统面向多终端提供了“一次开发,多端部署”(后文中简称为“一多”)的能力,可以基于一种设计…...

“在中国,为中国” 英飞凌汽车业务正式发布中国本土化战略
3月28日,以“夯实电动化,推进智能化,实现高质量发展”为主题的2025中国电动汽车百人会论坛在北京举办。众多中外机构与行业上下游嘉宾就全球及中国汽车电动化的发展现状、面临的挑战与机遇,以及在技术创新、市场布局、供应链协同等…...
《Pinia 从入门到精通》Vue 3 官方状态管理 -- 基础入门篇
《Pinia 从入门到精通》Vue 3 官方状态管理 – 基础入门篇 《Pinia 从入门到精通》Vue 3 官方状态管理 – 进阶使用篇 《Pinia 从入门到精通》Vue 3 官方状态管理 – 插件扩展篇 📖 教程目录 为什么选择 Pinia?1.1 背景介绍1.2 Vuex 的痛点(对…...

Java技术体系的主要产品线详解
Java技术体系的主要产品线详解 Java Card:支持Java小程序(Applets)运行在小内存设备(如智能卡)上的平台。 Java ME(Micro Edition):支持Java程序运行在移动终端(手机、P…...

机器学习快速入门--0算力起步实践篇
在学习人工智能的过程中,显卡是必不可少的工具,但它的成本较高且更新换代速度很快。那么,没有GPU的情况下如何学习人工智能呢?以下是针对普通电脑与有算力环境分离的学习规划方案,尤其适合前期无GPU/云计算资源的学习者…...
MySQL 详解之索引:提升查询效率的秘密武器
在数据库的世界里,数据量通常是巨大的。想象一下,一个拥有数百万甚至数十亿条记录的表格,如果你需要从中查找符合特定条件的几条甚至一条记录,数据库是如何快速找到它们的呢?如果没有高效的机制,数据库不得不一条条地遍历整个表格,这无疑会非常缓慢和耗费资源。这时,索…...
中通 Redis 集群从 VM 迁移至 PVE:技术差异、PVE 优劣势及应用场景深度解析
在数字化转型浪潮下,企业对服务器资源的高效利用与成本控制愈发重视。近期,中通快递将服务器上的 Redis 集群服务从 VM(VMware 虚拟化技术)迁移至 PVE(Proxmox VE),这一技术举措引发了行业广泛关…...

源码篇 剖析 Vue2 双向绑定原理
前置操作 源码代码仓地址:https://github.com/vuejs/vue/tree/main 1.查看源码当前版本 当前版本为 v2.7.16 2.Clone 代码 在【Code】位置点击,复制 URL 用于 Clone 代码 3.执行 npm install 4.执行 npm run dev 前言 在 Vue 中最经典的问题就是双…...
Restful接口学习
一、为什么RESTful接口是数据开发的核心枢纽? 在数据驱动的时代,RESTful接口如同数据高速公路上的收费站,承担着数据交换的核心职责。数据工程师每天需要面对: 异构系统间的数据交互(Hadoop集群 ↔ 业务系统…...
C++ round 函数笔记 (适用于算法竞赛)
在算法竞赛中,处理浮点数并将其转换为整数是常见的需求,round 函数是标准库提供的用于执行“四舍五入”到最近整数的工具。理解其工作方式和潜在问题对于避免错误至关重要。 1. 基本用法 头文件 要使用 round 函数,需要包含 <cmath>…...
1.5软考系统架构设计师:架构师的角色与能力要求 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析
超简记忆要点 角色职责 需求规划→架构设计→质量保障 能力要求 技术(架构模式/性能优化) 业务(模型抽象→技术方案) 管理(团队协作/风险控制) 知识体系 基础:CAP/设计模式/网络协议案例&am…...

单例模式与消费者生产者模型,以及线程池的基本认识与模拟实现
前言 今天我们就来讲讲什么是单例模式与线程池的相关知识,这两个内容也是我们多线程中比较重要的内容。其次单例模式也是我们常见设计模式。 单例模式 那么什么是单例模式呢?上面说到的设计模式又是什么? 其实单例模式就是设计模式的一种。…...
JAVA程序获取SVN提交记录
1.获取文件提交记录 private String userName "userName "; //svn账号 private String password "password "; //svn密码 private String urlString "urlString "; //svnurl 换成自己对应的svn信息 package com.tengzhi.common.dao;import…...

STM32配置系统时钟
1、STM32配置系统时钟的步骤 1、系统时钟配置步骤 先配置系统时钟,后面的总线才能使用时钟频率 2、外设时钟使能和失能 STM32为了低功耗,一开始是关闭了所有的外设的时钟,所以外设想要工作,首先就要打开时钟,所以后面…...

React 与 Vue:两大前端框架的深度对比
在前端开发领域,React 和 Vue 无疑是当下最受欢迎的两大框架。它们各自拥有独特的优势和特点,吸引了大量开发者。无论是初学者还是经验丰富的工程师,选择 React 还是 Vue 都是一个常见的问题。本文将从多个角度对 React 和 Vue 进行对比&…...
Node.js 学习入门指南
Node.js 学习入门指南 Node.js 是一种流行的开源、跨平台的 JavaScript 运行时环境,它使开发者能够在服务器端运行JavaScript代码。本篇文章旨在帮助初学者快速入门并掌握Node.js的基础知识和常用技巧。 一、什么是Node.js? 定义 Node.js 是一个基于…...

Java24新增特性
Java 24(Oracle JDK 24)作为Java生态的重要更新,聚焦AI开发支持、后量子安全、性能优化及开发者效率提升,带来20余项新特性和数千项改进。以下是核心特性的分类解析: 一、语言特性增强:简化代码与模式匹配 …...

Sentinel源码—6.熔断降级和数据统计的实现一
大纲 1.DegradeSlot实现熔断降级的原理与源码 2.Sentinel数据指标统计的滑动窗口算法 1.DegradeSlot实现熔断降级的原理与源码 (1)熔断降级规则DegradeRule的配置Demo (2)注册熔断降级监听器和加载熔断降级规则 (3)DegradeSlot根据熔断降级规则对请求进行验证 (1)熔断降级…...

Volcano 实战快速入门 (一)
一、技术背景 随着大型语言模型(LLM)的蓬勃发展,其在 Kubernetes (K8s) 环境下的训练和推理对资源调度与管理提出了前所未有的挑战。这些挑战主要源于 LLM 对计算资源(尤其是 GPU)的巨大需求、分布式任务固有的复杂依…...
快速体验tftp文件传输(嵌入式设备)
一、参考资料 Linux tftp 命令 | 菜鸟教程 Ubuntu最新版本(Ubuntu22.04LTS)安装Tftp服务及其使用教程-CSDN博客 Windows下的Tftpd32(Tftpd64)软件下载和使用教程-集成了Tftp服务器、客户端-CSDN博客 tftpd32 tftpd64文件传输安装和使用教程【图文并茂】-CSDN博客 二、快速…...

用交换机连接两台电脑,电脑A读取/写电脑B的数据
1、第一步,打开控制面板中的网络和共享中心,如下图配置,电脑A和电脑B均要配置; 注意:要保证电脑A和电脑B在同一子网掩码下,不同的IP地址; 2、在电脑上同时按‘CommandR’,在弹出的输…...

问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)
本文将对"问道数码兽"这一经典卡通风格回合制手游的服务端部署与客户端调整流程进行详细拆解,适用于具备基础 Windows 运维和手游源码调试经验的开发者参考使用。教程以实战为导向,基于原始说明内容重构优化,具备较高的内容查重避重…...

WLAN共享给以太网后以太网IP为169.254.xx.xx以及uboot无法使用nfs下载命令的的解决方案
WLAN共享网络给以太网,实际上是把以太网口当作一个路由器,这个路由器的IP是由WLAN给他分配的,169.254.xx.xx是windows设定的ip,当网络接口无法从上一级网络接口获得ip时,该网络接口的ip被设置为169.254 ,所…...
Gazebo 仿真环境系列教程(一):环境安装与基础使用
文章目录 一、版本说明与技术背景1.1 Gazebo 版本分支1.2 版本选择建议 二、系统环境准备2.1 硬件要求2.2 软件依赖 三、Gazebo Garden 安装流程3.1 添加官方软件源3.2 执行安装命令3.3 环境验证 四、Gazebo Classic 安装方法4.1 添加软件仓库4.2 安装核心组件4.3 验证安装 五、…...

ROS 快速入门教程03
8.编写Subscriber订阅者节点 8.1 创建订阅者节点 cd catkin_ws/src/ catkin_create_pkg atr_pkg rospy roscpp std_msgs ros::Subscriber sub nh.subscribe(话题名, 缓存队列长度, 回调函数) 回调函数通常在你创建订阅者时定义。一个订阅者会监听一个话题,并在有…...

在 macOS 上合并 IntelliJ IDEA 的项目窗口
在使用 IntelliJ IDEA 开发时,可能会打开多个项目窗口,这可能会导致界面变得混乱。为了提高工作效率,可以通过合并项目窗口来简化界面。本文将介绍如何在 macOS 上合并 IntelliJ IDEA 的项目窗口。 操作步骤 打开 IntelliJ IDEA: 启动你的 I…...