spring boot 集成邮件发送功能

一、首先到QQ邮箱申请开启POP3、SMTP协议
在这里插入图片描述
二、安装依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.23</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>

三、配置文件

spring:#配置邮箱发送邮件mail:default-encoding: utf-8 #默认编码host: smtp.qq.com #配置SMTP 服务器地址username: xxxxxxx@qq.com #发送者邮箱password: xxxxxxxxxxx#申请到的授权码port: 587 #端口号587或 465properties: #配置SSL 加密工厂mail:smtp:socketFactoryClass: javax.net.ssl.SSLSocketFactorydebug: true #表示开启debug模式,这样,邮件发送的过程会在控制台打印出来,这样方便排查错误#配置这些好后,springboot会自动帮我们配置好相关的邮件发送类thymeleaf:cache: falseprefix: classpath:/templates/

四、如果需要发送模板的邮件,则在/templates/目录下建立email.html文件

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>使用Thymeleaf作为邮件的模板</title>
</head>
<body>
<p>hello 欢迎加入 xxx 大家庭,您的入职信息如下:</p>
<table border="1"><tr><td>姓名</td><td th:text="${username}"></td></tr><tr><td>职位</td><td th:text="${position}"></td></tr><tr><td>薪水</td><td th:text="${salary}"></td></tr>
</table>
<div style="color: #ff1a0e">一起努力创造辉煌</div></body>
</html>

五、如果需要异常打印信息的话新建自定义异常类BusinessException

public class BusinessException extends RuntimeException {public BusinessException(String msg){super(msg);}
}

六、如果需要发送附件的话,则新建网络文件转流类

package com.example.answer_system.utils;import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;//文件转换工具
public class FileUtils {/*** 将网络文件转换为文件流* @param imageUrl* @return*/public static MultipartFile fileUrlConvertToMultipartFile(String imageUrl) {try {// 将在线图片地址转换为URL对象URL url = new URL(imageUrl);// 打开URL连接URLConnection connection = url.openConnection();// 转换为HttpURLConnection对象HttpURLConnection httpURLConnection = (HttpURLConnection) connection;// 获取输入流InputStream inputStream = httpURLConnection.getInputStream();// 读取输入流中的数据,并保存到字节数组中ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = inputStream.read(buffer)) != -1) {byteArrayOutputStream.write(buffer, 0, bytesRead);}// 将字节数组转换为字节数组byte[] bytes = byteArrayOutputStream.toByteArray();// 创建ByteArrayInputStream对象,将字节数组传递给它ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);// 创建MultipartFile对象,将ByteArrayInputStream对象作为构造函数的参数MultipartFile multipartFile = new MockMultipartFile("file", "filename.jpg", "image/jpg", byteArrayInputStream);return multipartFile;}catch (IOException ex){ex.printStackTrace();throw new BusinessException("附件无效");}}
}

七、测试方法

package com.example.answer_system.service.impl;import com.example.answer_system.service.IMailService;
import com.example.answer_system.utils.BusinessException;
import com.example.answer_system.utils.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Date;@Service
public class MailServiceImpl implements IMailService {@Resourcepublic JavaMailSender javaMailSender;@Value("${spring.mail.username}")private String sendUserMailName;@Resourceprivate TemplateEngine templateEngine;//简单文本@Overridepublic String sendMailQQMsg(){SimpleMailMessage message=new SimpleMailMessage();//构建一个邮件对象message.setSubject("使用springboot发送邮件测试");//设置邮件主题message.setFrom(sendUserMailName);//设置邮件发送人,要与application.yml文件配置一致message.setTo(sendUserMailName);//设置收件人,如果有多个接收人,使用","隔开//message.setCc("3121624188@qq.com");//设置抄送人,可以有多个//message.setBcc("3121624188@qq.com");//设置隐秘抄送人,可以有多个message.setSentDate(new Date());//设置发送日期message.setText("小程使用springboot发送邮件的简单测试!!");//设置邮件正文javaMailSender.send(message);//发送邮件return "OK";}@Overridepublic String sendAttachFileMail(String filePath) {try {MimeMessage mimeMessage=javaMailSender.createMimeMessage();MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true);//true表示构建一个带附件的邮件对象helper.setSubject("这是一封测试邮件,带附件的");helper.setFrom(sendUserMailName);helper.setTo(new String[]{sendUserMailName});helper.setSentDate(new Date());helper.setText("小程使用springboot发送可以带附件的邮件 测试!!");helper.addAttachment("james.jpg", FileUtils.fileUrlConvertToMultipartFile(filePath));//第一个参数是自定义的名称,第二个参数是文件的位置javaMailSender.send(mimeMessage);}catch (MessagingException ex){throw new BusinessException("发送异常");}catch (Exception ex){ex.printStackTrace();}finally {return "OK";}}@Overridepublic String sendThymeleaf(){try {MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);helper.setSubject("使用Thymeleaf模板作为发送邮件的模板");helper.setFrom(sendUserMailName);helper.setTo(sendUserMailName);helper.setSentDate(new Date());//这里进入的是Template的ContextContext context = new Context();//设置模板中的变量context.setVariable("username","程婷");context.setVariable("position","java开发工程师");context.setVariable("salary","XXXXXK");//第一个参数作为模板的,名称String process = templateEngine.process("email.html", context);//第二个参数true表示这是html文本helper.setText(process,true);javaMailSender.send(mimeMessage);}catch (MessagingException ex){throw new BusinessException("失败");}return "OK";}}

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

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

相关文章

OpenGL FXAA抗锯齿算法(Qt,Consloe版本)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 之前已经提供了使用VCG读取Mesh的方式,接下来就需要针对读取的网格数据进行一些渲染操作了。在绘制Mesh数据时总会遇到图形的抗锯齿问题,OpenGL本身已经为我们提供了一种MSAA技术,但该技术对于一些实时渲染性能有…

CloudCanal x Redis 数据同步指令集丰富与细节优化

简述 CloudCanal 前一段时间支持了 Redis 到 Redis 数据迁移同步能力&#xff0c;并支持其双向同步&#xff0c;但是支持的指令种类有限。 随着用户使用&#xff0c;指令支持不全面成为一个比较大的问题&#xff0c;所以最近的版本&#xff0c;我们对此能力&#xff0c;结合用…

粉丝投稿:从写下第1个脚本到年薪20W,我的自动化测试心路历程

我希望我的故事能够激励现在的软件测试人&#xff0c;尤其是还坚持在做“点点点”的测试人。 你可能会有疑问&#xff1a;“我也能做到这一点的可能性有多大&#xff1f;”因此&#xff0c;我会尽量把自己做决定和思考的过程讲得更具体一些&#xff0c;并尽量体现更多细节。 每…

RT_Thread 调试笔记:串口打印、MSH控制台 相关

说明&#xff1a;记录日常使用 RT_Thread 开发时做的笔记。 持续更新中&#xff0c;欢迎收藏。 1.打印相关 1.打印宏定义&#xff0c;可以打印打印所在文件&#xff0c;函数&#xff0c;行数。 #define PRINT_TRACE() printf("-------%s:%s:%d------\r\n", __FIL…

Python笔记01-基础概念、数据类型及字符串格式化

文章目录 字面量注释变量数据类型标识符运算符字符串数据输入 字面量 在代码中&#xff0c;被写下来的固定的值&#xff0c;称之为字面量 Python中常用的有6种值&#xff08;数据&#xff09;的类型 如下变量被直接写在程序中&#xff0c;称之为字面量包括 数字和字符串类型 …

性能优化-OpenMP基础教程(三)

本文主要介绍OpenMP并行编程的环境变量和实战、主要对比理解嵌套并行的效果。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &…

万众期盼的剪辑新功能来了 会声会影2024旗舰版焕新登场

会声会影2024全新升级来袭&#xff0c;Corel公司这次为用户带来了多项功能更新&#xff0c;软件风格整体更偏向于“轻松剪辑&#xff0c;快速出片”。会声会影的本次更新还是很令人惊喜的&#xff0c;在各种人工智能算法的加持下&#xff0c;用户只需要进行几步简单地设置&…

数据结构——堆排序

什么是堆排序 堆排序就是利用堆&#xff08;假设利用大堆&#xff09;进行排序的算法。他的基本思想是&#xff0c;将待排序的序列构造成一个大顶堆。此时&#xff0c;整个序列的最大值就是堆顶的根节点。将他移走&#xff08;其实就是将其与堆数组的末尾元素交换&#xff0c;…

transforms图像增强(二)

一、图像变换 1、transforms.Pad transforms.Pad是一个用于对图像边缘进行填充的数据转换操作。 参数&#xff1a; padding&#xff1a;设置填充大小。可以是单个整数&#xff0c;表示在上下左右四个方向上均填充相同数量的像素&#xff1b;也可以是一个包含两个整数的元组…

PEFT: 在低资源硬件上对十亿规模模型进行参数高效微调

1 引言 最近&#xff0c;深度学习的研究中出现了许多大型预训练模型&#xff0c;例如 GPT-3、BERT 等&#xff0c;这些模型可以在多种自然语言处理任务中取得优异的性能表现。而其中&#xff0c;ChatGPT 模型因为在对话生成方面的表现而备受瞩目&#xff0c;成为了自然语言处理…

webgl调试之排查内存泄漏

内存泄漏自然而然是要看内存是不是涨了 然后我们如何确认泄露了呢&#xff0c;我们需要把代码梳理清楚&#xff0c;知道哪个时机&#xff0c;在delete&#xff0c;在create&#xff0c;那么这个时候&#xff0c;按道理&#xff0c;delete了n个对象&#xff0c;create了N个对象&…

Python从入门到网络爬虫(MySQL链接)

前言 在实际数据分析和建模过程中&#xff0c;我们通常需要从数据库中读取数据&#xff0c;并将其转化为 Pandas dataframe 对象进行进一步处理。而 MySQL 数据库是最常用的关系型数据库之一&#xff0c;因此在 Python 中如何连接 MySQL 数据库并查询数据成为了一个重要的问题…