SpringBoot,使用JavaMailSender发送邮件(含源码)。

news2024/11/17 13:55:43

    本文主要讲解使用JavaMailSender发送邮件,并给出对应的参考案例、源码。

1、使用的依赖jar包

     JavaMailSender发送邮件,只需要 "spring-boot-starter-mail" jar包就可以。考虑到邮件发送时,使用 Hutool工具生成Excel文件做为附件,因此这里也将 Hutool工具包依赖添加上。

<!-- 引入 spring-boot-starter-mail 依赖 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

<!-- hutool工具包 -->
<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.8.12</version>
</dependency>

<!-- hutool工具需要和Apache中的POI合用,注意版本的问题。 -->
<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>5.0.0</version>
</dependency>

<dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi-ooxml</artifactId>
	<version>5.0.0</version>
</dependency>

2、application.properties中配置相应的属性内容。

      需要说明的是,163邮箱在邮件发送时开启了授权模式,需要将IMAP/SMTP服务、POP3/SMTP服务开启,spring.mail.password 属性填写的是授权码而非密码。

# 在我使用QQ邮箱测试时,不知道是不是QQ邮箱安全性较高,使用QQ邮箱测试失败了!  2022/12/09  17:44
# 发送服务器域名或地址,以 163 邮箱为例.
spring.mail.host=smtp.163.com
# 163邮箱中的账户,在 com.moon.EmailApplicationTests.test01 中, message.setFrom("...") 要与这里的 mail.username 保持一致.
spring.mail.username=abc_xxxx_123@163.com
# 163 邮箱中的授权码
spring.mail.password=XSL6666666IZZ
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
# 邮件接收时间的限制,单位毫秒
spring.mail.properties.mail.smtp.timeout = 10000
# 连接时间的限制,单位毫秒
spring.mail.properties.mail.smtp.connectiontimeout = 10000
# 邮件发送时间的限制,单位毫秒
spring.mail.properties.mail.smtp.writetimeout = 10000


3、简单的邮件发送案例

	/**
	 * 测试:实现一封简单邮件的发送
	 *
	 * @author moon 2022/12/09  17:10
	 */
	@Test
	public void sendSimpleMail() throws Exception {

		SimpleMailMessage message = new SimpleMailMessage();
		message.setFrom(from);
		message.setTo("12345678@qq.com");
//		message.setTo("123333444@qq.com");
		message.setSubject("主题:简单邮件测试....");
		message.setText("测试邮件内容");

		mailSender.send(message);
		log.info("实现一封简单邮件的发送,邮件发送成功~~~~~");
	}


程序运行之后,邮件发送成功。

4、发送邮件并带附件

	/**
	 * 测试:发送邮件并带附件
	 *
	 * @author moon 2022/12/12  09:58
	 */
	@Test
	public void sendAttachmentsMail() throws Exception {

		// 日期格式
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		// 设置邮件发送时间
		Date sendDate = sdf.parse("2023-07-10 17:51:50");

		MimeMessage mimeMessage = mailSender.createMimeMessage();
		MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//		MimeMessageHelper helper2 = new MimeMessageHelper(mimeMessage);

		try {

			helper.setFrom(from);
			helper.setTo("12345678@qq.com");
			helper.setSubject("主题:邮件发送含附件");  // 标题
			helper.setSentDate(sendDate);  // 设置发送时间:没有实现定时发送。当运行该测试类后,邮件就直接发送了。  2022/12/12  10:34
			helper.setText("邮件中含有附件,请查收。");  // 邮件内容

			FileSystemResource file = new FileSystemResource(new File("si_cong.jpg"));
			FileSystemResource file2 = new FileSystemResource(new File("荷花.png"));
			helper.addAttachment("附件-1.jpg", file);
			helper.addAttachment("附件-2.png", file2);

			mailSender.send(mimeMessage);
			log.info("-------------- 邮件发送成功 --------------");

		} catch (Exception e) {
			log.error("发送邮件时发生异常!", e);
		}

	}


5、发送邮件并嵌入静态资源

	/**
	 * 测试:发送邮件并嵌入静态资源.
	 *
	 * @throws Exception
	 *
	 * @author  moon  2022/12/12  10:38
	 */
	@Test
	public void sendInlineMail() throws Exception {

		MimeMessage mimeMessage = mailSender.createMimeMessage();
		MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

		try {

			//邮件发送人
			helper.setFrom(from);
			//邮件接收人
			helper.setTo("12345678@qq.com");
			//邮件主题
			helper.setSubject("主题:邮件嵌入静态资源");
			//邮件内容,html格式
			helper.setText("<html><body><img src=\"cid:abc\"><p>邮件发送测试001</p></body></html>", true);

			FileSystemResource file = new FileSystemResource(new File("si_cong.jpg"));
			// addInline()函数中,入参 "contentId" 需要与 <img> 标签中 cid 的值保持一致.
			helper.addInline("abc", file);

			//发送
			mailSender.send(mimeMessage);
			log.info("-------------- 邮件发送成功 --------------");
		} catch (Exception e) {

			log.error("发送邮件时发生异常!", e);
		}

	}


程序运行之后,邮件发送成功。

源码路径: springboot-mail 项目  ,SpringBoot2.x--翟永超/springboot-mail 项目中,参考 com.moon.EmailApplicationTests 单元测试类。

福利推荐:[推荐]SpringBoot,邮件发送附件含Excel文件(含源码)。            

参考文章:      

1、使用JavaMailSender发送邮件 | 程序猿DD

2、

3、

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

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

相关文章

4.编译多线程应用程序

在不同平台下使用多线程的程序编译时的编译选项设置如下图所示。 gcc下编译时我们会碰到两个选项-pthread和-lpthread&#xff0c;记住推荐使用-pthread而不是-lpthread&#xff0c;原因如下 -lpthread只是起到链接pthread库的作用&#xff1b;而-pthread选项除了会链接pthrea…

java爱心代码,脱单必备

package com.example.test;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Image;import java.awt.Toolkit; import java.util.jar.JarOutputStream;import javax.swing.JFrame;class Cardioid extends JFrame {//定义窗口大小private …

MySQL数据类型、字符集、引擎、索引

MySQL数据类型、字符集、引擎、索引 数据类型 整型浮点类型字符类型时间类型复合类型整型 MySQL数据类型所占字节值范围tinyint1字节-128~127smallint2字节-32768~32767mediumint3字节-8388608~8388607int4字节-2147483648~2147483647bigint8字节9.22*10的18次方在创建表字段时…

《Linux创建新用户》

本文主要讲解linux下如何进行新用户创建、登录以及删除操作 文章目录 1、创建新普通用户2、登录普通用户&#xff08;一&#xff09;已经创建过普通用户&#xff08;二&#xff09;第一次创建普通用户 3、普通用户切换至超级用户&#xff08;root&#xff09;及超级用户&#x…

【NLP文本分类算法集锦】零基础入门经典文本分类项目实战(附代码+数据集)

前言 大家好&#xff0c;我是阿光。 本专栏整理了《NLP文本分类算法集锦》&#xff0c;内包含了各种常见的中英文文本分类算法&#xff0c;以及常见的NLP任务&#xff1a;情感分析、新闻分类以及谣言检测等。 文本分类是NLP的必备入门任务&#xff0c;在搜索、推荐、对话等场…

C++面试——多线程详解

C11提供了语言层面上的多线程&#xff0c;包含在头文件<thread>中。它解决了跨平台的问题&#xff0c;提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。C11 新标准中引入了5个头文件来支持多线程编程&#xff0c;如下图所示&#xff1a; 多进程与多线程 多…

微信黑名单在哪里找出来怎么恢复微信好友?

微信黑名单在哪里找出来&#xff1f; 1、打开手机微信&#xff0c;点击底部「我」进入找到「设置」&#xff1b; 2、在微信设置内找到「朋友权限」并点击进入&#xff1b; 3、在微信设置朋友权限内&#xff0c;即可找到微信通讯录黑名单&#xff0c;并点击微信「通讯录黑名单」…

1200*B. Interesting Subarray(贪心规律)

Problem - 1270B - Codeforces 解析&#xff1a; 可以发现&#xff0c;对于某个符合条件的数列&#xff0c;如果两个最值不在两端&#xff0c;那么可以删去两端多余的元素直到两个最值在两端为止。 我们观察某两个相邻元素a、b&#xff0c;可以发现这两个元素组成的序列成立的条…

基于旗鱼算法的无人机航迹规划-附代码

基于旗鱼算法的无人机航迹规划 文章目录 基于旗鱼算法的无人机航迹规划1.旗鱼搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用旗鱼算法来优化无人机航迹规划。 1.旗鱼搜索算法 …

C语言 每日一题 PTA 10.30 day8

1.高空坠球 皮球从某给定高度自由落下&#xff0c;触地后反弹到原高度的一半&#xff0c;再落下&#xff0c;再反弹&#xff0c;……&#xff0c;如此反复。问皮球在第n次落地时&#xff0c;在空中一共经过多少距离&#xff1f;第n次反弹的高度是多少&#xff1f; 输入格式 : …

excel求差公式怎么使用?

利用excel求差&#xff0c;可能有许多的小伙伴已经会了&#xff0c;不过还是存在一些不太熟悉的朋友们&#xff0c;所以这里有必要讲解一下。其实求差的实现主要就是一个公式&#xff0c;就是用一个单元格中的数字“减去”另一个单元格中的数字“等于”第三个单元格。此公式掌握…

854数据结构简答题---图

1.&#xff08;2015期末&#xff09;已知无环路有向图如图3.1,请在表2、表3中填写出各事件的最早发生时间、最迟发生时间、活动的最早、最迟开始时间&#xff0c;给出关键活动及关键路径。 从源点到汇点的有向路径可能有多条&#xff0c;所有路径中&#xff0c;具有最大路径长…

网络工程综合试题(三)

1. BGPMLS的作用是什么&#xff1f; BGPMLS&#xff08;BGP Monitoring Protocol and Label Switching&#xff09;是一种用于监控和管理BGP&#xff08;Border Gateway Protocol&#xff09;网络的协议和技术。它结合了BGP和MPLS&#xff08;Multiprotocol Label Switching&am…

超级英雄的导航之旅:动态路由和嵌套路由

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

linux下backtrace函数获取函数调用堆栈信息用法

backtrace用途介绍&#xff1a; 使用backtrace可以查看函数的调用关系&#xff0c;也可以查看程序异常时的函数调用关系。配置生成coredump生成文件的方法也可以捕获异常&#xff0c;但产生的coredump文件内存较大&#xff0c;backtrace函数的方法占用的内存小。 需求&#x…

这个人工智能社区火爆了!手把手教你零代码搞定大模型应用开发

想给自己做个私人定制的旅行攻略&#xff0c;满足个性化的出游需求&#xff0c;还要细致关注到天气、穿衣、老人孩子的作息等等&#xff0c;但太耗时费力怎么办&#xff1f;让AI帮忙搞定。一位开发者在AI Studio星河大模型社区用短短数小时就做好了“旅行规划家”智能应用。像这…

ICS TRIPLEX T8311 控制器模块

掌握器模块是产业自动化和掌握体系中的症结组件&#xff0c;具备多种特征&#xff0c;以保证体系的稳定性、否靠性和高效性。以下是掌握器模块的一些主要特征&#xff1a; 多通道掌握&#xff1a; 掌握器模块通常否以或许掌握多个通道&#xff0c;许否同时治理多个装备或历程。…

基于ADS的肖特基二极管整流电路仿真

文章目录 一、构建二极管模型二、构建封装寄生的二极管模型三、构建整流电路四、仿真及优化4.1HB仿真4.2 LSSP仿真4.3 仿真及调谐结束最近在仿真一个12级的整流电路,想利用ADS做一些原理级的仿真,验证可行性。这个事情对理解非线性电路还是有点帮助,所以把它记录下来。 先来…

C++中的std::cout与std::cerr、std::clog

本文用于记录C中std::cout与std::cerr、std::clog的异同 std::cerr 是C标准库中的标准错误输出流&#xff0c;用于向标准错误设备输出信息&#xff0c;通常用于报告程序的错误和异常情况。与之相对的&#xff0c;std::cout 是标准输出流&#xff0c;用于向标准输出设备输出一般…

springboot是如何工作的

一、前言 现在java后端开发框架比较多的使用springboot框架&#xff0c;springboot是在以前的springMVC进行封装和优化&#xff0c;最大的特点是简化了配置和内置Tomcat。本节通过阅读源码理解springboot是如何工作的。 二、springboot是如何工作的 1、从启动类开始 /***服务…