当前位置: 首页 > news >正文

在 Spring Boot 中发送邮件简单实现

Spring Boot 对于发送邮件这种常用功能也提供了开箱即用的 Starter:spring-boot-starter-mail。
通过这个 starter,只需要简单的几行配置就可以在 Spring Boot 中实现邮件发送,可用于发送验证码、账户激活等等业务场景。

本文将通过实际的案例带你了解如何在 Spring Boot 中使用 QQ 邮箱发送邮件。

关于 Spring 对邮件支持的更多细节,你可以参阅 springdoc.cn。

创建 Spring Boot 应用
在 pom.xml 中添加 spring-boot-starter-mail 依赖:

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

属性配置
在 application.yaml 中配置属性。

spring:mail:# 指定邮件服务器地址host: smtp.qq.com# 登录账户username: 747692844@qq.com# 登录密码password: "<你的密码/授权码>"# 端口port: 465# 默认编码default-encoding: UTF-8# 使用的协议protocol: smtps# 其他的属性properties:"mail.smtp.connectiontimeout": 5000"mail.smtp.timeout": 3000"mail.smtp.writetimeout": 5000"mail.smtp.auth": true"mail.smtp.starttls.enable": true"mail.smtp.starttls.required": true

需要在 QQ 邮箱设置中开启 「SMTP」 服务,并且记得把配置文件中的 spring.mail.password 替换为你的 「授权码」。注意,不是 QQ 密码,关于 QQ 邮箱如何生成授权码你可以参阅:
https://service.mail.qq.com/detail/0/75

对于 spring mail 更多的可用配置可以参阅 springdoc.cn。

发送邮件
配置正确后,就可以在任意 Bean 中注入 JavaMailSender Bean,用于发送邮件。

发送一封简单的邮件:

@Autowired
JavaMailSender javaMailSender;@Test
public void test() throws Exception {// 创建一个邮件消息MimeMessage message = javaMailSender.createMimeMessage();// 创建 MimeMessageHelperMimeMessageHelper helper = new MimeMessageHelper(message, false);// 发件人邮箱和名称helper.setFrom("747692844@qq.com", "springdoc");// 收件人邮箱helper.setTo("admin@springboot.io");// 邮件标题helper.setSubject("Hello");// 邮件正文,第二个参数表示是否是HTML正文helper.setText("Hello <strong> World</strong>!", true);// 发送javaMailSender.send(message);
}

首先,通过 javaMailSender 的 createMimeMessage 创建一个 MimeMessage 对象,表示邮件。

接着创建 MimeMessageHelper 对象,第二个 boolean 参数表示,是否是一个 Multipart 邮件(带有附件)。

然后,通过 helper 对象,设置邮件的发件人邮箱和名称、收件人、主题、内容等信息。注意,setText 方法第二个参数表示内容是否是 html 正文。本例中,正文使用了一个 strong HTML 标签。

执行测试,发送邮件。然后进入收件箱查看:
在这里插入图片描述
成功收件,注意 World 文本是加粗的,因为发送的是 HTML 邮件,并且使用了 strong 标签。

可以使用 freemarker 等模板模板引擎来定义 HTML 邮件模板。

发送带有附件的邮件
有时,我们需要通过邮箱发送一些附件文件。

如下:

@Autowired
JavaMailSender javaMailSender;@Test
public void test() throws Exception {// 创建一个邮件消息MimeMessage message = javaMailSender.createMimeMessage();// 创建 MimeMessageHelper,指定 boolean multipart 参数为 trueMimeMessageHelper helper = new MimeMessageHelper(message, true);// 发件人邮箱和名称helper.setFrom("747692844@qq.com", "springdoc");// 收件人邮箱helper.setTo("admin@springboot.io");// 邮件标题helper.setSubject("Spring 中文文档");// 邮件正文,第二个参数表示是否是HTML正文helper.setText("你好,这是 Spirng 的中文文档!<br/> 请尽快下载!", true);// 添加一个附件,指定附件名称、文件的 Inputstream 流 以及 Content-Typehelper.addAttachment("spring-framework 中文文档.pdf", () -> Files.newInputStream(Paths.get("C:\\Users\\KevinBlandy\\Desktop\\spring-framework 中文文档.pdf")), "application/octet-stream");// 发送javaMailSender.send(message);
}

如上,和发送普通邮件没太大区别。

  1. 创建 MimeMessageHelper 时,第二个参数要设置为 true。
  2. 调用 helper 的 addAttachment() 方法来添加附件,可以多次调用表示添加多个。
    addAttachment() 方法的第一个参数就是会在收件箱显示的附件名称,第二个参数是一个 InputStreamSource 函数接口,需要返回一个 InputStream,也就是附件文件的二进制流。最后一个参数用于表示文件的媒体类型,也就是 Content Type,如果你不知道具体的类型,可以无脑设置为 application/octet-stream。

同样,这封邮件也是 HTML 邮件,在正文中使用了
标签。

执行测试,发送邮件,并且查看收到的邮件:在这里插入图片描述
如上,成功收到了带附件的邮件。
自定义 JavaMailSender 实现
上面的例子中,我们把邮箱的信息定义在了配置文件中。这可能有一些不够灵活,你也可以把邮箱信息存储在数据库或者其他地方,随时可以通过管理后台进行维护、修改,而不需要重启应用。

我们可以直接实例化 JavaMailSender 的默认实现 JavaMailSenderImpl,在运行时设置邮箱服务器、用户名密码等等。

@Test
public void test() throws Exception {// 直接创建 JavaMailSenderImpl 实现类JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();javaMailSender.setDefaultEncoding("utf-8");javaMailSender.setHost("smtp.qq.com");              // 设置邮箱服务器javaMailSender.setPort(465);                        // 设置端口javaMailSender.setUsername("747692844@qq.com");    // 设置用户名javaMailSender.setPassword("<你的密码/授权码>");      // 设置密码(记得替换为你实际的密码、授权码)javaMailSender.setProtocol("smtps");                // 设置协议Properties properties = new Properties();           // 配置项properties.put("mail.smtp.connectiontimeout", 5000);properties.put("mail.smtp.timeout", 3000);properties.put("mail.smtp.writetimeout", "5000");properties.put("mail.smtp.auth", true);properties.put("mail.smtp.starttls.enable", true);properties.put("mail.smtp.starttls.required", true);javaMailSender.setJavaMailProperties(properties); // 设置配置项// 创建一个邮件消息MimeMessage message = javaMailSender.createMimeMessage();// 创建 MimeMessageHelperMimeMessageHelper helper = new MimeMessageHelper(message, false);// 发件人邮箱和名称helper.setFrom("747692844@qq.com", "springdoc");// 收件人邮箱helper.setTo("admin@springboot.io");// 邮件标题helper.setSubject("Hello");// 邮件正文,第二个参数表示是否是HTML正文helper.setText("Hello <strong> World</strong>!", true);// 发送javaMailSender.send(message);
}

如上,每次发送邮件都先从数据库中检索邮箱服务器的配置,然后构建 JavaMailSenderImpl 实例执行邮件发送。

当需要修改邮箱的时候,只需要在管理后台进行修改即可,不用改动任何配置、代码。

相关文章:

在 Spring Boot 中发送邮件简单实现

Spring Boot 对于发送邮件这种常用功能也提供了开箱即用的 Starter&#xff1a;spring-boot-starter-mail。 通过这个 starter&#xff0c;只需要简单的几行配置就可以在 Spring Boot 中实现邮件发送&#xff0c;可用于发送验证码、账户激活等等业务场景。 本文将通过实际的案…...

深入理解网络 I/O:单 Selector 多线程|单线程模型

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…...

Kafka Avro序列化之三:使用Schema Register实现

为什么需要Schema Register 注册表 无论是使用传统的Avro API自定义序列化类和反序列化类 还是 使用Twitter的Bijection类库实现Avro的序列化与反序列化,这两种方法都有一个缺点:在每条Kafka记录里都嵌入了schema,这会让记录的大小成倍地增加。但是不管怎样,在读取记录时…...

EasyExcel

概述 GitHub - alibaba/easyexcel: 快速、简洁、解决大文件内存溢出的java处理Excel工具 EasyExcel官方文档 - 基于Java的Excel处理工具 | Easy Excel EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性能、内存的等因素的…...

java 探针两种模式实战

分为两种 程序运行前的agent&#xff1a;premain 程序运行中的agent&#xff1a;agentmain 在程序运行前的agent javaagent是java命令的一个参数&#xff0c;所以需要通过-javaagent 来指定一个jar包&#xff08;就是我们要做的代理包&#xff09;能够实现在主程序运行前来执行…...

uniGUI之MASK遮罩

在页面进行后台数据库操作的时候&#xff0c;不想 用户再进行 页面上的 其他操作&#xff0c;这时候就要 将页面 遮罩。例如UniDBGrid有LoadMask属性。 1]使用ScreenMask函数 2]JS调用 3]一个控件控制遮罩另一个控件(如Button遮罩UniDBGrid) //很简单&#xff0c;本例子就是告…...

DevOps云原生创建devops流水线(微服务项目上传git,打包镜像,部署k8s)

开发和运维人员的解决方案 一、中间件的部署&#xff08;Sentinel/MongoDB/MySQL&#xff09; 二、创建DevOps工程 邀请成员 三、创建流水线 四、编辑流水线 ①、拉取代码&#xff08;若失败&#xff0c;则将制定容器改为maven&#xff09; 若失败&#xff0c;则将命令改…...

【vim 学习系列文章 13.1 -- 自动命令autocmd 根据文件类型设置vim参数】

文章目录 autocmd 根据文件类型配置vim参数vim 文本类型 autocmd 根据文件类型配置vim参数 在 Vim 中&#xff0c;你可以使用 autocmd &#xff08;自动命令&#xff09;来根据文件类型自动执行特定的函数。首先&#xff0c;你需要定义这些函数&#xff0c;然后使用 autocmd 与…...

算法基础概念之数据结构

邻接表 每个点作为头节点接一条链表 链表中元素均为该头节点指向的点 优先队列 参数: ①储存元素类型 ②底层使用的存储结构(一般为vector) ③比较方式(默认小于)...

解决ES伪慢查询

一、问题现象 服务现象 服务接口的TP99性能降低 ES现象 YGC&#xff1a;耗时极其不正常, 峰值200次&#xff0c;耗时7sFULL GC&#xff1a;不正常,次数为1但是频繁&#xff0c;STW 5s慢查询&#xff1a;存在慢查询5 二 解决过程 1、去除干扰因素 从现象上看应用是由于某种…...

关于Ubuntu22.04恢复误删文件的记录

挂载在Ubuntu22.04下的固态盘有文件被误删了&#xff0c;该固态盘是ntfs格式的。 在网上找了很多教程&#xff0c;最后决定用TestDisk工具进行恢复。 现记录如下&#xff1a; Ubuntu安装testdisk sudo apt-get install testdisk运行testdisk sudo testdisk得到 我选择的是…...

Docker笔记:Docker Swarm, Consul, Gateway, Microservices 集群部署

关于 Consul 服务 Consul是Go语言写的开源的服务发现软件Consul具有服务发现、健康检查、 服务治理、微服务熔断处理等功能 Consul 部署方式1: 直接在linux 上面部署 consul 集群 1 &#xff09;下载 在各个服务器上 下载 consul 后解压并将其目录配置到环境变量中&#xff…...

浅析AI视频分析与视频管理系统EasyCVR平台及场景应用

人工智能的战略重要性导致对视频智能分析的需求不断增加。鉴于人工智能视觉技术的巨大潜力&#xff0c;人们的注意力正在从传统的视频监控转移到计算机视觉的监控过程自动化。 1、什么是视频分析&#xff1f; 视频分析或视频识别技术&#xff0c;是指从视频片段中提取有用信息…...

跨站点分布式多活存储建设方案概述

1-伴随着私有云、海量非结构数据的爆炸性增长&#xff0c;软件定义存储已经成为用户构建“敏捷IT” 架构的数据基石&#xff0c;同时越来越多的关键业务接入“敏捷IT” 架构。在分布式软件定义存储的产品架构下&#xff0c;怎样既保证对爆炸数据量的平稳承接&#xff0c;又能对…...

Github 2023-12-16开源项目日报Top10

根据Github Trendings的统计&#xff0c;今日(2023-12-16统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目2非开发语言项目2TypeScript项目1Jupyter Notebook项目1Go项目1PHP项目1JavaScript项目1C#项目1 精…...

c++ 中多线程的相关概念与多线程类的使用

1、多线程相关概念 1.1 并发、并行、串行 并发&#xff08;Concurrent&#xff09;&#xff1a;并发是指两个或多个事件在同一时间间隔内运行。在操作系统中&#xff0c;是指一个时间段中有几个程序都处于已启动运行到运行完毕之间&#xff0c;且这几个程序都是在同一个处理机…...

深入理解 hash 和 history:网页导航的基础(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…...

腾讯文档助力CRM集成:无代码连接电商与广告

腾讯文档API的简介与优势 腾讯文档API是一个强大的工具&#xff0c;它允许企业通过简单的无代码开发来实现与电商平台和客服系统的智能连接。这种连接不仅提高了工作效率&#xff0c;还优化了数据管理。使用腾讯文档智能表&#xff0c;商家可以享受多样的列类型、多维视图展示…...

学习使用echarts漏斗图的参数配置和应用场景

学习使用echarts漏斗图的参数配置和应用场景 前言什么是漏斗图漏斗图的特点及应用场景漏斗图的特点漏斗图常见的的应用场景&#xff1a; echarts中漏斗的常用属性echart漏斗代码美化漏斗图样式1、设置标题字体大小2、设置标签样式3、设置漏斗图为渐变颜色4、设置高亮效果5、设置…...

npm ,yarn 更换使用国内镜像源,阿里源,清华大学源

在平时开发当中&#xff0c;我们经常会使用 Npm&#xff0c;yarn 来构建 web 项目。但是npm默认的源的服务器是在国外的&#xff0c;如果没有梯子的话。会感觉特别特别慢&#xff0c;所以&#xff0c;使用国内的源是非常有必要的。 在这里插入图片描述 Nnpm&#xff0c; yarn …...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...