发送邮箱验证码【spring boot】

⭐前言⭐

※※※大家好!我是同学〖森〗,一名计算机爱好者,今天让我们进入学习模式。若有错误,请多多指教。更多有趣的代码请移步Gitee
👍 点赞 ⭐ 收藏 📝留言 都是我创作的最大的动力!

1. 思维导图

发送邮箱验证码的思维导图

2. 获取邮箱授权码

2.1 1. 开启POP3/SMTP服务

  • 登录QQ邮箱 --> 设置 --> 账户

在这里插入图片描述

  • 向下滑动滚动条,找到账户页面下方的 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务一栏,点击管理服务
    在这里插入图片描述
  • 第一次会让你绑定手机后再进行操作 按要求进行操作就好;
  • 进入安全模式,点击生成授权码;

在这里插入图片描述

  • 短信验证
    在这里插入图片描述
  • 验证成功会生成授权码
    在这里插入图片描述

一定要复制授权码,并保存到一个地方;别问我怎么知道的;

3. 创建 Spring Boot 项目

3.1 引入依赖

<!--   发送邮件     -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>

添加依赖后一定要重新 ReLoad 一下;

在这里插入图片描述

3.2 配置application.yml文件

Spring:# 邮箱基本配置mail:# 配置 smtp 服务主机地址# qq 邮箱     smtp.qq.com    端口号 465 或 587# sina       smtp.sina.com# aliyun     smtp.aliyun.com# 163        smtp.163.com   端口号 465 或 994host: smtp.qq.com# 发送者邮箱username: xxxxxxxx@qq.com# 在邮箱内申请的授权码password: xttfwlhoyguxbacg# 端口号port: 587# 默认的邮件编码为UTF-8default-encoding: UTF-8# 其他参数properties:mail:# 配置SSL 加密工厂smtp:ssl:# 本地测试, 先放开sslenable: falserequired: false#开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查错误debug: true
  • 这里注意一下port 465有时会报错,换一个就好;
  • 把username 改成自己的QQ邮箱号,把password 换成刚刚我们申请的授权码(不是QQ密码哟)

3.3 实体类ToEmail

package com.example.sendemail.entity;import lombok.AllArgsConstructor;
import lombok.Data;import java.io.Serializable;/*** @version IntelliJ IDEA || java version 11.* @Author: Oliver* @Description: 邮箱验证码实体类* @Date: 2023-07-02* @Time: 14:21*/
@Data
@AllArgsConstructor //生成一个包含所有类字段的构造函数
public class ToEmail implements Serializable {/***  邮件接受方*/private String tos;/***      邮件主题*/private String subject;/*** 邮件内容*/private String content;
}

3.4 生成6位验证码

package com.example.sendemail.utils;import java.security.SecureRandom;
import java.util.Random;/*** @version IntelliJ IDEA || java version 11.* @Author: Oliver* @Description: 生成验证码工具类* @Date: 2023-07-02* @Time: 14:35*/
public class VerCodeGenerateUtil {/*** 验证码包含的字段*/private static final String SYMBOLS = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ";private static final Random RAND = new SecureRandom();/*** 生成 6 位数的随机数字* @return {@link String 验证码}*/public static String generateVerCode(){char[] code = new char[6];for(int i = 0; i < code.length; i++) {code[i] = SYMBOLS.charAt(RAND.nextInt(SYMBOLS.length()));//  RAND.nextInt(SYMBOLS.length()) 生成一个随机的索引值;//  RAND.nextInt(n) 生成一个0到n-1之间的随机整数;}return new String(code);}
}

SecureRandom() 和 Random()

  • java.util.Random是一个伪随机数生成器,它使用线性同余算法生成随机数。
    • 这种算法虽然能够快速生成随机数,但是它的随机性并不够强,因此不适用于安全相关的场景。在Java中,使用java.util.Random生成的随机数只能用于一些非安全性的场景,例如模拟数据或游戏等。
  • java.security.SecureRandom是一个强随机数生成器,它使用安全的随机数生成算法生成随机数。
    • 这种算法的随机性更加强大和安全,可以用于安全相关的场景,例如密码学或安全通信等。在Java中,使用java.security.SecureRandom生成的随机数可以用于安全性要求更高的场景。

3.5 邮件服务器类MailService

package com.example.sendemail.service;import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.apache.commons.lang3.StringUtils;import javax.annotation.Resource;
import javax.mail.MessagingException;
import java.io.File;
import java.util.Date;@Service
public class MailService {/*** 注入邮件工具类*/@Resourceprivate JavaMailSenderImpl javaMailSender;@Value("${spring.mail.username}")private String sendMailer;/*** 检测邮件信息类* @param receiveEmail 接收者* @param subject  主题* @param emailMsg 内容*/private void checkMail(String receiveEmail, String subject, String emailMsg){//  StringUtils 需要引入  commons-lang3 依赖//  可以用 receiveEmail == null || receiveEmail.isEmpty() 来代替if(StringUtils.isEmpty(receiveEmail)) {throw new RuntimeException("邮件收件人不能为空");}if(StringUtils.isEmpty(subject)) {throw new RuntimeException("邮件主题不能为空");}if(StringUtils.isEmpty(emailMsg)) {throw new RuntimeException("邮件内容不能为空");}}/*** 发送纯文本邮件* @param receiveEmail 接收者* @param subject  主题* @param emailMsg 内容*/public Boolean sendTextMail(String receiveEmail, String subject, String emailMsg) {// 参数检查checkMail(receiveEmail, subject, emailMsg);try {// true 代表支持复杂的类型MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(), true);// 邮件发件人mimeMessageHelper.setFrom(sendMailer);// 邮件收件人mimeMessageHelper.setTo(receiveEmail.split(","));// 邮件主题mimeMessageHelper.setSubject(subject);// 邮件内容mimeMessageHelper.setText(emailMsg);// 邮件发送时间mimeMessageHelper.setSentDate(new Date());// 发送邮件javaMailSender.send(mimeMessageHelper.getMimeMessage());System.out.println("发送邮件成功: " + sendMailer + "-->" + receiveEmail);return true;} catch (MessagingException e) {e.printStackTrace();System.out.println("发送邮件失败: " + e.getMessage());return false;}}
}

3.6 EmailController

package com.example.sendemail.controller;import com.example.sendemail.common.AjaxResult;
import com.example.sendemail.entity.ToEmail;
import com.example.sendemail.service.MailService;
import com.example.sendemail.utils.VerCodeGenerateUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;/*** @version IntelliJ IDEA || java version 11.* @Author: Oliver* @Description: 邮箱验证码* @Date: 2023-07-02* @Time: 15:06*/
@RestController
@RequestMapping("/email")
public class EmailController {@Resourceprivate MailService mailService;@RequestMapping("/sendEmail")public AjaxResult sendEmail(ToEmail toEmail, HttpServletRequest request) {if(toEmail == null || toEmail.getTos() == null ) {return AjaxResult.fail(-1, "参数错误!");}toEmail.setSubject("你本次的验证码是");// 获取验证码String verCode = VerCodeGenerateUtil.generateVerCode();String content = "尊敬的xxx,您好:\n"+ "\n本次请求的邮件验证码为:" + verCode + ",本验证码 5 分钟内效,请及时输入。(请勿泄露此验证码)\n"+ "\n如非本人操作,请忽略该邮件。\n(这是一封通过自动发送的邮件,请不要直接回复)";toEmail.setContent(content);Boolean check = mailService.sendTextMail(toEmail.getTos(), toEmail.getSubject(), toEmail.getContent());if(check) {return AjaxResult.success(200, "发送成功");} else {return AjaxResult.fail(-2, "发送失败");}}
}
  • AjaxResult 统一格式返回类,包含 状态码 code , 状态码描述信息 msg, 返回的数据 data;

4 功能测试

使用 PostMan测试

在这里插入图片描述

其中 tos 的 val 值是要收件人的邮箱;

在这里插入图片描述

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

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

相关文章

Maven manual

Download maven Download 设置 system env… E:\apache-maven-3.9.3\bin查看版本信息 mvn -v Apache Maven 3.9.3 (21122926829f1ead511c958d89bd2f672198ae9f) Maven home: E:\apache-maven-3.9.3与Eclipse integrate Referrence&#xff0c;通常Eclipse原本就已经集成&am…

Docker Desktop 安装使用教程

一、前言 作为开发人员&#xff0c;在日常开发中&#xff0c;我们需要在本地去启动一些服务&#xff0c;如&#xff1a;redis、MySQL等&#xff0c;就需要去下载这些在本地去启动&#xff0c;操作较为繁琐。此时&#xff0c;我们可以使用Docker Desktop&#xff0c;来搭建我们需…

78、基于STM32单片机步进电机速度调速控制系统设计(程序+原理图+PCB源文件+参考论文+开题报告+流程图+元器件清单等)

摘 要 伴随着时代的快速发展&#xff0c;单片机的应用也越来越广泛&#xff0c;促进了微电子和计算机的快速发展。我们日常生活中步进电机扮演着很重要的角色在我们身边随处可以见。因为步进电机本身的结构组成相对于比较简单、价格也比较便宜廉价。比如压榨机&#xff0c;打印…

vue3使用高德地图实现点击获取经纬度以及搜索功能

话不多说直接上干活 在此之前你需要有高德地图的 key&#xff0c;这个自己去申请即可 1&#xff0c;首先需要在终端安装 npm i amap/amap-jsapi-loader --save 2&#xff0c;准备一个容器 <template><div id"container"></div> </templat…

亚马逊云科技如何通过四大自研芯片助力企业创新,摆脱基础架构束缚

2023年6月27-28日&#xff0c;2023亚马逊云科技中国峰会在上海顺利举行。在此次峰会上我们可以清晰地看到为什么亚马逊云科技可以做到领先地位&#xff0c;为什么亚马逊云科技可以一直保持进步。这都与亚马逊云科技“基于客户需求&#xff0c;快速进行产品更新与技术迭代”的Da…

【前端|CSS系列第3篇】CSS盒模型、浮动及定位

在前端开发中&#xff0c;CSS是一项重要的技术&#xff0c;用于控制网页的样式和布局。在本系列的第三篇文章中&#xff0c;我们将学习CSS的盒模型、浮动以及定位&#xff0c;这些概念和技术在页面布局中起着至关重要的作用。通过本文的学习&#xff0c;希望能够帮助大家更好地…

ModaHub魔搭社区:为什么选择Zilliz Cloud?

目录 Zilliz Cloud是什么&#xff1f; 为什么选择Zilliz Cloud&#xff1f; 基于Milvus构建&#xff0c;针对性能进行优化 弹性和可扩展 按需付费 多云支持&#xff08;AWS、GCP&#xff09; 云原生的可靠性 企业安全和治理 Zilliz Cloud基于Milvus的云原生服务 Zilliz…

LangChain:LLM应用程序开发(中)——文档问答、评估、Agents(代理)

文章目录 四、文档问答4.1 快速入门4.2 逐步实现4.3 其它方法 五、评估5.1 创建QA app5.2 生成测试数据点5.2.1 Hard-coded examples5.2.2 LLM-Generated examples 5.3 link chain debug手动评估5.4 LLM assisted evaluation5.5 LangChain Evaluation platform 六、Agents&…

0基础学习VR全景平台篇 第53篇:专业版功能-离线导出!

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;专业版功能-离线导出&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 离线导出&#xff0c;指的是将VR漫游作品通过下载的方式&#xff0c;保存到本…

Matlab中统计矩阵中元素个数的方法

1、 tabulate函数 a [1,2,1,3,1,4,1,5,2,3,1,4,2,5,4,2];tabulate(a)第一列代表了元素&#xff0c;第二类代表该元素出现的个数&#xff0c;第三列代表该元素的占比。 2、find函数和length函数 判断矩阵a中元素2出现的次数 a [1,2,1,3,1,4,1,5,2,3,1,4,2,5,4,2]; length(…

抖音旋转验证码分析

旋转验证码类型challenge_code为99996&#xff0c; 拿到的旋转验证码通常都是如下&#xff1a; 待旋转的图片&#xff1a; 旋转的背景图&#xff1a; 加密分析过程 可以参考&#xff1a;https://blog.csdn.net/weixin_38819889/article/details/129727564 旋转的难点在于如何…

Learning to cluster in order to transfer across domains and tasks (ICLR 2018)

Learning to cluster in order to transfer across domains and tasks (ICLR 2018) 摘要 这篇论文提出一个进行跨域/任务的迁移学除了习任务&#xff0c;并将其作为一个学习聚类的问题。除了特征&#xff0c;我们还可以迁移相似度信息&#xff0c;并且这是足以学习一个相似度…