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

Spring Boot中实现发送文本、带附件和HTML邮件

SpringBoot实现发送邮箱

在这里插入图片描述

引言

在现代应用程序中,电子邮件通常是不可或缺的一部分。在Spring Boot中,你可以轻松地实现发送不同类型的邮件,包括文本、带附件和HTML邮件。本博客将向你展示如何使用Spring Boot发送这些不同类型的电子邮件。

步骤一:导入依赖

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

步骤二:配置邮箱信息

mail:# 邮件 SMTP 服务器的主机名host: smtp.qq.com# 用于登录 SMTP 服务器的邮箱地址username: 1111111@qq.com# 用于登录 SMTP 服务器的邮箱密码或授权码password: abcdefghijklmnopqrstuvwxyz# SMTP 服务器的端口port: 587# 是否启用 SMTP 认证,通常应设置为 truesmtpAuth: true# 是否启用 STARTTLS 安全传输协议,通常应设置为 truesmtpStarttlsEnable: true# 是否要求使用 STARTTLS 安全传输协议,通常应设置为 truesmtpStarttlsRequired: true# 默认编码defaultEncoding: UTF-8

步骤三:邮箱配置类

@Data
//配置属性文件
@Component
//说明配置文件属性的头部
@ConfigurationProperties(prefix = "mail")
public class MailConfig {private String host;private String username;private String password;private Integer port;private String smtpAuth;private String smtpStarttlsEnable;private String smtpStarttlsRequired;private String defaultEncoding;@Beanpublic JavaMailSender javaMailSender() {//邮箱发送对象JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();javaMailSender.setHost(host);javaMailSender.setPort(port);javaMailSender.setUsername(username);javaMailSender.setPassword(password);javaMailSender.setDefaultEncoding(defaultEncoding);// 配置其他属性,如协议、调试等,根据需要Properties properties = new Properties();properties.setProperty("mail.smtp.auth", smtpAuth);properties.setProperty("mail.smtp.starttls.enable", smtpStarttlsEnable);properties.setProperty("mail.smtp.starttls.required", smtpStarttlsRequired);javaMailSender.setJavaMailProperties(properties);return javaMailSender;}
}

步骤四:创建邮箱工具类

这里的发送人必须设置不然会报异常:501 Mail from address must be same as authorization user.

@Component
public class MailUtils {@Value("${mail.username}")private String username;@Resourceprivate JavaMailSender javaMailSender;/*** 邮箱发送** @param to      收信人* @param title   邮箱标题* @param content 邮箱内容*/public void sendMail(String to, String title, String content) {//邮箱消息对象SimpleMailMessage simpleMailMessage = new SimpleMailMessage();simpleMailMessage.setFrom(username);//发送人simpleMailMessage.setTo(to);//收件人simpleMailMessage.setSubject(title);//邮箱标题simpleMailMessage.setText(content);//邮箱内容//实现发送邮箱javaMailSender.send(simpleMailMessage);}/*** 群发邮箱** @param toList  收信人集合* @param title   邮箱标题* @param content 邮箱内容*/public void sendEmailToMultipleRecipients(List<String> toList, String title, String content) {SimpleMailMessage message = new SimpleMailMessage();message.setFrom(username);//发送人message.setTo(toList.toArray(new String[0]));message.setSubject(title);message.setText(content);javaMailSender.send(message);}/*** 发送HTML邮箱** @param to       收信人* @param title    邮箱标题* @param text     HTML内容* @param filePath 文件路径* @throws MessagingException 邮箱异常*/public void sendEmailWithAttachment(String to, String title, String text, String filePath) throws MessagingException {MimeMessage message = javaMailSender.createMimeMessage();message.setFrom(username);//发送人MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setTo(to);helper.setSubject(title);helper.setText(text);FileSystemResource file = new FileSystemResource(new File(filePath));helper.addAttachment(FileUtil.getName(filePath), file);javaMailSender.send(message);}/*** 发送HTML邮箱** @param to    收信人* @param title 邮箱标题* @param text  HTML内容* @param file  文件* @throws MessagingException 邮箱异常*/public void sendEmailWithAttachment(String to, String title, String text, File file) throws MessagingException {MimeMessage message = javaMailSender.createMimeMessage();message.setFrom(username);//发送人MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setTo(to);helper.setSubject(title);helper.setText(text);helper.addAttachment(FileUtil.getName(file), file);javaMailSender.send(message);}/*** 发送HTML邮箱** @param to          收信人* @param title       邮箱标题* @param htmlContent HTML内容* @throws MessagingException 邮箱异常*/public void sendHtmlEmail(String to, String title, String htmlContent) throws MessagingException {MimeMessage message = javaMailSender.createMimeMessage();message.setFrom(username);//发送人MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setTo(to);helper.setSubject(title);helper.setText(htmlContent, true); // 设置为true表示HTML内容javaMailSender.send(message);}
}

通过使用Spring Boot和JavaMailSender,你可以轻松地实现发送文本、带附件和HTML邮件的功能。这些示例可以帮助你在你的应用程序中集成邮件发送功能,以便满足不同类型的邮件需求

相关文章:

Spring Boot中实现发送文本、带附件和HTML邮件

SpringBoot实现发送邮箱 引言 在现代应用程序中&#xff0c;电子邮件通常是不可或缺的一部分。在Spring Boot中&#xff0c;你可以轻松地实现发送不同类型的邮件&#xff0c;包括文本、带附件和HTML邮件。本博客将向你展示如何使用Spring Boot发送这些不同类型的电子邮件。 步…...

MySQL5.7版本与8.0版本在CentOS系统安装

目录 前置要求 1. MySQL5.7版本在CentOS系统安装 1.1 安装 1.1.1 配置yum仓库 1.1.2 使用yum安装MySQL 1.1.3 安装完成后&#xff0c;启动MySQL并配置开机自启动 1.1.4 检查MySQL的运行状态 1.2 配置 1.2.1 获取MySQL的初始密码 1.2.2 登陆MySQL数据库系统 …...

【gitlab】从其他仓库创建项目

需求描述 解决方法 以renren-fast脚手架为例 第一步 第二步 第三步 第四步 参考文章...

【ARM CoreLink 系列 6 -- DMC-400控制器简介】

文章目录 1.1 DMC-400 简介1.1.1 DFI&#xff08;DDR PHY Interface&#xff09;1.1.2 DFI 接口组1.1.3 DMC-400 兼容协议1.1.4 DMC-400 特性1.1.5 DMC-400 Interface 1.1 DMC-400 简介 DMC-400是一个由ARM开发、测试和授权的动态内存控制器&#xff0c;同时 DMC-400也是一个符…...

在 Azure 中开发云原生应用程序:工具和技巧

Azure 中的云原生开发工具 Azure 包含一系列用于云原生应用程序开发的内置工具和服务。这里介绍的服务和工具是很好的入门选择。 发展 Azure 包括两个用于开发和构建云原生应用程序的主要工具&#xff1a;Visual Studio (VS) 和Azure应用服务。 VS 是一个集成开发环境&#…...

【Redis】基础数据结构-字典

Redis 字典 基本语法 字典是Redis中的一种数据结构&#xff0c;底层使用哈希表实现&#xff0c;一个哈希表中可以存储多个键值对&#xff0c;它的语法如下&#xff0c;其中KEY为键&#xff0c;field和value为值&#xff08;也是一个键值对&#xff09;&#xff1a; HSET key…...

平板第三方电容笔怎么样?便宜的ipad触控笔推荐

苹果原装的电容笔与国产的平替电容笔最大的区别在于&#xff0c;平替电容笔只有一个斜面压力感应&#xff0c;而苹果电容笔既有斜面压力感应&#xff0c;又有重力压力感应。但是&#xff0c;如果你不经常使用它来进行绘画的话&#xff0c;你也不必买选择这款苹果电容笔&#xf…...

pytorch_神经网络构建3

文章目录 卷积神经网络实现卷积层,池化层池化层:数据标准化AlexNet卷积网络深层网络结构vgggoogleNet网络结构ResNet网络结构DensNet网络结构训练卷积神经网络会遇到的一些问题学习率衰减 卷积神经网络 前面讲述了逻辑回归分类,模拟函数回归问题,单层,深层网络,它们以点和向量…...

遗传算法入门笔记

目录 一、大体实现过程 二、开始我们的进化(具体实现细节) 2.1 先从编码说起 2.1.1 二进制编码法 2.1.&#xff12; 浮点编码法 2.1.3 符号编码法 2.2 为我们的袋鼠染色体编码 2.3 评价个体的适应度 2.4 射杀一些袋鼠 2.5 遗传--染色体交叉(crossover) 2.6 变异--基…...

【golang】go 返回参数 以及go中 裸返

一、Go 返回参数命名 在Golang中&#xff0c;命名返回参数通常称为命名参数。 Golang允许在函数签名或定义中为函数的返回或结果参数指定名称。或者可以说这是函数定义中返回变量的显式命名。基本上&#xff0c;它解决了在return语句中提及变量名称的要求。 通过使用命名返回参…...

elasticsearch深度分页问题

一、深度分页方式from size es 默认采用的分页方式是 from size 的形式&#xff0c;在深度分页的情况下&#xff0c;这种使用方式效率是非常低的&#xff0c;比如我们执行如下查询 1 GET /student/student/_search 2 { 3 "query":{ 4 "match_all":…...

32、Flink table api和SQL 之用户自定义 Sources Sinks实现及详细示例

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...

Java练习题-用冒泡排序法实现数组排序

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java练习题 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又…...

【SV中的多线程fork...join/join_any/join_none】

SV中fork_join/fork_join_any/fork_join_none 1 一目了然1.1 fork...join1.2 fork...join_any1.3 fork...join_none 2 总结 SV中fork_join和fork_join_any和fork_join_none; Note: fork_join在Verilog中也有&#xff0c;只有其他的两个是SV中独有的&#xff1b; 1 一目了然 1.…...

翻译:网站整站翻译 / 网站国际化 / 极简实现

一、本文目标 以极简单的方法实现整站翻译&#xff0c;轻松实现国际化。 二、js 文件 https://res.zvo.cn/translate/translate.js 三、代码 代码放在浏览器控制台即可实现 var head document.getElementsByTagName(head)[0];var script document.createElement(script);sc…...

深度森林(deep-forest)安装

深度森林&#xff08;deep-forest&#xff09;安装 1、打开https://pypi.org/&#xff0c;搜索deep-forest&#xff0c;下载wheel文件 在下载好之后&#xff0c;打开文件下载的位置 首先对下载好的wheel文件进行改名&#xff0c;原名是&#xff1a; deep_forest-0.1.7-cp39-c…...

ping.pe ping 检测IP全球延迟

可以把结果保存为照片 https://ping.pe/全球ping ping ip端口检测 IP:PORT路由追踪 mtr IP 参考 ping.pe...

nodejs 16版本

Index of /download/release/latest-v16.x/...

NSSCTF做题(7)

[第五空间 2021]pklovecloud 反序列化 <?php include flag.php; class pkshow { function echo_name() { return "Pk very safe^.^"; } } class acp { protected $cinder; public $neutron; …...

【GIT版本控制】--高级分支策略

一、分支合并策略 在Git中&#xff0c;高级分支策略是为了有效地管理和整合分支而设计的。其中一个关键方面是分支合并策略&#xff0c;它定义了如何将一个分支的更改合并到另一个分支。以下是几种常见的分支合并策略&#xff1a; 合并提交策略&#xff08;Merge Commit Stra…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...