Java 中 Spring Boot 框架下的 Email 开发

Email 开发

1. 核心依赖

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

hutool工具包:

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.11</version>
</dependency>

2. 邮件实体类

  • 这个类更贴近我们的常见信息,用这个去构造邮箱框架的指定邮件类的构造。
@Data
public class EmailMessage implements Serializable {private String sender;String[] recipient;String[] carbonCopy;private String title;private String content;private Date createTime;private static final long serialVersionUID = 1L;public void setRecipient(String... recipient) {this.recipient = recipient;}public void setCarbonCopy(String... cc) {this.carbonCopy = cc;}public void setRecipient(@NonNull String recipient) {this.recipient = new String[]{recipient};}public void setCarbonCopy(@NonNull String cc) {this.carbonCopy = new String[]{cc};}public String[] getRecipient() {return recipient;}public String[] getCarbonCopy() {return carbonCopy;}public String getRecipient(int i) {return recipient != null ? recipient[i] : null;}public String getCarbonCopy(int i) {return carbonCopy != null ? carbonCopy[i] : null;}}

邮箱格式检查:

public class EmailValidator {public static final String EMAIL_PATTERN = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$";public static boolean isEmailAccessible(String email) {return email.matches(EMAIL_PATTERN);}}

3. 配置

spring:mail:host: # 邮箱服务器地址(不填会无法启动成功)port: # 邮箱服务器端口username: # 发起者的邮箱地址password: # 密码(是调用邮箱接口的授权密码,不是邮箱账户密码)default-encoding: utf-8properties:mail:smtp:socketFactory:class: javax.net.ssl.SSLSocketFactory

以 yeah.net 邮箱为例(其他的邮箱也会有,举一反三)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

根据指导即可,获得授权密码!

以smtp为例:

  • 这个就是host,可以查一下,port是465(其他的服务器 port是啥,一查便知)

在这里插入图片描述

4. 发送邮件(都是可群发的)

@Component
@Slf4j
@RequiredArgsConstructor
public class EmailSender {private final JavaMailSender javaMailSender;private final TemplateEngine templateEngine;public SimpleMailMessage emailToSimpleMailMessage(EmailMessage emailMessage) {SimpleMailMessage simpleMailMessage = new SimpleMailMessage();simpleMailMessage.setFrom(emailMessage.getSender());simpleMailMessage.setTo(emailMessage.getRecipient());simpleMailMessage.setCc(emailMessage.getCarbonCopy());simpleMailMessage.setSubject(emailMessage.getTitle());simpleMailMessage.setText(emailMessage.getContent());return simpleMailMessage;}public MimeMessageHelper emailIntoMimeMessageByHelper(MimeMessage mimeMessage, EmailMessage emailMessage) {try {MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);mimeMessageHelper.setFrom(emailMessage.getSender());mimeMessageHelper.setCc(emailMessage.getCarbonCopy());mimeMessageHelper.setSubject(emailMessage.getTitle());mimeMessageHelper.setTo(emailMessage.getRecipient());return mimeMessageHelper;} catch (MessagingException e) {throw new RuntimeException(e);}}
}

4.1 发送普通邮件(纯文本)

public void sendSimpleMailMessage(EmailMessage emailMessage) {if (Objects.isNull(emailMessage)) {throw new RuntimeException("email不能为null!");}// 封装simpleMailMessage对象SimpleMailMessage simpleMailMessage = emailToSimpleMailMessage(emailMessage);// 发送javaMailSender.send(simpleMailMessage);
}

4.2 发送邮件待附件

public void sendMailWithFile(EmailMessage emailMessage, File... files) {if (Objects.isNull(emailMessage)) {throw new RuntimeException("email不能为null!");}// 封装对象try {MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper mimeMessageHelper = emailIntoMimeMessageByHelper(mimeMessage, emailMessage);// 添加附件for (File file : files) {if (Objects.nonNull(file)) {mimeMessageHelper.addAttachment(file.getName(), file);}}mimeMessageHelper.setText(emailMessage.getContent(), false);javaMailSender.send(mimeMessage);} catch (MessagingException e) {throw new RuntimeException(e);}
}

4.3 发送模板邮件

public void sendModelMail(EmailMessage emailMessage, String template, Object modelMessage) {if (Objects.isNull(emailMessage)) {throw new RuntimeException("email不能为null!");}// 封装对象try {MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper mimeMessageHelper = emailIntoMimeMessageByHelper(mimeMessage, emailMessage);// 构造模板消息Context context = new Context();context.setVariables(BeanUtil.beanToMap(modelMessage));//合并模板与数据String content = templateEngine.process(template, context);mimeMessageHelper.setText(content, true);javaMailSender.send(mimeMessage);} catch (MessagingException e) {throw new RuntimeException(e);}
}

其中,template是模板html的路径,以类路径(resources)下的templates包为根目录!

在这里插入图片描述

邮件显示的一些对html语法的兼容问题,可以参考文章:HTML邮件 兼容问题_foxmail对html样式支持不好-CSDN博客

一个模板html例子:

  • 经典的邮箱验证登录
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>邮箱验证</title></head><body><span>&nbsp;下面是您的身份验证码:</span><br /><font style="font-size: 50pt">&nbsp;<span th:text="${code}"></span></font><br /><span>&nbsp;请在&nbsp;</span><font style="font-size: 20pt; color: brown"><span th:text="${minutes}"></span></font><span>&nbsp;分钟内完成验证,如非本人操作,请忽略!</span></body>
</html>

在这里插入图片描述

原理:将传入的Map的键值对,替换到html里

在这里插入图片描述

4.4 发送模板邮件带附件

public void sendModelMailWithFile(EmailMessage emailMessage, String template, Object modelMessage, File... files) {if (Objects.isNull(emailMessage)) {throw new RuntimeException("email不能为null!");}// 封装对象try {MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper mimeMessageHelper = emailIntoMimeMessageByHelper(mimeMessage, emailMessage);// 构造模板消息Context context = new Context();context.setVariables(BeanUtil.beanToMap(modelMessage));//合并模板与数据String content = templateEngine.process(template, context);mimeMessageHelper.setText(content, true);// 添加附件for (File file : files) {if (Objects.nonNull(file)) {mimeMessageHelper.addAttachment(file.getName(), file);}}javaMailSender.send(mimeMessage);} catch (MessagingException e) {throw new RuntimeException(e);}
}

4.5 根据收件人自定义发送模板邮件并且带附件

public <T, R> void customizedSendEmail(EmailMessage emailMessage, String template, Function<T, R> function, File... files) {if (Objects.isNull(emailMessage)) {throw new RuntimeException("email不能为null!");}String sender = emailMessage.getSender();String[] carbonCopy = emailMessage.getCarbonCopy();String title = emailMessage.getTitle();Arrays.stream(emailMessage.getRecipient()).parallel().distinct().forEach(s -> {try {// 封装对象MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);mimeMessageHelper.setTo(s);mimeMessageHelper.setFrom(sender);mimeMessageHelper.setCc(carbonCopy);mimeMessageHelper.setSubject(title);// 添加附件for (File file : files) {if (Objects.nonNull(file)) {mimeMessageHelper.addAttachment(file.getName(), file);}}// 构造模板消息Context context = new Context();Object modelMessage = function.apply((T) s);context.setVariables(BeanUtil.beanToMap(modelMessage));//合并模板与数据String content = templateEngine.process(template, context);// 通过mimeMessageHelper设置到mimeMessage里mimeMessageHelper.setText(content, true);//发送javaMailSender.send(mimeMessage);} catch (MessagingException e) {throw new RuntimeException(e);}});
}

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

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

相关文章

计算机服务器中了helper勒索病毒怎么办,helper勒索病毒解密流程步骤

随着网络技术在企业中的不断应用&#xff0c;越来越多的企业离不开网络&#xff0c;网络为企业提供了极大便利&#xff0c;大大提升了生产运营效率&#xff0c;由此而产生的网络数据安全问题也成为了企业关心的主要话题。近期&#xff0c;云天数据恢复中心接到多家企业的求助&a…

webrtcP2P通话流程

webrtcP2P通话流程 在这里&#xff0c;stun服务器包括stun服务和turn转发服务。信令服服务还包括im等功能 webrtc多对多 mesh方案 适合人数较少的场景 webrtc多对多 mcu方案 &#xff08;multipoint control point&#xff09;将上行的视频/音频合成&#xff0c;然后分发。…

StarRocks使用Minio备份和还原

1.安装minio Centos7安装minio-CSDN博客 minio api端口&#xff1a;9090 下文用到这个端口 必须提前创建好桶: packfdv5 名称自定义和后面对上就可以 2.创建备份仓库 格式&#xff1a; CREATE REPOSITORY <repository_name> WITH BROKER ON LOCATION "s3a:/…

编程生活day6--回文子串、蛇形填充数组、笨小猴、单词排序

回文子串 题目描述 给定一个字符串&#xff0c;输出所有长度至少为2的回文子串。 回文子串即从左往右输出和从右往左输出结果是一样的字符串&#xff0c;比如&#xff1a;abba&#xff0c;cccdeedccc都是回文字符串。 输入 一个字符串&#xff0c;由字母或数字组成。长度5…

【深度学习】深度学习md笔记总结第3篇:TensorFlow介绍,学习目标【附代码文档】

深度学习笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;深度学习课程&#xff0c;深度学习介绍要求,目标,学习目标,1.1.1 区别,学习目标,学习目标。TensorFlow介绍&#xff0c;2.4 张量学习目标,2.4.1 张量(Tensor),2.4.2 创建张量的指令,2.4.3 张量…

支付类漏洞挖掘技巧总结

前言&#xff1a; 支付类逻辑漏洞在漏洞挖掘中是常常出现的问题之一。此类漏洞挖掘思路多&#xff0c;奖励高&#xff0c;是炙手可热的漏洞。此篇文章主要围绕挖掘支付逻辑漏洞时的一些思路分享。 支付逻辑漏洞成因&#xff1a; 支付漏洞可能由以下原因造成&#xff1a; 前…

栈的应用——用栈实现算数混合运算表达式的计算

1、单目运算符双目运算符 算数运算符分为单目运算符和双目运算符等 单目运算符只需要一个操作数,双目运算符需要两个操作数 双目运算符最常见:常见的算术运算符:*/,比较运算符:<>=等等以下是一些单目运算符:正号 (+): 用于表示正数或给数值一个正号。例如:+5 仍然…

【微服务】------核心组件架构选型

1.微服务简介 微服务架构&#xff08;Microservice Architecture&#xff09;是一种架构概念&#xff0c;旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦&#xff0c;从而降低系统的耦合性&#xff0c;并提供更加灵活的服务支持。 2.微服务技术选型 区域内容…

文件批量重命名,一键删除文件夹名中相同文字,高效管理文件

在信息爆炸的时代&#xff0c;我们每天都在与大量的文件和文件夹打交道。有时&#xff0c;我们会发现文件夹的名字中包含了不必要的、重复的文字&#xff0c;这不仅使文件组织显得混乱&#xff0c;而且在查找和管理文件时也会带来不便。有没有一种方法可以快速、高效地删除这些…

ABAP SHIFT-字符串移位 和 CONDENSE去除空格

文章目录 SHIFT-字符串移位 和 CONDENSE去除空格SHIFT BY n PLACES RIGHT/LEFT运行结果 SHIFT ... UP TO ...运行结果 其他的-变量后面加括号和数字SHIFT c LEFT/RIGHT DELETING运行结果 SHIFT 去除0示例程序1运行结果示例程序2运行结果 CONDENSE示例程序运行结果 SHIFT-字符串…

layui框架实战案例(26):layui-carousel轮播组件添加多个Echarts图标的效果

在Layui中&#xff0c;使用layui-carousel轮播组件嵌套Echarts图表来实现多个图表的展示。 css层叠样式表 调整轮播图背景色为白色&#xff1b;调整当个Echarts图表显示loading…状态&#xff1b;同一个DIV轮播项目添加多个Echarts的 .layui-carousel {background-color: #f…

聚合DNS管理系统v1.0全新发布 域名解析管理系统

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户&…