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

javaMailSender 发送邮件,基于Spring Boot

目录

引入依赖

配置文件配置

具体代码

MultipartFile 转 File 工具类


引入依赖

        <!--邮件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><!--日志--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version><scope>test</scope></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><!--工具集--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.12</version></dependency>

配置文件配置

spring:servlet:multipart:max-file-size:  10MBmax-request-size: 50MBmail:host: #填写邮箱服务器地址port: 465 #服务器端口username: #发件人邮箱号password: #邮箱登录密码,或授权码default-encoding: utf-8protocol: smtp #邮件协议test-connection: trueproperties:mail:
#        是否发送正文mime:multipart:allowempty: truesmtp:ssl:enable: truestarttls:enable: truerequired: true
#          connectiontimeout: 10000 #建立连接时间限制
#          timeout: 10000 #邮件接收时间限制
#          wridtetimeout: 10000 #邮件发送时间限制auth: true

具体代码

@Service
public class MailService {private Logger logger = LoggerFactory.getLogger(getClass());//提供日志类@Autowiredprivate JavaMailSenderImpl javaMailSender;/*public JavaMailSenderImpl createJavaMailSender(JavaMailSenderImpl javaMailSender) { //依赖注入报红线时可以试试,不管也可以用return this.javaMailSender = new JavaMailSenderImpl();}*/public boolean sendMail(Mail mail) {try {/*没有传入发件人,设置默认*/if (StrUtil.isEmpty(mail.getFrom()))mail.setFrom("邮箱号");/*    邮箱号为这种形式时可用该方法,获取别名和邮箱号mail.setFrom("\"别名\" <邮箱号>");InternetAddress internetAddress = new InternetAddress(mail.getFrom());邮箱号                        别名mimeMessageHelper.setFrom(internetAddress.getAddress(), internetAddress.getPersonal());*//*没有发件人或收件人*/if (StrUtil.isEmpty(mail.getFrom()) || StrUtil.isEmpty(mail.getTo()))return false;/*创建邮件*/MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);//true:识别html格式/*发件人*/mimeMessageHelper.setFrom(mail.getFrom());/*收件人*/if (mail.getTo().contains(",") || mail.getTo().contains(",")) {String[] split = null;/*判断收件人邮箱号并拆分*/if (mail.getTo().contains(","))split = mail.getTo().split(",");if (mail.getTo().contains(","))split = mail.getTo().split(",");/*放入 InternetAddress 类型的list*/ArrayList<InternetAddress> list = new ArrayList<>();for (Iterator<String> iterator = Arrays.stream(split).iterator(); iterator.hasNext(); ) {list.add(new InternetAddress(iterator.next()));}/*转 InternetAddress 数组*/InternetAddress[] addresses = list.toArray(new InternetAddress[list.size()]);mimeMessageHelper.setTo(addresses);} elsemimeMessageHelper.setTo(mail.getTo());/*发送时间*/mimeMessageHelper.setSentDate(new Date());/*主题*/mimeMessageHelper.setSubject(mail.getSubject());/*正文*/if (mail.getFiles() != null) {/*正文包含图片*/int i = 0;for (MultipartFile multipartFile : mail.getFiles()) {++i;mimeMessageHelper.setText(mail.getText() + "<div><img src='cid:" + i + "'/></div>", true);File file = multipartFileToFile.multipartFileToFiles(multipartFile);/* MultipartFile 转 File */mimeMessageHelper.addInline(StrUtil.toString(i), new FileSystemResource(file));}} elsemimeMessageHelper.setText(mail.getText());/*正文需发送html时*//*String property = System.getProperty("user.dir");//获取当前项目路径SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日");String time = simpleDateFormat.format(System.currentTimeMillis());StringBuffer stringBuffer = new StringBuffer();stringBuffer.append("<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><title>邮件正文模板</title></head><body>\n" +"<div style=\"margin:0 auto;width:700px;height:500px\">\n" +"<img src=\"cid:background.jpg\" style=\"width: 700px;\"/>\n" +"<div style=\"margin:-600px 80px 0 170px;font-size:20px;\">\n" +"<p style=\"color:mediumvioletred;\">周星星:</p>\n" +"<p style=\"color:deeppink;\">\n" +"人生的成功有千百种,您用劳动书写光荣,您用真情善待家人!今天是您的生日,请把心放松,静静地聆听我们的祝福:快乐、健康、幸福。\n" +"</p>\n" +"<p id=\"date\" style=\"text-align:right;margin-right: 100px\">" + time + "</p>\n" +"</div>\n" +"</div>\n" +"</body></html>");mimeMessageHelper.setText(stringBuffer.toString(), true);mimeMessageHelper.addInline("background.jpg", new File(property + "/src/main/resources/img/background.jpg"));*//*附件*/if (mail.getMultipartFiles() != null) {for (MultipartFile multipartFile : mail.getMultipartFiles()) {mimeMessageHelper.addAttachment(multipartFile.getOriginalFilename(), multipartFile);}}/*发送*/javaMailSender.send(mimeMessage);logger.info("发送成功:{}--->{}", mail.getFrom(), mail.getTo());return true;} catch (Exception e) {e.printStackTrace();logger.debug("发送失败:{}--->{}", mail.getFrom(), mail.getTo());return false;}}
}

MultipartFile 转 File 工具类

import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;@Component
public class MultipartFileToFile {/*** MultipartFile 转 File** @param file* @throws Exception*/public File multipartFileToFiles(MultipartFile file) throws Exception {File toFile = null;if (file.equals("") || file.getSize() <= 0) {file = null;} else {InputStream ins = null;ins = file.getInputStream();toFile = new File(file.getOriginalFilename());inputStreamToFile(ins, toFile);ins.close();}return toFile;}//获取流文件private void inputStreamToFile(InputStream ins, File file) {try {OutputStream os = new FileOutputStream(file);int bytesRead = 0;byte[] buffer = new byte[8192];while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {os.write(buffer, 0, bytesRead);}os.close();ins.close();} catch (Exception e) {e.printStackTrace();}}/*** 删除本地临时文件** @param file*/public void delteTempFile(File file) {if (file != null) {File del = new File(file.toURI());del.delete();}}}

                                                                Cheung Kwok Wing 随笔

相关文章:

javaMailSender 发送邮件,基于Spring Boot

目录 引入依赖 配置文件配置 具体代码 MultipartFile 转 File 工具类 引入依赖 <!--邮件--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><!--日…...

【汇总】解决Spring-Web与Spring-WebFlux冲突

【汇总】解决Spring-Web与Spring-WebFlux冲突 问题发现问题解决问题一&#xff1a;The bean requestMappingHandlerMapping, defined in class path resource [org/springframework/web/reactive/config/DelegatingWebFluxConfiguration.class],问题二&#xff1a;The Java/XML…...

maven 依赖配置补充

依赖配置补充 依赖范围 import 管理依赖最基本的办法是继承父工程&#xff0c;但是和 Java 类一样&#xff0c;Maven 也是单继承的。如果不同体系的依赖信息封装在不同 POM 中了&#xff0c;没办法继承多个父工程怎么办&#xff1f;这时就可以使用 import 依赖范围。 典型案…...

Pandas ------ 向 Excel 文件中写入含有合并表头的数据

Pandas ------ 向 Excel 文件中写入含有合并表头的数据 推荐阅读引言正文 推荐阅读 Pandas ------ 向 Excel 文件中写入含有 multi-index 和 Multi-column 表头的数据 引言 这里给大家介绍一下如何向 Excel 中写入带有合并表头的数据。 正文 import pandas as pddf1 pd.D…...

kafka summary

最近整体梳理之前用到的一些东西&#xff0c;回顾Kafka的时候好多东西都忘记了&#xff0c;把一些自己记的比较模糊并且感觉有用的东西整理一遍并且记忆一遍&#xff0c;仅用于记录以备后续回顾 Kafka的哪些场景中使用了零拷贝 生产者发送消息&#xff1a;在 Kafka 生产者发送…...

【新书推荐】2.6节 原码、反码和补码

回顾上一节中&#xff0c;我们讲解了整数的编码规则。 无符号整数编码规则&#xff1a;无符号整数全部都是正数&#xff0c;是什么就存什么。 有符号整数编码规则&#xff1a;有符号整数最高有效位为0是正数&#xff0c;最高有效位为1是负数。 本节内容&#xff1a;原码、反…...

docker 网络及如何资源(CPU/内存/磁盘)控制

安装Docker时&#xff0c;它会自动创建三个网络&#xff0c;bridge&#xff08;创建容器默认连接到此网络&#xff09;、 none 、host docker网络模式 Host 容器与宿主机共享网络namespace&#xff0c;即容器和宿主机使用同一个IP、端口范围&#xff08;容器与宿主机或其他使…...

安装 nvm

前言&#xff1a; nvm 即 node 版本管理工具 (node version manager)&#xff0c;好处是方便切换 node.js 版本。 通过将多个 node 版本安装在指定路径&#xff0c;然后通过 nvm 命令切换时&#xff0c;就会切换我们环境变量中 node 命令指定的实际执行的软件路径。 使用场景…...

Redis解决方案:NOAUTH Authentication required(连接jedis绑定密码或修改redis密码)

Redis解决方案&#xff1a;NOAUTH Authentication required&#xff08;连接jedis绑定密码或修改redis密码&#xff09; Java使用jedis连接redis时出现错误NOAUTH Authentication required 一、问题报错和原因 本地设置了redis的密码&#xff0c;但在远程连接时并没有输入密…...

多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现WOA-TCN-Multihead-Attention鲸鱼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效…...

如何实现无公网IP实现远程访问MongoDB文件数据库

&#x1f4d1;前言 本文主要是如何实现无公网IP实现远程访问MongoDB文件数据库的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x…...

华为防火墙USG6000V1的NAT实验

实验拓扑&#xff1a; 之前实验做过&#xff0c;可以翻找之前的博客&#xff0c;各设备ip和接口已配好&#xff0c;均可可ping通防火墙。 实验要求&#xff1a; 一.生产区在工作时间内可以访问dmz区域&#xff0c;仅可以访问http服务器。 二.办公区全天可以访问dmz区域&…...

spark-flink设计思想之吸星大法-1

Spark和Flink都是大数据处理框架&#xff0c;它们的设计思想有一些不同之处。以下是对它们设计思想的简要对比&#xff1a; 数据模型和计算模型&#xff1a; Spark&#xff1a;Spark使用弹性分布式数据集&#xff08;RDD&#xff09;作为其核心数据结构。RDD是只读的、不可变的…...

力扣1312. 让字符串成为回文串的最少插入次数

动态规划 思路&#xff1a; 通过插入字符构造回文串&#xff0c;要想插入次数最少&#xff0c;可以将字符串 s 的逆序 s 进行比较找出最长公共子序列&#xff1b;可以先分析&#xff0c;字符串 s 通过插入得到回文串 ps&#xff0c;其中间的字符应该不会变化&#xff1a; 若 s…...

qemu的安装

1、简介 QEMU&#xff08;Quick EMUlator&#xff09;是一个开源的处理器模拟器&#xff0c;它可以在一种硬件平台上模拟另一种硬件平台&#xff0c;从而运行各种不同的操作系统。QEMU通过动态二进制翻译来实现高性能的模拟&#xff0c;这使得它可以在接近原生性能的速度下运行…...

myql入门

目录 安装修改密码学习资料个人git仓库文章视频官网 安装 #移除以前的mysql相关 sudo apt remove --purge mysql-\* #安装mysql sudo apt install mysql-server mysql-client #查看是否启动 systemctl status mysql #手动启动 systemctl start mysql #查看mysql版本 mysql --v…...

前端开发有没有必要转鸿蒙开发?

前端开发有没有必要转鸿蒙开发&#xff1f;如果后面的工作中有参与鸿蒙开发的机会&#xff0c;那肯定是转呀&#xff01;毕竟多接触一些技能也不会有什么坏处。 我想说的是&#xff1a;鸿蒙替代不了前端&#xff0c;如果你目前正在从事前端开发&#xff0c;那么你完全可以将鸿蒙…...

《动手学深度学习(PyTorch版)》笔记1

Chapter1 Introduction 1.1 机器学习的关键组件 data 每个数据集由一个个样本&#xff08;example, sample&#xff09;组成&#xff0c;大多时候&#xff0c;它们遵循独立同分布(independently and identically distributed, i.i.d.)。 样本有时也叫做数据点&#xff08;dat…...

前端工程化之:webpack1-5(配置文件)

一、配置文件 webpack 提供的 cli 支持很多的参数&#xff0c;例如 --mode &#xff0c;但更多的时候&#xff0c;我们会使用更加灵活的配置文件来控制 webpack 的行为。 默认情况下&#xff0c; webpack 会读取 webpack.config.js 文件作为配置文件&#xff0c;但也可以通过 C…...

代码随想录栈和队列专题二刷复盘day17

栈和队列理论基础 队列是先进先出&#xff0c;栈是先进后出 栈和队列是STL里面的两个数据结构 三个最为普遍的STL版本 1.HP STL其他版本的C STL&#xff0c;一般是以HP STL为蓝本实现出来的&#xff0c;HP STL是C STL的第一个实现版本&#xff0c;且开放源代码 2.P.J.Plauger…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...