Springboot整合Mail进行邮箱验证码注册

目录

  • 一、导入依赖
  • 二、application.yml配置
  • 三、EmailService代码解读
  • 四、VerificationCodeUtils随机验证码代码解读
  • 五、controller层代码解读
  • 六、整体代码

一、导入依赖

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

二、application.yml配置

spring:mail:host: smtp.qq.comport: 465username: 你的qq邮箱password: 你的qq邮箱授权码protocol: smtpsdefault-encoding: UTF-8 #默认编码格式properties:mail:debug: true #启动debug调试smtp:socketFactory:class: javax.net.ssl.SSLSocketFactory #SSL连接配置

Spring Mail的配置信息,用于设置邮件发送相关参数。

  • host: SMTP服务器的地址,这里使用QQ邮箱的SMTP服务器地址。
  • port: SMTP服务器监听的端口,默认为25,但QQ邮箱SMTP服务器采用SSL加密传输需要使用465端口。
  • username: 发送邮件的邮箱账号,这里填写QQ邮箱的账号。
  • password: 发送邮件的邮箱账号的授权码,用于验证邮箱身份,这里也填写QQ邮箱的账号的授权码。
  • protocol: 使用协议类型,这里选择smtps,即SMTP-over-SSL。
  • default-encoding: 默认编码格式,这里设置为UTF-8。
  • debug: 是否启动调试模式,当设置为true时会打印出更多调试信息。
  • properties: 设定额外的属性,这里设置了mailsmtp两个属性,socketFactory则对应SSL连接所需的类。

三、EmailService代码解读

@Service
public class EmailService {

创建一个名为EmailService的服务类。

@Autowired
private JavaMailSender mailSender;

使用Spring的自动装配(Autowired)特性注入一个JavaMailSender实例作为依赖项。JavaMailSender是用于发送邮件的Spring框架中的接口。

@Value("${spring.mail.username}")
private String from;

使用注释值(Value)来从配置文件中读取属性值,这里指的是spring.mail.username的值并将其变量化成from

public void sendMail(String to, String subject, String content) throws MessagingException {

在服务类中定义名为sendMail的方法,该方法接收三个参数(tosubjectcontent)并且可以抛出MessagingException异常。

MimeMessage message = mailSender.createMimeMessage();

创建邮件消息对象message,使用注入的mailSender的实例方法createMimeMessage()来创建相应的MIME消息。

MimeMessageHelper helper = new MimeMessageHelper(message, true);

创建一个帮助程序对象helper并将上述邮件消息message与之关联。true表示需要支持附件,否则设为false。

helper.setFrom(from);

设置发件人信息,在此处由变量from表示。

helper.setTo(to);

设置收件人信息,该信息由传入的参数to表示。

helper.setSubject(subject);

设置邮件主题,该主题由传入的参数subject表示。

helper.setText(content, true);

设置邮件正文,并指示内容是否为HTML格式。内容是由传入的参数 content表示的。

mailSender.send(message);

发送邮件,使用注入的mailSender实例的方法send()来将构造好的message对象发送。

四、VerificationCodeUtils随机验证码代码解读

public class VerificationCodeUtils {

这一行声明一个公共类(public class)VerificationCodeUtils。

    public static String generateCode(int length) {

这一行是声明一个公共的静态方法(public static method),名称为generateCode,返回类型为字符串(String),其中有一个参数,名称为length,表示生成的验证码的长度。

        StringBuilder s = new StringBuilder();

这一行是声明一个空白的字符串构建器(StringBuilder),用于存储生成的验证码。

        Random random = new Random();

这一行是声明一个随机数生成器(Random),用来产生随机数字。

        for (int i = 0; i < length; i++) {int n = random.nextInt(10);s.append(n);}

这一段是循环生成随机数字,并将其添加到指定长度的字符串构建器中。

        return s.toString();}
}

五、controller层代码解读

@Autowired
private EmailService emailService;

这行代码使用Spring的依赖注入自动将EmailService类的实例注入到emailService变量中。

private final Map<String, String> emailCodeMap = new ConcurrentHashMap<>(16);

这行代码声明一个并发哈希映射对象,用于存储邮箱验证码的键值对信息。

@PostMapping("/register")
public ApiResponse<String> register(@RequestBody Mail mail) throws MessagingException {

这行代码通过PostMapping注解配置了一个基于HTTP POST方法的请求处理,当收到路径为“/register”的请求时,它会将请求体反序列化成Mail类型的mail参数。ApiResponse是响应结果的数据类型,其中ResponseCode.SUCCESS表示成功状态码,"验证码已发送"是结果消息的内容。

String code = VerificationCodeUtils.generateCode(6);

这行代码调用VerificationCodeUtils工具类的generateCode方法生成一个6位数字的随机验证码,并将其保存在code变量中。

String subject = "注册验证码";
String content = "尊敬的用户,您的验证码为:" + code;
emailService.sendMail(mail.email, subject, content);

这三行代码设置邮件主题和内容,然后使用调用EmailService的sendMail方法将邮件发送给指定的邮箱(mail.email),以及验证码的message。

emailCodeMap.put(mail.email, code);

这行代码将(邮箱,验证码)键值对信息放入emailCodeMap哈希映射中。

return new ApiResponse<>(ResponseCode.SUCCESS,"验证码已发送");

最后,这行代码返回ApiResponse对象,该对象包含了响应结果的状态码和消息内容。

六、整体代码

  @Autowiredprivate EmailService emailService;// 存储已发送的验证码private final Map<String, String> emailCodeMap = new ConcurrentHashMap<>(16);@PostMapping("/register")public ApiResponse<String> register(@RequestBody Mail mail)  throws MessagingException {// 检查邮箱是否已被注册// ...// 生成验证码String code = VerificationCodeUtils.generateCode(6);// 发送邮件String subject = "注册验证码";String content = "尊敬的用户,您的验证码为:" + code;emailService.sendMail(mail.email, subject, content);// 保存验证码emailCodeMap.put(mail.email, code);return new ApiResponse<>(ResponseCode.SUCCESS,"验证码已发送");}
@Data
public class Mail {public String email;public String username;public String password;
}

@Service
public class EmailService {@Autowiredprivate JavaMailSender mailSender;@Value("${spring.mail.username}")private String from;/*** 发送邮件** @param to      收件人邮箱* @param subject 邮件主题* @param content 邮件内容*/public void sendMail(String to, String subject, String content) throws MessagingException {// 创建邮件消息MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);// 发送邮件mailSender.send(message);}
}
public class VerificationCodeUtils {/*** 生成随机验证码** @param length 验证码长度* @return 验证码*/public static String generateCode(int length) {StringBuilder s = new StringBuilder();Random random = new Random();for (int i = 0; i < length; i++) {int n = random.nextInt(10);s.append(n);}return s.toString();}
}

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

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

相关文章

C高级day4循环语句

1&#xff0c;思维导图 运行结果为&#xff1a; 运行结果为&#xff1a;

CSS读书笔记

——————————————精华部分—————————————— 1、选择器 &#xff08;1&#xff09;基本选择器&#xff1a; 标签选择器 body{} 类选择器 class .class名称{} ID选择器 id #id名称{} 优先级&#xff1a;ID选择器 > 类选择器 > 标签选择器 &am…

cf 交互题

今天cf遇到了交互题&#xff0c;这个交互题的算法很很很简单&#xff0c;但是在交互上卡了&#xff0c;导致交上的代码都不算罚时。&#xff08;更伤心了。 所以&#xff0c;现在写一下交互题的做法&#xff0c;印象深刻嘛。 交互题&#xff0c;就是跟机器进行交互。你代码运…

大数据数据压缩和企业优化

MR数据压缩 MR支持的压缩编码 压缩格式是否可切片特点DEFLATE否Gzip否比较好用&#xff0c;存储方面比较优秀Bzip2是压缩的最小&#xff0c;速度最慢LZO是需要安装和建立索引Snappy否最好用&#xff0c;速度最快 数据压缩的位置 输入端采用压缩&#xff1a; 数据量小于块大小…

道路积水监测-路面积水监测系统

随着城市化的不断发展&#xff0c;城市面临着越来越多的交通挑战&#xff0c;其中之一就是道路积水问题。道路积水不仅影响了交通安全&#xff0c;还会引发交通堵塞、交通事故和城市洪涝等问题。因此&#xff0c;开展道路积水监测是十分必要的。 城市排水、供水、燃气、供热、桥…

基于大规模MIMO通信系统的半盲信道估计算法matlab性能仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 %EM算法收敛所需的迭代 nIter 1; Yp Y(:,1:L_polit,:); %与导频序列相对应的部分 q…

建议收藏!TCP协议面试灵魂12 问

先亮出这篇文章的思维导图: TCP 作为传输层的协议&#xff0c;是一个IT工程师素养的体现&#xff0c;也是面试中经常被问到的知识点。在此&#xff0c;我将 TCP 核心的一些问题梳理了一下&#xff0c;希望能帮到各位。 001. 能不能说一说 TCP 和 UDP 的区别&#xff1f; 首先…

继续 Linux 中的命令并举例

continue是一个命令,用于跳过 for、while 和 Until 循环中的当前迭代。它用在脚本语言和 shell 脚本中来控制执行流程。它还需要一个参数[N],如果提到 N 则从第 n 个封闭循环继续。 Linux 中“继续”命令的语法 继续 还是 继续[N]continue or continue [N] `Continue` 命令…

如何查询成绩或工资

为什么每次查询成绩或者工资的时候都觉得麻烦又耗时呢&#xff1f;在过去&#xff0c;我们可能需要去学校或公司的相关部门&#xff0c;填写繁琐的表格&#xff0c;然后等待工作人员进行查询和处理。这不仅浪费了我们宝贵的时间&#xff0c;还可能出现查询结果不准确或者遗漏的…

芯科蓝牙BG27开发笔记4-SSV5 IDE的使用

1. 如何转移工作区的项目文件到新的文件夹&#xff0c;并且可以继续使用ssv5编辑、编译&#xff1f; 从默认的工作区将目标工程整体拷贝出来 目标文件夹&#xff1a; 进入ssv5点击导入工程&#xff0c;并选择目标文件夹 继续下一步&#xff0c;修改项目文件夹所在位置为其源码…

tcp与udp

tcp 服务端回复完SYNACK之后&#xff0c;就建立连接 1.为什么是三次&#xff0c;而不是两次&#xff1f;服务端回复完SYNACK之后&#xff0c;就建立连接 这是为了防止因为已失效的请求报文&#xff0c;突然又传到服务器引起错误 意思就是&#xff1a;假设采用两次握手建立连…

ardupilot开发 --- MAVSDK 篇

概述 MAVSDK是各种编程语言的库集合&#xff0c;用于与MAVLink系统&#xff08;如无人机、相机或地面系统&#xff09;接口。这些库提供了一个简单的API&#xff0c;用于管理一个或多个车辆&#xff0c;提供对车辆信息和遥测的程序访问&#xff0c;以及对任务、移动和其他操作…

聚观早报|华为Mate 60 Pro支持面容支付;特斯拉重回底特律车展

【聚观365】9月8日消息 华为Mate 60 Pro已支持面容支付 特斯拉将重回底特律车展 iPhone在美国有1.67亿用户 韩国半导体8月份出口85.6亿美元 比亚迪元PLUS冠军版将于9月15日上市 华为Mate 60 Pro已支持面容支付 毫无预热的华为Mate 60 Pro突然在华为商城首批开售&#xf…

kafka增加磁盘或者分区,topic重分区

场景&#xff1a;kafka配置文件log.dirs增加了几个目录&#xff0c;但是新目录没有分区数据写入&#xff0c;所以打算进行重分区一下。 1.生成迁移计划 进入kafka/bin目录 新建 topic-reassign.json,把要重分区的topic按下面格式写。 { "topics": [{ …

css中只使用vue的变量

参考&#xff1a;https://blog.csdn.net/FellAsleep/article/details/130617163 1、必须作用在用一个div上 2、变量必须有双横杠“–” <spanclass"bb" :style"spanStyle">11</span>data() {return {spanStyle: {"--color": #bfa /…

云原生Kubernetes:Kubeadm部署K8S单Master架构

目录 一、理论 1.kubeadm 2.Kubeadm部署K8S单Master架构 3.环境部署 4.所有节点安装docker 5.所有节点安装kubeadm&#xff0c;kubelet和kubectl 6.部署K8S集群 7.安装dashboard 8.安装Harbor私有仓库 9.内核参数优化方案 二、实验 1.Kubeadm部署K8S单Master架构 …

三维模型3DTile格式轻量化压缩处理效率提高的技术方浅析

三维模型3DTile格式轻量化压缩处理效率提高的技术方浅析 随着三维模型在各个领域的广泛应用&#xff0c;对于其格式的轻量化压缩处理和效率提高的需求也越发迫切。本文将介绍一些技术方法&#xff0c;帮助实现三维模型3DTile格式的轻量化压缩处理并提高处理效率。 首先&#x…

Python + Jmeter 实现自动化性能压测

Step01: Python脚本开发 文件路径&#xff1a;D://wl//testproject//Fone-grpc//project1//test_client.py Python 脚本作用&#xff1a; 1.通过 grpc 调用底层 c 的接口&#xff0c;做数据库的数据插入与查询操作&#xff0c;然后将返回的结果进行拼接与输出。 2.代码里面…

Java调用ChatGPT的API接口实现对话与图片生成

文章目录 步骤1&#xff1a;配置代理步骤2&#xff1a;添加依赖步骤3&#xff1a;编写Constants类步骤4&#xff1a;实现问答交互步骤5&#xff1a;实现图片生成 步骤1&#xff1a;配置代理 有些魔法是需要做配置的。否则无法正确实现代码测试。这里以我使用的工具为例说明。 …

华为OD七日集训第4期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、7日集训第4期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、数据结构第2天、滑动窗口第3天、贪心算法第4天、二分查找第5天、分治递归第6天、深度优先搜索dfs算法第7天、宽度优选算法&#xff0c;回溯法 六…