最近因为业务须要,须要使用邮件对用户进行通知,可是单个邮箱有发送限制,当推送量过多时,常常会出现失败,因而考虑使用多个邮箱进行发送,因为spring-boot-starter-mail
不支持同时配置多个邮件源,因此决定本身动手实现。java
spring-boot-starter-mail
会根据spring.mail.xxx
相关配置对JavaMailSender
进行自动配置。可是只支持单个邮箱。为了实现多邮件源,能够参照上述逻辑。在配置文件内配置好,多个邮件源。而后读取配置文件,手动对JavaMailSender
进行配置,并将其初始化完毕的JavaMailSender
存储容器内。而后发送时随机取出JavaMailSender
进行发送。spring
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
替换实际的邮件配置数据库
# 配置邮件 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
@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; } }
@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(); } }
public interface MailService { /** * 发送邮件 * @return 返回 true 或者 false */ boolean sendMail(); }
@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(); } }
上述是将邮箱配置写入配置文件,在没有使用配置中心的状况下,若是邮箱源被限制,更改起来相对麻烦。能够将配置存入数据库,在启动的时候从数据库进行加载。若是邮箱源发生更改,可直接更改数据库邮箱源配置,而后调用MailSenderConfig.clear()
方法,等待下次发送的时候,会从新初始化配置。api
若是以为对你有帮助,能够多多评论,多多点赞哦,也能够到个人主页看看,说不定有你喜欢的文章,也能够随手点个关注哦,谢谢。dom
我是不同的科技宅,天天进步一点点,体验不同的生活。咱们下期见!ide