【开发篇】十六、SpringBoot整合JavaMail实现发邮件

news2024/12/23 10:35:36

文章目录

  • 0、相关协议
  • 1、SpringBoot整合JavaMail
  • 2、发送简单邮件
  • 3、发送复杂邮件

0、相关协议

  • SMTP(Simple Mail Transfer Protocol):简单邮件传输协议,用于发送电子邮件的传输协议
  • POP3(Post Office Protocol - Version 3):用于接收电子邮件的标准协议
  • IMAP(Internet Mail Access Protocol):互联网消息协议,是POP3的替代协议

1、SpringBoot整合JavaMail

STEP1:加入JavaMail起步依赖:

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

STEP2:相关配置:

spring:  
  mail:    
    host: smtp.qq.com  # 发邮件,smtp协议,后面.运营商    
    username: *********@qq.com    
    password: *********  # 不是邮箱的密码,是下面获取的一个授权码

注意password,不是邮箱的登录密码,是一个授权码,获取方式,在QQ邮箱中是【设置】-【邮箱账号】-【开启】

在这里插入图片描述

发送验证短信:

在这里插入图片描述

然后在上个页面点保存更改,(记得点保存更改)复制这个授权码就是password的值,即可配置邮件客户端成功。

在这里插入图片描述
其他类型的邮箱获取方式类似,比如163:

在这里插入图片描述

STEP3:注入JavaMailSender对象,定义发送邮件的接口

@Autowired    
private JavaMailSender javaMailSender;   

整合完成,下面按简单邮件和复杂邮件来写。简单即普通文本,复杂即超链接、附件等。

2、发送简单邮件

以下用QQ邮箱给163邮箱发一个简单文本的邮件:

//定义接口
public interface SendMailService{

	void sendMail();
}
//实现类

@Service
public class SendMailServiceImpl implements SendMailService { 

	@Autowired    
	private JavaMailSender javaMailSender;   

	//这些值也可以不硬编码,写在配置文件中@Value取值
	private String from = "********@qq.com";	 // 发送人    
	private String to = "********@126.com";	 // 接收人   
	private String subject = "测试邮件";		 // 邮件主题   
	private String text = "测试邮件正文";	 	// 邮件内容
		    
	@Override    
	public void sendMail() {       
		SimpleMailMessage mailMessage = new SimpleMailMessage();  
		//mailMessage.setFrom(from); 
		//from后面加个名字,比如xxx公司,不然发送发一串邮箱数字,谁知道你是谁      
		mailMessage.setFrom(from + "别名");   
		//这里的to是个可变长String,即可发送多人
		mailMessage.setTo(to);        
		mailMessage.setSubject(subject);        
		mailMessage.setText(text);
		//mailMessage.setSendDate();        //设置发送的时间
		//其他设置自行set
		javaMailSender.send(mailMessage);     //发送
	}
	
}

写个测试类看下效果:

在这里插入图片描述
联不通:

在这里插入图片描述

我在公司内网写的,网络不通,不是25端口被禁的原因,在外网是可以ping通smtp.qq.com这个host的。先跳过了。

3、发送复杂邮件

正文为html,比如超链接或者图片。以及发送附件:

//超链接
private String text = "<a href='https://www.baidu.com/'>百度</a>";

//图片
private String img = "<img src='https://pic35.photophoto.cn/20150511/0034034892281415_b.jpg' />";

@Override
public void sendMail() {    
	try {        
		MimeMessage mimeMessage = javaMailSender.createMimeMessage(); 
		//第二个参数,即是否允许添加多部件
		//我后面要添加各种附件,所以这里必须是true       
		MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true);       
		mimeMessageHelper.setFrom(from);       
		mimeMessageHelper.setTo(to);        
		mimeMessageHelper.setSubject(subject);
		//不加true,默认当普通文本,true即按html来解析        
		mimeMessageHelper.setText(text,true);  
		
		//添加附件
		File file1 = new File("logo.png"); 
		File file2 = new File("D:\\myboot.jar"); 
		//如果是手写文件名,记得添加个后缀,比如.png,方便在邮件里可预览 
		mimeMessageHelper.addAttachment(file1.getName(),file1);  
		mimeMessageHelper.addAttachment("一个jar包.jar",file2);    
		javaMailSender.send(mimeMessage);    
	} catch (Exception e) {       
		e.printStackTrace();   
	}
}

注意点:

  • 不再用简单消息对象,而是MimeMessage对象,并把它包装成mimeMessageHelper对象
  • 要传附件的话,mimeMessageHelper对象构造方法的第二个参数传true
  • setText方法重载,第二个参数传true,就是讲text按照html来解析,而不是普通文本
  • 注意最后send的还是MimeMessage对象,不是mimeMessageHelper对象

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

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

相关文章

IPv6协议报文头

IPv6协议概述 IPv6&#xff08;Internet Protocol Version 6&#xff09;是网络层协议的第二代标准协议&#xff0c;也被成为IPng&#xff08;IP Next Generation&#xff09;。它是Internet工程任务组IETF&#xff08;Internet Engineering Task Force&#xff09;设计的一套…

ros2移植Apollo和autoware规控算法可跑工程

工程详细介绍请看&#xff1a; 自动驾驶路径规划控制ros移植Apollo和autoware规控算法可跑工程&#xff08;适合入门学习&#xff0c;科研和实战&#xff09; ros2的工程版本说明 之所以增加ros2版本&#xff0c;是因为想增加代码的工程应用性&#xff0c;其实对于科研来说并…

计算机专业毕业设计项目推荐11-博客项目(Go+Vue+Mysql)

博客项目&#xff08;GoVueMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式&am…

正点原子嵌入式linux驱动开发——U-boot启动流程详解

在上一篇笔记中详细分析了uboot的顶层Makefile&#xff0c;理清了uboot的编译流程。本章来详细的分析一下uboot的启动流程&#xff0c;理清uboot是如何启动的。通过对uboot启动流程的梳理&#xff0c;可以掌握一些外设是在哪里被初始化的&#xff0c;这样当需要修改这些外设驱动…

14885-2010 固定资产分类与代码 思维导图

声明 本文是学习GB-T 14885-2010 固定资产分类与代码…pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了固定资产的分类、代码及计量单位。 本标准适用于固定资产管理、清查、登记、统计等工作。 2 术语和定义 下列术语和定义…

由[哈希/散列]模拟实现[unordered_map/unordered_set] (手撕迭代器)

文章目录 1.迭代器分析2.细节处理3.完整代码3.1HashTable.h3.2unordered_set.h3.3unordered_map.h3.4Test.cpp 1.迭代器分析 2.细节处理 以下两篇文章均为笔者的呕心沥血想要搞懂本篇文章的uu请自行查阅 哈希/散列的细节实现 哈希/散列–哈希表[思想到结构][修订版] 手撕迭代器…

硬件知识:U盘相关知识介绍,值得收藏

目录 什么是U盘&#xff1f; U盘根据结构有哪几种&#xff1f; 根据U盘的存储介质、外形、功能分类有哪几种&#xff1f; 什么是U盘&#xff1f; U盘&#xff0c;全称为USB闪存盘&#xff0c;是一种以闪存芯片作为数据存储介质的移动存储设备。U盘的历史可以追溯到1998年&am…

vue3 中使用 echarts 图表——准备篇

我们常常在项目中使用图表来表示数据&#xff0c;而目前最常用的图标就是echarts&#xff0c;接下来我们就开始学习在vue中使用echarts图标。 一、准备一个vue项目&#xff08;一般通过vite来构建&#xff0c;而不是vue-cli&#xff09; 1.找到打开vite官网 2. 运行创建命令 …

MySQL进阶-存储引擎

目录 1.MySQL体系结构 体系结构图 各层的作用 2.存储引擎简介 2.1查看当前表的存储引擎 2.2 查询mysql支持的存储引擎 2.3 InnoDB简介 2.4 MyISAM简介 2.5 Memory简介 3.存储引擎的选择 1.MySQL体系结构 mysql体系结构主要有四层结构&#xff0c;从上到下依次是&#…

Spring Cloud zuul扩展能力设计和心得

前言 实际上Spring Cloud已经废弃zuul了&#xff0c;改用gateway&#xff0c;但是webflux的技术并没在实际项目大规模普及&#xff0c;还有很多servlet NIO的应用&#xff0c;所以zuul还是很有必要改造的&#xff0c;实测zuul调优&#xff08;调节转发的连接池&#xff09;跟g…

【算法挨揍日记】day11——852. 山脉数组的峰顶索引、162. 寻找峰值

852. 山脉数组的峰顶索引 852. 山脉数组的峰顶索引 题目描述&#xff1a; 符合下列属性的数组 arr 称为 山脉数组 &#xff1a; arr.length > 3存在 i&#xff08;0 < i < arr.length - 1&#xff09;使得&#xff1a; arr[0] < arr[1] < ... arr[i-1] < …

数据结构:二叉树(超详解析)

目录​​​​​​​ 1.树概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 1.3.1孩子兄弟表示法&#xff1a; 1.3.2双亲表示法&#xff1a;只存储双亲的下标或指针 两节点不在同一树上&#xff1a; 2.二叉树概念及结构 2.1.概念 2.2.特殊的二叉树&#xff1a; 2…

掌握交易时机!

“您是否知道您选择购买和出售加密货币的时间会产生很大的影响&#xff1f;当然&#xff0c;大多数交易者都知道高价卖出和低价买入的基本知识。然而&#xff0c;在选择交易加密货币的最佳时机时&#xff0c;还需要考虑许多其他小细节。加密货币市场分析表明&#xff0c;一天中…

【MyBatis-Plus】快速精通Mybatis-plus框架—核心功能

刚才的案例中都是以id为条件的简单CRUD&#xff0c;一些复杂条件的SQL语句就要用到一些更高级的功能了。 1.条件构造器 除了新增以外&#xff0c;修改、删除、查询的SQL语句都需要指定where条件。因此BaseMapper中提供的相关方法除了以id作为where条件以外&#xff0c;还支持…

ES 关于 remote_cluster 的一记小坑

最近有小伙伴找到我们说 Kibana 上添加不了 Remote Cluster&#xff0c;填完信息点 Save 直接跳回原界面了。具体页面&#xff0c;就和没添加前一样。 我们和小伙伴虽然隔着网线但还是进行了深入、详细的交流&#xff0c;梳理出来了如下信息&#xff1a; 两个集群&#xff1a;…

Java常见API---split()

package daysreplace;public class SplitTest {public static void main(String[] args) {String str"武汉市|孝感市|长沙市|北京市|上海市";String[] array str.split("\\|");System.out.println(array[0]);System.out.println(array[1]);System.out.pri…

[黑马程序员TypeScript笔记]------一篇就够了

目录&#xff1a; TypeScript 介绍 TypeScript 是什么&#xff1f;TypeScript 为什么要为 JS 添加类型支持&#xff1f;TypeScript 相比 JS 的优势TypeScript 初体验 安装编译 TS 的工具包 编译并运行 TS 代码 简化运行 TS 的步骤 TypeScript 常用类型 概述类型注解常用基础…

​“债务飙升!美国一天内增加2750亿美元,金融震荡的前奏已拉开帷幕!”

2023年10月4日&#xff0c;美国政府向美国债务追加2750亿美元&#xff0c;相当于现在比特币&#xff08;BTC&#xff09;总市值的一半还多。 有人会说:多一点、少一点&#xff0c;没什么区别.....确实&#xff0c;当你看美国债务时&#xff0c;2750亿美元并没有什么意义&#x…

oringin的x轴(按x轴规定值)绘制不规律的横坐标

1.双击x轴 2.选择刻度线标签 3.选择刻度

【数据结构】排序算法(二)—>冒泡排序、快速排序、归并排序、计数排序

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.冒泡排序 2.快速排序 2.1Hoare版 2.2占…