在Spring Boot中使用JavaMailSender发送邮件
用了这么久的Spring Boot,我们对Spring Boot的了解应该也逐步进入正轨了,这篇文章讲的案例也在我们的实际开发中算是比较实用的了,毕竟我们完成注册功能和对用户群发消息,都可以采用到邮箱发送功能,往下看,我们来看看什么是JavaMailSender。
什么是JavaMailSender
JavaMailSender是Spring Framework中的一个接口,用于发送电子邮件。它是Spring对JavaMail API的封装,提供了更简单和更方便的方式来发送邮件。
JavaMailSender接口定义了一组发送邮件的方法,包括发送简单文本邮件、发送带附件的邮件、发送HTML格式的邮件等。它隐藏了底层JavaMail API的复杂性,使得在Spring应用中发送邮件变得更加容易。
在Spring Boot中,你可以通过依赖注入JavaMailSender来使用它。通过配置邮件服务器的相关信息,你可以使用JavaMailSender发送邮件。
JavaMailSender接口的常用实现类是JavaMailSenderImpl,它是基于JavaMail API实现的。除了JavaMailSenderImpl,Spring还提供了其他的实现类,例如MockMailSender用于测试目的。
使用JavaMailSender,你可以方便地发送邮件,设置收件人、发件人、主题、正文等信息,并可以附加文件、设置抄送、密送等功能。
JavaMailSender是Spring Framework中用于发送邮件的接口,它简化了邮件发送的过程,提供了更高级的抽象和便利性。
来看一个案例:
引入依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-velocity</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
如其他自动化配置一样,我们在引入相关依赖后就需要在application.properties文件中进行配置:
spring.mail.host=your-smtp-host
spring.mail.port=your-smtp-port
spring.mail.username=your-username
spring.mail.password=your-password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
请将your-smtp-host、your-smtp-port、your-username和your-password替换为你的实际信息。
然后,在你的代码中,注入JavaMailSender并使用它来发送邮件。以下是一个简单的示例:
例如我们采用qq邮箱:
spring.mail.host=smtp.qq.com
spring.mail.username=用户名
spring.mail.password=密码
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
这里的密码指你获取的邮箱的授权码



在这里获取你的相关信息,
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

template.vm
<html>
<body><h3>你好, ${username}, 这是一封模版引擎封装的邮箱信!</h3>
</body>
</html>
之后咱们创建一个测试类进行:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public class ApplicationTests {@Autowiredprivate JavaMailSender mailSender;@Autowiredprivate VelocityEngine velocityEngine;//简单的邮件发送@Testpublic void sendSimpleMail() throws Exception {SimpleMailMessage message = new SimpleMailMessage();message.setFrom("28****70@qq.com");message.setTo("28****70@qq.com");message.setSubject("主题:简单邮件");message.setText("简单的邮件内容");mailSender.send(message);}//携带附件的邮件@Testpublic void sendAttachmentsMail() throws Exception {MimeMessage mimeMessage = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);helper.setFrom("28****70@qq.com");helper.setTo("28****70@qq.com");helper.setSubject("主题:有附件");helper.setText("内容:有附件的邮件");FileSystemResource file = new FileSystemResource(new File("weixin.jpg"));helper.addAttachment("miaow-1.jpg", file);helper.addAttachment("miaow-2.jpg", file);helper.addAttachment("miaow-2.jpg", file);mailSender.send(mimeMessage);}//发送嵌入静态资源@Testpublic void sendInlineMail() throws Exception {MimeMessage mimeMessage = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);helper.setFrom("28****70@qq.com");helper.setTo("28****70@qq.com");helper.setSubject("主题:嵌入静态资源");helper.setText("<html><body><img src=\"cid:weixin\" ></body></html>", true);FileSystemResource file = new FileSystemResource(new File("weixin.jpg"));helper.addInline("weixin", file);mailSender.send(mimeMessage);}//发送模版附件@Testpublic void sendTemplateMail() throws Exception {MimeMessage mimeMessage = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);helper.setFrom("28****70@qq.com");helper.setTo("28****70@qq.com");helper.setSubject("主题:模板邮件");Map<String, Object> model = new HashedMap();model.put("username", "miaow");String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "template.vm", "UTF-8", model);helper.setText(text, true);mailSender.send(mimeMessage);}
}
在项目下放置:weixin.jpg图片,图片随便你怎么玩

这样,你就可以在Spring Boot中使用JavaMailSender发送邮件了。记得替换示例代码中的实际信息,以便与你的邮件服务器配置相匹配。
在使用JavaMailSender发送邮件时,有一些注意事项需要注意:
邮件服务器的配置
在使用JavaMailSender发送邮件之前,你需要配置邮件服务器的相关信息,包括SMTP服务器地址、端口号、用户名、密码等。这些信息可以通过在配置文件中添加相关属性来实现。
邮件内容的设置
在设置邮件内容时,你需要注意邮件的主题、正文、收件人、发件人等信息的设置。如果你需要发送HTML格式的邮件,需要将邮件内容设置为HTML格式,并设置相应的邮件头信息。
邮件发送的异常处理
在发送邮件时,可能会出现各种异常,例如连接超时、认证失败等。你需要对这些异常进行处理,以便及时发现和解决问题。
邮件发送的性能问题
在发送大量邮件时,可能会出现性能问题。你需要注意邮件发送的频率和数量,以避免对邮件服务器造成过大的负载。
邮件发送的安全问题
在发送邮件时,需要注意邮件的安全性。你需要确保邮件内容不包含敏感信息,并且邮件服务器的认证和加密设置是正确的。
总之,在使用JavaMailSender发送邮件时,你需要注意邮件服务器的配置、邮件内容的设置、异常处理、性能问题和安全问题等方面,以确保邮件发送的顺利和安全。
相关文章:
在Spring Boot中使用JavaMailSender发送邮件
用了这么久的Spring Boot,我们对Spring Boot的了解应该也逐步进入正轨了,这篇文章讲的案例也在我们的实际开发中算是比较实用的了,毕竟我们完成注册功能和对用户群发消息,都可以采用到邮箱发送功能,往下看,…...
python动态圣诞下雪图
运行图片 代码 import pygame import random# 初始化Pygame pygame.init()# 创建窗口 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption(Christmas Tree)# 定义颜色 GREEN (34, 139, 34) RED (255, 0, 0) WHITE (255…...
随心玩玩(十)git
写在前面:研究生一年多了,一直浑浑噩噩的,在深度学习的泥潭挣扎了好久,终于走出了精神内耗的泥潭…好久没有写博客了,决定重新捡起来…记录一下学习吧~ 之前写了一篇git的博客,【github 从0开始的基本操作…...
每日一练【盛最多水的容器】
一、题目描述 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&…...
Linux C语言 38-进程间通信IPC之信号
Linux C语言 38-进程间通信IPC之信号 本节关键字:C语言 进程间通信 信号量 semaphore 相关库函数:sem_init、sem_post、sem_wait、sem_destroy 提示:先做内容框架梳理,后期进行完善补充! 什么是信号量? …...
前端使用 xlsx.js 工具读取 excel 遇到时间日期少 43 秒的解决办法
在使用 xlsx 读取 excel 的时间格式的数据时,如 ‘2023-11-30’,‘2023/11/30’ ,默认会读取一串数字字符串,如:‘45260’,此时需要在 read 的时候传入一个配置项: import { read } from xlsxc…...
问题记录-maven依赖升级或替换(简单版)
问题背景 项目被检测到有高危漏洞,需要对部分jar进行升级。以一个jar为例记录一下升级过程。 1 找到高危漏洞的包 如果装了maven helper插件则可以在下面查看当前模块依赖包 2 使用maven命令 执行下面这个命令,会将当前项目的信息打印出来,…...
00Hadoop数据仓库平台
在这里是学习大数据的第一站 什么是数据仓库常见大数据平台组件及介绍 什么是数据仓库 在计算领域,数据仓库(DW 或 DWH)也称为企业数据仓库(EDW),是一种用于报告和数据分析的系统,被认为是商业智…...
java-jar包
jar包类似于压缩包,主要是组织和分享自己的Java代码方便,将一组特定的java文件打包,一般是.class文件,不过并不限制文件类型,都可以打包。 jar包中包好清单文件,如果没有指定就会自动生成默认的࿰…...
Flink运行时架构核心概念
Flink运行时架构 JobManager:协调,决定何时调度下一个task,对失败任务做恢复。 ResourceManager: 负责Flink集群中的资源提供、回收、分配,它负责管理task slot。standalone模式下,不能自行启动新的taskmanagerDispatc…...
docker安装达梦数据库并挂在数据卷
离线包下载地址:请点击 1.在线下载 wget https://download.dameng.com/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar2. 导入镜像 docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar3. 运行容器 docker run -d -p 5236:5236 --restartalwa…...
ROS第一个程序——helloworld
目录 一、工作空间的创建 1.创建工作空间并初始化 2.进入 src 创建 ros 包并添加依赖 二、C实现helloworld C源码实现 编辑 ros 包下的 Cmakelist.txt文件 进入工作空间目录并编译 执行 三、python实现helloworld 进入 ros 包添加 scripts 目录并编辑 python 文件 …...
【Python 训练营】N_17 冒泡排序
题目 列表L [3,2,5,6,1,3,8,1,9],冒泡排序实现从小到大排列。 分析 冒泡排序的基本思想是从序列的第一个元素开始,依次比较相邻的两个元素,如果它们的顺序错误就交换它们的位置,直到整个序列有序为止。具体步骤如下࿱…...
虚拟机docker中的Nginx部署
Nginx部署 : 1.搜索nginx镜像 docker search nginx 2.拉取nginx镜像 docker pull nginx 3.创建目录 mkdir nginx cd nginx mkdir conf cd conf vim nginx.conf 4.编写nginx.conf配置文件 user nginx; worker_processes 1; error_log /var/log/nginx/erro…...
06、pytest将多个测试放在一个类中
官方用例 # content of test_class.py # 实例1 class TestClass:def test_one(self):x "this"assert "h" in xdef test_two(self):x "hello"assert hasattr(x,"check")# content of test_class_demo.py # 每个测试都有唯一的类实例…...
实体类转SQL工具类
主要的目标是简化开发人员在有实体类的情况下时做的重复性工作,提高开发效率。 单个实体类的转换工具类 1.EntityToTableConverter工具类 import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.Field; import java.math.BigDecimal…...
高端制造业中的通用性超精密3D光学测量仪器
超精密光学3D测量仪器具有高精度、自动化程度高、实时反馈和范围广等优势。它能够实现微米级别的精确测量,能够精确测量产品的尺寸、形状和表面粗糙度等,具有广泛的应用价值和重要意义。 超精密光学3D测量仪器配备多种传感器、控制器和计算机系统&#…...
微信公众号非静默授权获取头像和昵称
要在Vue前端应用程序中实现微信公众号非静默授权获取头像和昵称,您需要遵循以下步骤: 1.在微信公众平台上注册并创建一个公众号。 2.在Vue项目中安装wechat-js-sdk库,该库提供了与微信JS-SDK的交互功能。 npm install wechat-js-sdk --sav…...
Java项目学生管理系统四编辑学生
编辑学生 欢迎阅读本篇博客,今天我们将继续探索Java项目学生管理系统的功能,重点关注学生信息的修改模块。在学生管理系统中,修改学生信息是一个关键操作,通过该功能可以方便地更新学生的个人信息、成绩以及其他相关数据。通过本…...
不同数据库进行同步和增量数据(SQL server 与MySQL数据库为例)
场景 最近在做的一个项目需要将远程服务器的SQL server数据库中表的数据传输到本机的MySQL数据库中,并且远程的SQL server数据库表的数据会实时进行更新,并且差不多是一分钟内传输18条数据,例如现在是2023-12-4 15:09,在15:08这个…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...
