SpringBoot集成mail

发送邮件:SMPT、MIME,是一种基于"推"的协议,通过SMPT协议将邮件发送至邮件服务器,MIME协议是对SMPT协议的一种补充,如发送图片附件等

接收邮件:POP、IMAP,是一种基于"拉"的协议,收件人通过POP协议从邮件服务器拉取邮件

账号准备:mail 客户端设置说明:参考官方Gmail帮助

一、依赖


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springboot-demo</artifactId><groupId>com.et</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>mail</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</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-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency></dependencies></project>

二、配置文件和启动类

application.properties

#这里以qq邮箱为例
# qq邮箱服务器
spring.mail.host=smtp.qq.com
# 你的qq邮箱账户
spring.mail.username=yourAccount@qq.com
# 你的qq邮箱第三方授权码
spring.mail.password=yourPassword
# 编码类型
spring.mail.default-encoding=UTF-8
spring.thymeleaf.prefix=classpath:/template/
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

三、MailUtil.java

@Service
public class MailUtils{// 日志private final Logger logger = LoggerFactory.getLogger(MailUtils.class);@Value("${spring.mail.username}") //注入 application.properties中指定的用户名private String from;@Autowired //用于发送文件private JavaMailSender mailSender;//发送普通文本邮件public void sendSimpleMail(String to,String subject,String content){SimpleMailMessage message = new SimpleMailMessage();message.setTo(to);//收信人message.setSubject(subject);//主题message.setText(content);//内容message.setFrom(from);//发信人mailSender.send(message);}//发送html邮件public void sendHtmlMail(String to, String subject, String content){//使用MimeMessage,MIME协议MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper;try {helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);//true代表支持htmlmailSender.send(message);logger.info("发送HTML邮件成功");} catch (MessagingException e) {e.printStackTrace();logger.error("发送HTML邮件失败:", e);}}//发送带附件的邮件public void sendAttachmentMail(String to, String subject,String content, String filePath){// 日志logger.info("发送带附件邮件开始:{},{},{},{}", to, subject, content, filePath);MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper;try {helper = new MimeMessageHelper(message, true);//true代表支持多组件,如附件,图片等helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);FileSystemResource file = new FileSystemResource(new File(filePath));String fileName = file.getFilename();helper.addAttachment(fileName, file);//添加附件,可多次调用该方法添加多个附件mailSender.send(message);logger.info("发送带附件邮件成功");} catch (MessagingException e) {logger.error("发送带附件邮件失败", e);}}//发送带图片的邮件public void sendInlineResourceMail( String to, String subject, String content,String rscPath, String rscId){// 日志logger.info("发送带图片邮件开始:{},{},{},{},{}", to, subject, content, rscPath, rscId);MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper;try {helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);FileSystemResource res = new FileSystemResource(new File(rscPath));helper.addInline(rscId, res);//重复使用添加多个图片mailSender.send(message);logger.info("发送带图片邮件成功");} catch (MessagingException e) {logger.error("发送带图片邮件失败", e);}}
}

四、邮件模板


<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>邮件模板</title>
</head>
<body>
您好,感谢您的注册,这是一封验证邮件,请点击下面的链接完成注册,感谢您的支持!<br>
<a href="#" th:href="@{http://www.bestbpf.com/register/{id}(id=${id})}">激活账户</a>
</body>
</html>

测试:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class SpringBootApplicationTest {@AutowiredMailUtils mailUtils;@Autowiredprivate TemplateEngine templateEngine;/*** 指定模板发送邮件*//*** 指定模板发送邮件*/@Testpublic void testTemplateMail() {//向Thymeleaf模板传值,并解析成字符串Context context = new Context();context.setVariable("id", "001");String emailContent = templateEngine.process("emailTemplate", context);mailUtils.sendHtmlMail("zhaokuii11@163.com", "这是一个模板文件", emailContent);}/*** 发送简单纯文本邮件*/@Testpublic void sendSimpleMail() {mailUtils.sendSimpleMail("zhaokuii11@163.com", "发送邮件测试", "大家好,这是我用springboot进行发送邮件测试");}/*** 发送HTML邮件*/@Testpublic void sendHtmlMail() {String content = "<html><body><h3><font color=\"red\">" + "大家好,这是springboot发送的HTML邮件" + "</font></h3></body></html>";mailUtils.sendHtmlMail("zhaokuii11@163.com", "发送邮件测试", content);}/*** 发送带附件的邮件*/@Testpublic void sendAttachmentMail() {String content = "<html><body><h3><font color=\"red\">" + "大家好,这是springboot发送的HTML邮件,有附件哦" + "</font></h3></body></html>";String filePath = "your file path";mailUtils.sendAttachmentMail("zhaokuii11@163.com", "发送邮件测试", content, filePath);}/*** 发送带图片的邮件*/@Testpublic void sendInlineResourceMail() {String rscPath = "your picture path";String rscId = "001";String content = "<html><body><h3><font color=\"red\">" + "大家好,这是springboot发送的HTML邮件,有图片哦" + "</font></h3>"+ "<img src=\'cid:" + rscId + "\'></body></html>";mailUtils.sendInlineResourceMail("zhaokuii11@163.com", "发送邮件测试", content, rscPath, rscId);}
}

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

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

相关文章

Zabbix监控容器MongoDB,报错:Unknown metric mongodb.server.status

在Zabbix中配置监控MongoDB容器时&#xff0c;如果遇到Unknown metric mongodb.server.status这样的错误&#xff0c;通常意味着Zabbix Agent尝试从MongoDB获取某个预定义的性能指标&#xff08;例如mongodb.server.status&#xff09;&#xff0c;但是未能成功识别或解析该指标…

GPT4+Python近红外光谱数据分析及机器学习与深度学习建模教程

原文链接&#xff1a;GPT4Python近红外光谱数据分析及机器学习与深度学习建模教程 第一&#xff1a;GPT4 1、ChatGPT&#xff08;GPT-1、GPT-2、GPT-3、GPT-3.5、GPT-4模型的演变&#xff09; 2、ChatGPT对话初体验 3、GPT-4与GPT-3.5的区别&#xff0c;以及与国内大语言模…

简易版axios实现-基于promise+XMLHttpRequest

/*** 目标&#xff1a;封装_简易axios函数_获取省份列表* 1. 定义myAxios函数&#xff0c;接收配置对象&#xff0c;返回Promise对象* 2. 发起XHR请求&#xff0c;默认请求方法为GET* 3. 调用成功/失败的处理程序* 4. 使用myAxios函数&#xff0c;获取省份列表展示*/functi…

[数据集][目标检测]芒果叶病害数据集VOC+YOLO格式4000张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4000 标注数量(xml文件个数)&#xff1a;4000 标注数量(txt文件个数)&#xff1a;4000 标注…

微信小程序开发系列(十六)·事件传参·data-*自定义数据

事件传参&#xff1a;在触发事件时,将一些数据作为参数传递给事件处理函数的过程,就是事件传参。 在微信小程序中,我们经常会在组件上添加一些自定义数据,然后在事件处理函数中获取这些自定义数据,从而完成业务逻辑的开发。 在组件上通过data-"的方式定义需要传递的数据,其…

Android14之解决编译报错:bazel: no such file or directory(一百八十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

赢在起跑线:商品企划系统为鞋服品牌带来的竞争优势解析

在鞋服行业的激烈竞争中&#xff0c;每个品牌都渴望在市场中脱颖而出&#xff0c;而成功的起点往往在于商品企划的策略制定。商品企划系统作为一种先进的商业策略工具&#xff0c;能够帮助鞋服品牌赢在起跑线&#xff0c;获得竞争优势。本文将深入探讨商品企划系统如何为鞋服品…

计算机丢失msvcp140_1.dll怎样修复,分享五种有效的解决方法

当计算机系统中msvcp140_1.dll文件发生丢失时&#xff0c;可能会引发一系列运行问题&#xff0c;具体表现形式多种多样。首先&#xff0c;由于msvcp140_1.dll是Microsoft Visual C Redistributable Package的重要组成部分&#xff0c;它的缺失将直接影响到依赖这一库的各类应用…

Vue.js+SpringBoot开发计算机机房作业管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 登录注册模块2.2 课程管理模块2.3 课时管理模块2.4 学生作业模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 课程表3.2.2 课时表3.2.3 学生作业表 四、系统展示五、核心代码5.1 查询课程数据5.2 新增课时5.3 提交作…

01. Nginx入门-Nginx简介

Web基础知识 Web协议通信原理 Web协议通信过程 浏览器本身是一个客户端&#xff0c;当输入URL后&#xff0c;首先浏览器会请求DNS服务器&#xff0c;通过DNS获取相应的域名对应的IP。通过IP地址找到对应的服务器后&#xff0c;监理TCP连接。等浏览器发送完HTTP Request&…

UD效果广告

1.定义 全称Unidesk&#xff0c;是由阿里旗下大数据运营平台“阿里妈妈”推出的数字营销引流平台。UD投放将其他媒体的流量通过相关的广告创意导入到天猫店铺。 2.UD投放优化技巧 &#xff08;1&#xff09;不起量排查&#xff1a; 可以从账户问题、计划数量不足、计划设置…

OpenAI 3年前的AI音乐生成项目:Jukebox,效果比SunoAI v3还好

原来OpenAI 3年前就开始搞AI音乐生成了 效果甚至比最近发布的sunoAI v3还要好&#xff0c;难道OpenAI 想把这个隐藏大招练成无人能敌的状态才放出来再一次轰动全球&#xff1f; OpenAI在2019年8月份就推出了他们的一音乐生成模型&#xff1a;Jukebox Jukebox能够根据提供的歌…

基础小白快速入门计算机原理----->计算机的分类

计算机的分类可以从不同的角度进行划分&#xff0c;以下是几种常见的分类方式&#xff1a; 1. **按照性能和规模分类** - **超级计算机**&#xff1a;拥有极强的计算能力&#xff0c;通常用于处理大规模、复杂的计算任务&#xff0c;如气候模拟、核武器设计等。它们的运算速度…

js bind函数

一、bind函数的作用 bind() 函数是 JavaScript 中的一个方法&#xff0c;它用于创建一个新的函数&#xff0c;并将指定的对象作为新函数的执行上下文&#xff08;也就是 this 关键字所引用的对象&#xff09;。bind() 方法不会立即执行函数&#xff0c;而是返回一个新函数&…

消息队列-kafka-服务端处理架构(架构,Topic文件结构,服务端数据的一致性)

服务端处理架构 资料来源于网络 网络线程池&#xff1a; 接受请求&#xff0c;num.network.threads&#xff0c;默认为 3&#xff0c;专门处理客户的发送的请求。 IO 线程池&#xff1a; num.io.threads&#xff0c;默认为 8&#xff0c;专门处理业务请求。也就是它不负责发…

JetBrains TeamCity 身份验证绕过漏洞(CVE-2024-27198)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

刷题DAY9 | LeetCode 28-实现 strStr() 459-重复的子字符串

28-实现 strStr()&#xff08;easy&#xff09; 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 思路…

【软件工程】介绍

软件工程 软件工程是一门应用计算机科学、数学和工程原则来设计、开发、维护和测试软件的学科。软件工程着重于创建质量高效、可靠、可使用、可维护和快速开发的系统。这个领域从20世纪60年代初开始蓬勃发展&#xff0c;主要是为了解决软件危机&#xff0c;即随着计算机和软件…

剑指offer--c++--n个骰子的点数

目录 题目&#xff1a; 题目分析&#xff1a; 最后编写代码&#xff1a; 输出结果 题目&#xff1a; 把n个骰子扔在地上&#xff0c;所有骰子朝上一面的点数之和为s。输入n&#xff0c;打印出s的所有可能的值出现的概率。 感谢大佬的帮助&#xff1a;https://www.cnblogs.c…

了解处理器

了解处理器 摘要写在前面1. 计算机简介1.1.计算机发展简史1.2.计算机分类1.3.PC机结构 2.初识处理器2.1.处理器的硬件模型2.2.处理器的编程模型2.3.处理器的分层模型2.4.如何选择处理器 3.指令集体系结构3.1.处理器编程模型3.2.指令集发展历程3.3.指令集分类3.4.汇编语言格式3.…