SpringBoot多邮件源发送邮件
时间:2022-07-25
本文章向大家介绍SpringBoot多邮件源发送邮件,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
最近由于业务需要,需要使用邮件对用户进行通知,但是单个邮箱有发送限制,当推送量过多时,经常会出现失败,于是考虑使用多个邮箱进行发送,由于spring-boot-starter-mail
不支持同时配置多个邮件源,所以决定自己动手实现。
实现思路
spring-boot-starter-mail
会根据spring.mail.xxx
相关配置对JavaMailSender
进行自动配置。但是只支持单个邮箱。为了实现多邮件源,可以参照上述逻辑。在配置文件内配置好,多个邮件源。然后读取配置文件,手动对JavaMailSender
进行配置,并将其初始化完毕的JavaMailSender
存储容器内。然后发送时随机取出JavaMailSender
进行发送。
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
邮件yml配置
替换实际的邮件配置
# 配置邮件
mail:
configs:
# 账号
- username: fapiao@QQ.com
password: 123456
host: smtp.qq.com
port: 25
protocol: smtp
default-encoding: UTF-8
# 账号A
- username: fapiaoa@QQ.com
password: 123456
host: smtp.qq.com
port: 25
protocol: smtp
default-encoding: UTF-8
MailConfig
@Data
@Component
@ConfigurationProperties(prefix = "mail")
public class MailConfig {
private List<MailProperties> configs;
@Data
public static class MailProperties {
/**
* 密码
*/
private String username;
/**
* 密码
*/
private String password;
/**
* host
*/
private String host;
/**
* 端口
*/
private Integer port;
/**
* 协议
*/
private String protocol;
/**
* 默认编码
*/
private String defaultEncoding;
}
}
MailSenderConfig
@Slf4j
@Component
@AllArgsConstructor
public class MailSenderConfig {
private final MailConfig mailConfig;
private final List<JavaMailSenderImpl> senderList;
/**
* 初始化 sender
*/
@PostConstruct
public void buildMailSender(){
List<MailConfig.MailProperties> mailConfigs = mailConfig.getConfigs();
log.info("初始化mailSender");
mailConfigs.forEach(mailProperties -> {
// 邮件发送者
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setDefaultEncoding(mailProperties.getDefaultEncoding());
javaMailSender.setHost(mailProperties.getHost());
javaMailSender.setPort(mailProperties.getPort());
javaMailSender.setProtocol(mailProperties.getProtocol());
javaMailSender.setUsername(mailProperties.getUsername());
javaMailSender.setPassword(mailProperties.getPassword());
// 添加数据
senderList.add(javaMailSender);
});
}
/**
* 获取MailSender
* @return CustomMailSender
*/
public JavaMailSenderImpl getSender(){
if(senderList.isEmpty()){
buildMailSender();
}
// 随机返回一个JavaMailSender
return senderList.get(new Random().nextInt(senderList.size()));
}
/**
* 清理 sender
*/
public void clear(){
senderList.clear();
}
}
MailService
public interface MailService {
/**
* 发送邮件
* @return 返回 true 或者 false
*/
boolean sendMail();
}
MailServiceImpl
@Service
@AllArgsConstructor
public class MailServiceImpl implements MailService {
private final MailSenderConfig senderConfig;
@Override
public boolean sendMail() {
JavaMailSenderImpl mailSender = senderConfig.getSender();
//创建SimpleMailMessage对象
SimpleMailMessage message = new SimpleMailMessage();
//邮件发送人
message.setFrom(Objects.requireNonNull(mailSender.getUsername()));
//邮件接收人
message.setTo("2583174414@qq.com");
//邮件主题
message.setSubject("测试邮件");
//邮件内容
message.setText("测试邮件内容");
//发送邮件
mailSender.send(message);
return true;
}
}
测试
@SpringBootTest
@RunWith(SpringRunner.class)
class MailServiceImplTest {
@Autowired
private MailServiceImpl mailService;
@Test
void sendMail() {
mailService.sendMail();
}
}
测试结果
注意的点
- 需要检查邮箱配置相关协议是否开启。
- 如果使用QQ邮箱进行发送,密码不是邮箱密码,而是授权码。
拓展
上述是将邮箱配置写入配置文件,在没有使用配置中心的情况下,如果邮箱源被限制,更改起来相对麻烦。可以将配置存入数据库,在启动的时候从数据库进行加载。如果邮箱源发生更改,可直接更改数据库邮箱源配置,然后调用MailSenderConfig.clear()
方法,等待下次发送的时候,会重新初始化配置。
结尾
如果觉得对你有帮助,可以多多评论,多多点赞哦,也可以到我的主页看看,说不定有你喜欢的文章,也可以随手点个关注哦,谢谢。
我是不一样的科技宅,每天进步一点点,体验不一样的生活。我们下期见!
- 过滤器第二篇【编码、敏感词、压缩、转义过滤器】
- JSP第二篇【内置对象的介绍、4种属性范围、应用场景】
- Struts2的配置和一个简单的例子
- 监听器第一篇【基本概念、Servlet各个监听器】
- 监听器第二篇【统计网站人数、自定义session扫描器、踢人小案例】
- 通俗易懂的分析如何用Python实现一只小爬虫,爬取拉勾网的职位信息
- JSP第一篇【JSP介绍、工作原理、生命周期、语法、指令、行为】
- 一条执行时间两天半的sql语句简化(r4笔记第62天)
- 05-01总结方法,数组(一维)
- 02 Java类的加载机制
- 权限管理系统
- 03 JVM的垃圾回收机制
- Tomcat就是这么简单
- Servlet第三篇【request和response介绍、response的常见应用】
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Python 基础(二十):sys 模块
- [Oracle 故障处理]记一次Windows监听启动失败
- Python 基础(二十一):argparse 模块
- LeetCode 4 题解
- 操作系统与 CPU 是怎么执行线程的?
- LeetCode 5 题解
- 详细齐全!Docker常用基本命令
- angular浏览器兼容性问题解决方案
- Python 基础(二十二):正则表达式
- Python 进阶(一):多线程
- Python 进阶(二):多进程
- MySQL information_schema详解 EVENTS
- Python 进阶(三):邮件的发送与收取
- MySQL information_schema详解 FILES
- MySQL information_schema详解 GLOBAL_STATUS和SESSION_STATUS