Java集成【邮箱验证找回密码】功能

news2025/4/25 18:26:31

目录

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 {
    @Bean
    public 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"); // 必须使用TLS

        return mailSender;
    }
}

5.编写controller业务代码

        由于发送邮件内容不多,所以我们就将所有代码都写到一个controller层即可,就不再创建service层了。

@RestController//表明这是一个controller层,并且自动将对象转为JSON格式返回
@RequestMapping("/api/email")//该controller的访问路径
public class SendEmailController {
    @Autowired
    private JavaMailSender javaMailSender;
    @Autowired
    private 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分钟,以便后续验证该用户在前端输入的验证码是否正确。TODO
            return 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集成【邮箱验证找回密码】功能的详细过程。

喜欢本篇文章的话,可以留个免费的关注呦~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS 5.0应用开发——MVVM模式的应用

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

程序员鱼皮最新项目-----AI超级智能体教程(一)

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

【AI模型学习】双流网络——更强大的网络设计

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

HarmonyOS:一多能力介绍:一次开发,多端部署

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

“在中国,为中国” 英飞凌汽车业务正式发布中国本土化战略

3月28日&#xff0c;以“夯实电动化&#xff0c;推进智能化&#xff0c;实现高质量发展”为主题的2025中国电动汽车百人会论坛在北京举办。众多中外机构与行业上下游嘉宾就全球及中国汽车电动化的发展现状、面临的挑战与机遇&#xff0c;以及在技术创新、市场布局、供应链协同等…

Java技术体系的主要产品线详解

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

‌机器学习快速入门--0算力起步实践篇

在学习人工智能的过程中&#xff0c;显卡是必不可少的工具&#xff0c;但它的成本较高且更新换代速度很快。那么&#xff0c;没有GPU的情况下如何学习人工智能呢&#xff1f;以下是针对普通电脑与有算力环境分离的学习规划方案&#xff0c;尤其适合前期无GPU/云计算资源的学习者…

源码篇 剖析 Vue2 双向绑定原理

前置操作 源码代码仓地址&#xff1a;https://github.com/vuejs/vue/tree/main 1.查看源码当前版本 当前版本为 v2.7.16 2.Clone 代码 在【Code】位置点击&#xff0c;复制 URL 用于 Clone 代码 3.执行 npm install 4.执行 npm run dev 前言 在 Vue 中最经典的问题就是双…

单例模式与消费者生产者模型,以及线程池的基本认识与模拟实现

前言 今天我们就来讲讲什么是单例模式与线程池的相关知识&#xff0c;这两个内容也是我们多线程中比较重要的内容。其次单例模式也是我们常见设计模式。 单例模式 那么什么是单例模式呢&#xff1f;上面说到的设计模式又是什么&#xff1f; 其实单例模式就是设计模式的一种。…

STM32配置系统时钟

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

React 与 Vue:两大前端框架的深度对比

在前端开发领域&#xff0c;React 和 Vue 无疑是当下最受欢迎的两大框架。它们各自拥有独特的优势和特点&#xff0c;吸引了大量开发者。无论是初学者还是经验丰富的工程师&#xff0c;选择 React 还是 Vue 都是一个常见的问题。本文将从多个角度对 React 和 Vue 进行对比&…

Java24新增特性

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

Sentinel源码—6.熔断降级和数据统计的实现一

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

Volcano 实战快速入门 (一)

一、技术背景 随着大型语言模型&#xff08;LLM&#xff09;的蓬勃发展&#xff0c;其在 Kubernetes (K8s) 环境下的训练和推理对资源调度与管理提出了前所未有的挑战。这些挑战主要源于 LLM 对计算资源&#xff08;尤其是 GPU&#xff09;的巨大需求、分布式任务固有的复杂依…

用交换机连接两台电脑,电脑A读取/写电脑B的数据

1、第一步&#xff0c;打开控制面板中的网络和共享中心&#xff0c;如下图配置&#xff0c;电脑A和电脑B均要配置&#xff1b; 注意&#xff1a;要保证电脑A和电脑B在同一子网掩码下&#xff0c;不同的IP地址&#xff1b; 2、在电脑上同时按‘CommandR’&#xff0c;在弹出的输…

问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)

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

WLAN共享给以太网后以太网IP为169.254.xx.xx以及uboot无法使用nfs下载命令的的解决方案

WLAN共享网络给以太网&#xff0c;实际上是把以太网口当作一个路由器&#xff0c;这个路由器的IP是由WLAN给他分配的&#xff0c;169.254.xx.xx是windows设定的ip&#xff0c;当网络接口无法从上一级网络接口获得ip时&#xff0c;该网络接口的ip被设置为169.254 &#xff0c;所…

ROS 快速入门教程03

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

在 macOS 上合并 IntelliJ IDEA 的项目窗口

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

基于多用户商城系统的行业资源整合模式与商业价值探究

随着电子商务的蓬勃发展&#xff0c;传统的单一商家电商模式逐渐显现出一定的局限性。为了解决商家成本过高、市场竞争激烈等问题&#xff0c;多用户商城系统应运而生&#xff0c;成为一种新型的电商平台模式。通过整合行业资源&#xff0c;这种模式不仅极大地提升了平台和商家…