SpringBoot+Email发送邮件

引言

邮件通知是现代应用中常见的一种通信方式,特别是在需要及时反馈、告警或重要事件通知的场景下。Spring Boot提供了简单而强大的邮件发送功能,使得实现邮件通知变得轻而易举。本文将研究如何在Spring Boot中使用JavaMailSender实现邮件发送,以构建一个可靠的通知体系。

使用场景举例:

  1. 注册验证:在用户注册各种账户时,通过邮件发送验证码进行身份确认和账户激活。
  2. 网站营销:向潜在客户或已有用户发送营销信息或者广告邮件。
  3. 身份安全验证:在用户修改密码、解锁账户等关键操作时,通过邮件发送安全验证码来增强账户的安全性。
  4. 普通文本邮件、HTML内容板式邮件、包含静态资源邮件以及带附件邮件的发送:可以满足不同类型邮件的发送需求。

步骤一:引入邮件发送依赖

在Spring Boot项目的pom.xml文件中引入邮件发送所需的依赖:

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

步骤二:配置邮件发送参数

application.propertiesapplication.yml中配置邮件发送的相关参数,包括邮件服务器主机、端口、账户信息等:

spring:mail:host: smtp.163.comusername: *****@163.compassword: *****port: 25

步骤三:创建邮件发送服务

创建一个邮件发送的服务类,使用JavaMailSender进行邮件发送:

public interface SendMailService {public String sendSimpleMail(String address, String subject, String body);public String sendAttachmentMail(String address, String subject, String body, MultipartFile attach) throws MessagingException, IOException;
}
@Service
public class SendMailServiceImpl implements SendMailService {@Autowiredprivate JavaMailSender javaMailSender;@Value("${spring.mail.username}")private String account;/*** @param address 收件地址* @param subject 标题* @param body    正文* @return*/@Overridepublic String sendSimpleMail(String address, String subject, String body) {SimpleMailMessage smm = new SimpleMailMessage();smm.setFrom(account);smm.setTo(address);smm.setSubject(subject);smm.setText(body);javaMailSender.send(smm);return "发送成功";}/*** @param address 收件地址* @param subject 标题* @param body    正文* @param attach  附件*/@Overridepublic String sendAttachmentMail(String address, String subject, String body, MultipartFile attach) throws MessagingException, IOException {MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);mimeMessageHelper.setFrom(account);mimeMessageHelper.setTo(new String[]{address});mimeMessageHelper.setSubject(subject);mimeMessageHelper.setText(body);// 获取附件的文件名和后缀名String fileName = attach.getOriginalFilename();String fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1);// 读取附件内容byte[] bytes = attach.getBytes();// 创建一个新的资源对象来存储附件内容ByteArrayResource attachmentResource = new ByteArrayResource(bytes);// 添加附件,使用完整的文件名(包括后缀名)mimeMessageHelper.addAttachment(fileName, attachmentResource);javaMailSender.send(mimeMailMessage);return "发送成功";}
}

 步骤四:使用邮件发送服务

在需要发送邮件的地方,注入EmailService并调用相应的方法:

@RestController
public class EmailController {@Autowiredprivate SendMailService sendMailService;@RequestMapping("/sendMail")public String sendMail(String address, String subject, String body) {return sendMailService.sendSimpleMail(address, subject, body);}@RequestMapping("/sendMailWithAttachment")public String sendMailWithAttachment(String address, String subject, String body, MultipartFile attach) throws IOException, MessagingException {return sendMailService.sendAttachmentMail(address, subject, body, attach);}
}

测试结果

 

结语

通过本文的介绍,你已经学到了如何在Spring Boot应用中使用JavaMailSender实现邮件发送功能。这个简单而强大的功能可以应用于各种场景,如用户注册、密码重置、异常通知等。通过配置邮件发送参数、创建邮件发送服务和使用邮件发送服务,你可以轻松构建一个可靠的邮件通知体系,为你的应用增加及时的通知和反馈机制。希望这篇博文能够帮助你成功实现Spring Boot中的邮件发送功能。

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

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

相关文章

面试经典150题(85-87)

leetcode 150道题 计划花两个月时候刷完&#xff0c;今天&#xff08;第四十三天&#xff09;完成了3道(85-87)150&#xff1a; 85.&#xff08;77. 组合&#xff09;题目描述&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可…

Unity中URP下的SimpleLit的 Lambert漫反射计算

文章目录 前言一、Lambert漫反射计算11、MixRealtimeAndBakedGI 函数有三个重载2、3号 调用了 2号3、1号调用了 SubtractDirectMainLightFromLightmap函数4、我们重点来看 Lambert漫反射的实现部分5、其余部分 二、Lambert漫反射计算21、LightingLambert 前言 在之前的文章中&…

Python学习之路-Python操作redis

Python学习之路-Python操作redis 前言 在Python中操作Redis可以直接用redis模块 安装 安装Redis的有3种方式https://github.com/andymccurdy/redis-py 第一种&#xff1a;进⼊虚拟环境py_django&#xff0c;联⽹安装包redis pip install redis第二种&#xff1a;进⼊虚拟环…

【VRTK】【Unity】【PICO】PICO项目打包后闪退的根本原因

【背景】 一开始打包运行好好的PICO项目&#xff0c;中途用Preview模式开发了一阵后&#xff0c;再次打包就闪退了。 【分析】 项目设置没有动过&#xff0c;那么可能是Preview开发过程中引入的包导致的问题。 【答案】 千万不要在PICO项目中导入Oculus包。我原本想用一些…

Python小项目:还在为备份烦恼?这个tkinter项目帮你解决!

文章目录 1 引言2 Tkinter概览3 设计备份软件的界面4 文件夹选择逻辑5 备份方案介绍5.1 完全备份5.2 增量备份5.3 镜像备份 完整代码&#xff1a; import tkinter as tk from tkinter import filedialog, messagebox import os import shutil import filecmpdef choose_source(…

MySQL自增主键为何不连续

自增值的存储原理 MyISAM引擎的自增值保存在数据文件中InnoDB引擎的自增值&#xff0c;保存在内存里 MySQL 8.0版本后&#xff0c;才有了“自增值持久化”的能力&#xff0c;实现了“如果发生重启&#xff0c;表的自增值可以恢复为MySQL重启前的值”&#xff0c;具体情况是&am…

Kotlin 解构声明

在一些像 Python 的高级语言中&#xff0c;支持 多返回值的&#xff0c;例如 x, y get_position() 这样操作接收。 而在 Kotlin 中&#xff0c;虽然不支持 多返回值&#xff0c;但有类似的 解构&#xff08;destructure&#xff09; 对象功能&#xff0c;叫做 解构声明。 用…

理解pytorch系列:contiguous是怎么实现的

在PyTorch中&#xff0c;.contiguous()方法的作用是确保张量在内存中是连续存储的。当你对张量执行某些操作&#xff0c;如transpose()、permute()、narrow()、expand()等之后&#xff0c;得到的张量可能不再在内存中连续排列。这些操作通常返回一个张量的视图&#xff0c;它们…

SpringBoot 3.1.7 集成Sentinel

一、背景 我的项目需要引入限流&#xff0c;降级&#xff0c;熔断框架&#xff0c;由于 Spring Cloud 2022.0.4 已经不再支持 Hystrix&#xff0c;Spring Cloud 提供了替代方案&#xff0c;如 Resilience4j&#xff0c;可以使用它来替换 Hystrix。但是网上搜了一下国内Resilie…

Zephyr 学习笔记(一)

概述 Zephyr OS 是一个占用空间小的内核&#xff0c;用于资源受限的嵌入式系统&#xff1a;从简单的嵌入式环境传感器、LED 可穿戴设备到复杂的嵌入式控制器、智能手表和物联网无线应用。 Zephyr 内核支持多种架构&#xff0c;包括&#xff1a; ARCv2 (EM and HS) and ARCv3…

Python进阶(一)名字空间 | 超详细名字空间解析 内置 全局 局部 调试查看

文章目录 1 内置名字空间2 全局名字空间3 局部名字空间4 类名字空间5 调试查看名字空间5.1 查看局部名字空间5.2 查看全局名字空间 在Python中&#xff0c;名字空间&#xff08;Namespace&#xff09;是一个用于存储变量名称和它们对应的对象值的容器。名字空间可以看作是一个映…

2024年华为OD机试真题-密码输入检测-Python-OD统一考试(C卷)

题目描述: 给定用户密码输入流input,输入流中字符<表示退格,可以清除前一个输入的字符,请你编写程序,输出最终得到的密码字符,并判断密码是否满足如下的密码安全要求。 密码安全要求如下: 1.密码长度>=8; 2.密码至少需要包含1个大写字母; 3.密码至少需要包含1个小…

burp靶场--文件上传

burp靶场–文件上传 https://portswigger.net/web-security/file-upload/lab-file-upload-remote-code-execution-via-web-shell-upload 1.文件上传 1、原理&#xff1a;文件上传漏洞是指Web服务器允许用户将文件上传到其文件系统&#xff0c;而不充分验证文件的名称、类型、…

Midjourney基本使用(极速版)

加入Midjourney社区 首先&#xff0c;我们来创建与Midjourney交互的环境 因为需要利用discord与Midjourney进行交互 因为Midjourney没有自己的网站没有自己的服务器 完全依赖discord作为Midjourney的前端&#xff0c;通过discord&#xff0c;用户才能方便快捷的与Midjourney进行…

《WebKit 技术内幕》之七(2): 渲染基础

2 网页层次和RenderLayer树 2.1 层次和RenderLayer对象 前面章节介绍了网页的层次结构&#xff0c;也就是说网页是可以分层的&#xff0c;这有两点原因&#xff0c;一是为了方便网页开发者开发网页并设置网页的层次&#xff0c;二是为了WebKit处理上的便利&#xff0c;也就是…

Circles of Waiting洛谷黑题题解

Circles of Waiting 题面翻译 在平面直角坐标系上&#xff0c;有一个神奇的点&#xff0c;一开始在 ( 0 , 0 ) (0, 0) (0,0) 。每秒钟这个点都会随机移动&#xff1a;如果它在 ( x , y ) (x, y) (x,y) &#xff0c;下一秒它在 ( x − 1 , y ) (x - 1, y) (x−1,y) 的概率是…

在WIN从零开始在QMUE上添加一块自己的开发板(二)

文章目录 一、前言往期回顾 二、CPU虚拟化&#xff08;一&#xff09;相关源码&#xff08;二&#xff09;举个例子&#xff08;三&#xff09;测试 三、内存虚拟化&#xff08;一&#xff09;相关源码&#xff08;二&#xff09;举个例子测试 参考资料 一、前言 笔者这篇博客…

力扣日记1.21-【回溯算法篇】77. 组合

力扣日记&#xff1a;【回溯算法篇】77. 组合 日期&#xff1a;2023.1.21 参考&#xff1a;代码随想录、力扣 终于结束二叉树了&#xff01;听说回溯篇也是个大头&#xff0c;不知道这一篇得持续多久了…… 77. 组合 题目描述 难度&#xff1a;中等 给定两个整数 n 和 k&#…

LSTM时间序列预测

本文借鉴了数学建模清风老师的课件与思路&#xff0c;可以点击查看链接查看清风老师视频讲解&#xff1a;【1】演示&#xff1a;基于LSTM深度学习网络预测时间序列&#xff08;MATLAB工具箱&#xff09;_哔哩哔哩_bilibili % Forecast of time series based on LSTM deep learn…

敏捷测试和DevOpes自动化测试的区别

敏捷测试和DevOps自动化测试在以下方面存在区别&#x1f447; 1️⃣目标 &#x1f388;敏捷测试的主要目标是提供快速的反馈和持续的改进&#xff0c;以便在开发过程中尽早发现和解决问题&#xff0c;从而提高软件的质量和可靠性。 &#x1f308;DevOps自动化测试的目标是提高软…