SpringBoot 动态配置邮箱发件人

现在的消息模块少不了邮件发送、短信发送和手机推送的功能。邮件发送的功能历史最为悠久,也算的上烂大街的功能。一般在配置文件中设置好邮箱地址、账号、密码和发件服务器地址后便不会再去改动。可是有的客户却希望人为指定发件人信息。这个需求并不过分,需要解决两个大问题:如何在容器启动成功后重新修改发送邮件的Bean。如何在服务器重启后,发件人依然是更改后的配置信息。这里记录实现的步骤。

需求分析

一)、在未配置邮箱账号时,系统拥有默认的邮箱发件人

二)、重新设置邮箱发件人后,需立即生效

三)、重启服务器后,邮箱发件人依然是更改后的邮箱账号,而非默认发件人

基础的邮箱发送

邮箱发送的功能放在现在变得非常的简单好用,一导二配三发送。?

第一步:导入邮箱依赖包

compile('org.springframework.boot:spring-boot-starter-mail')

第二步:配置发件人邮箱信息

spring:mail:host: smtp.mxhichina.comusername: itdragon@xxpassword: itdragondefault-encoding: utf-8

第三步:发送邮件

@Autowired
lateinit var javaMailSender: JavaMailSenderfun pushMsgEmail(target: String, subject: String, content: String) {if (target.isEmpty() || !Pattern.matches(REG_EMAIL_FORMAT, target)) returnval mailMsg = SimpleMailMessage()mailMsg.setFrom(mailUserName!!)mailMsg.setTo(target)mailMsg.setSubject(subject)mailMsg.setText(content)javaMailSender.send(mailMsg)
}

可配置的邮件发送

这里的可配置值的是配置邮箱的发件人。首先我们要解决第一个问题,JavaMailSender 的Bean对象是在容器启动成功后就已经注入到容器中。如何在容器启动后重新注入新的JavaMailSender 的Bean对象呢?网上找了一些案例,他们都是通过销毁Bean然后再重新创建Bean的方式实现。我有点好奇地是,为什么不直接将新的对象直接赋值从而替换原有的Bean对象?Spring默认是单例模式,从Java内存的角度看,这样做似乎没毛病!如果有不对的地方望不吝赐教?

@Autowired
lateinit var javaMailSender: JavaMailSenderfun configEmail(postMailConfig: PostMailConfig): JavaMailSender {val javaMailSender = JavaMailSenderImpl()javaMailSender.host = postMailConfig.mailHostjavaMailSender.username = postMailConfig.mailUsernamejavaMailSender.password = postMailConfig.mailPasswordval javaMailProperties = Properties()javaMailProperties["mail.smtp.auth"] = truejavaMailProperties["mail.smtp.starttls.enable"] = truejavaMailProperties["mail.smtp.timeout"] = 5000javaMailProperties["mail.smtp.socketFactory.class"] = "javax.net.ssl.SSLSocketFactory"javaMailProperties["mail.smtp.socketFactory.port"] = "465"javaMailProperties["mail.smtp.port"] = "465"javaMailSender.javaMailProperties = javaMailPropertiesthis.javaMailSender = javaMailSenderreturn javaMailSender
}

再来解决第二个问题,服务器重启后,默认情况下依然会重新加载application.yml中的配置信息。这会出现邮箱发件人和实际配置的发件人不匹配的情况。其实这个问题也很好解决,加一个事件监听器,在容器初始化成功后执行,根据之前保存的邮箱信息,重新配置邮箱。当然,我们需要一张表记录当前发件人信息。

// 创建事件监听器
class ApplicationStartup : ApplicationListener<ContextRefreshedEvent> {override fun onApplicationEvent(contextRefreshedEvent: ContextRefreshedEvent) {val systemBaseConfigMapper = contextRefreshedEvent.applicationContext.getBean(SystemBaseConfigMapper::class.java)val postMailConfig = systemBaseConfigMapper.selectByMail()val mailService = contextRefreshedEvent.applicationContext.getBean(MailService::class.java)mailService.configEmail(postMailConfig)}}// 注册事件监听器
fun main(args: Array<String>) {val springApplication = SpringApplication(StartApplication::class.java)springApplication.addListeners(ApplicationStartup())springApplication.run(*args)}

最后发送邮件的代码如下

@Service
class MailServiceImpl : MailService {@Value("\${spring.mail.username}")var mailUserName: String? = null@Autowiredlateinit var javaMailSender: JavaMailSender@Autowiredlateinit var systemBaseConfigMapper: SystemBaseConfigMapperoverride fun pushMsgEmail(target: String, subject: String, content: String) {if (target.isEmpty() || !Pattern.matches(REG_EMAIL_FORMAT, target)) returnval mailMsg = SimpleMailMessage()mailMsg.setFrom(mailUserName!!)mailMsg.setTo(target)mailMsg.setSubject(subject)mailMsg.setText(content)try {systemBaseConfigMapper.selectByMailName()?.let {mailMsg.setFrom(it.value!!)}javaMailSender.send(mailMsg)} catch (e: Exception) {e.printStackTrace()}}override fun configEmail(postMailConfig: PostMailConfig): JavaMailSender {val javaMailSender = JavaMailSenderImpl()javaMailSender.host = postMailConfig.mailHostjavaMailSender.username = postMailConfig.mailUsernamejavaMailSender.password = postMailConfig.mailPasswordval javaMailProperties = Properties()javaMailProperties["mail.smtp.auth"] = truejavaMailProperties["mail.smtp.starttls.enable"] = truejavaMailProperties["mail.smtp.timeout"] = 5000javaMailProperties["mail.smtp.socketFactory.class"] = "javax.net.ssl.SSLSocketFactory"javaMailProperties["mail.smtp.socketFactory.port"] = "465"javaMailProperties["mail.smtp.port"] = "465"javaMailSender.javaMailProperties = javaMailPropertiesthis.javaMailSender = javaMailSenderreturn javaMailSender}}

文章到这里就结束了,感谢阅读!ths!

转载于:https://www.cnblogs.com/itdragon/p/11239771.html

SpringBoot 动态配置邮箱发件人相关推荐

  1. SpringBoot 动态配置数据源

    SpringBoot 动态配置数据源 增删改查 概述 1.首先要搞明白为什么要用要动态数据源,在很多应用场景中,需要用到动态数据源,比如多个能源类项目,登录系统时根据用户信息切换到对应的数据库进行操作 ...

  2. 如何在项目运行过程中动态修改邮箱发件人的配置信息

  3. SpringBoot动态配置开启关闭定时任务

    背景介绍 springboot定时任务是通过@EnableScheduling注解的方式进行启用的,但是实际开发中本地是不需要进行开启的,而部署至生产环境需要进行开启,那么每次手动进行设置比较繁琐,下 ...

  4. springboot整合Quartz实现动态配置定时任务

    版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/liuchuanhong1/article/details/60873295 前言 在我们日常的开发中,很多 ...

  5. SpringBoot打成jra包启动时读取外部配置文件实现动态配置

    场景 若依前后端分离版手把手教你本地搭建环境并运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662 在上面 ...

  6. maven springboot 除去指定的jar包_Spring Boot打包瘦身 Docker 使用全过程 动态配置、日志记录配置...

    springBoot打包的时候代码和jar包打包在同一个jar包里面,会导致jar包非常庞大,在不能连接内网的时候调试代码,每次只改动了java代码就需要把所有的jar包一起上传,导致传输文件浪费了很 ...

  7. springboot动态多数据源配置和使用(二)

    很久之前写一篇静态的springboot多数据源配置,一直没写下篇,这里补充一下自己用动态多数据源的场景和开发逻辑. 之前说的静态多数据源是每个数据源配置一套mapper,现在说说如何动态多数据源共用 ...

  8. springboot动态多数据源配置和使用(从数据库读取数据源配置)(三)

    上两遍已经描述了动态多数据源的原理和基础实现了,前面的数据源配置都是从application.yml中配置多数据源的,这里再拓展补充一下其他场景,如何读取数据源不从application.yml中配置 ...

  9. Springboot 如何动态配置AOP切点

    AOP系列文章 AOP 的动态匹配和静态匹配 Springboot 可以定义注解切点去拦截注解修饰的类方法以及execution (xxxx)切点去拦截具体的类方法.默认情况下我们都会使用注解@Poi ...

最新文章

  1. java中如何调用自身结构_如何在Java中的自定义异常中设置我自己的消息,可以检索我的getMessage()但是没有使用构造函数,有什么办法吗?...
  2. Day 02 你最爱的交通方式
  3. mysql 索引生命周期_MYSQL 索引(一)--- 简介
  4. 牛客假日团队赛2 A.买一送一
  5. IM应用中如何计算富文本的高度
  6. 由浅到深理解ROS(6)-坐标转换
  7. 让FLASH背景透明-可运用于在网页内的FLASH内嵌入另一个网页
  8. Stella 知识库--模型类的设计
  9. 前景检测算法(十六)--背景减除结束篇
  10. (转)利用个人电脑搭建网站WEB服务器域名访问
  11. 2018-01-03 烂尾工程: Java实现的汇编语言编译器
  12. 四叶草引导程序 CloverBootloader 5125中文版
  13. 目标检测的图像特征提取之(二)LBP特征
  14. IDEA 2021首个大版本发布,羊哥反手就是一个更新!附新亮点演示!
  15. 郭天祥10天学会单片机笔记学习资料(1.1)
  16. ATX结合Maxim实现多设备并行执行压力测试(AUI自动化测试框架)
  17. 【情人节警报】看我如何智斗陌陌情爱骗子
  18. PCA9555 Studying
  19. 修改数据库账号密码(最新版本)
  20. Neo4j中的OGM(Object Graph Mapping)类似于ORM(对象关系映射)

热门文章

  1. 太阳能自动灌溉系统 利用spwm实现逆变正弦波
  2. 图像二值化——OTSU大津法
  3. STC8H1K08 TSSOP20 - UART1 - Mode 1 - 使用 T2 做为波特率发生器
  4. 不得不说,这是我面过的最优秀的Linux运维!
  5. 电信诈骗“喽啰”庭上不识东家
  6. 2017年7月17日 星期一 --出埃及记 Exodus 28:8
  7. 文献计量分析方法与工具
  8. windows无法访问指定设备_微软为安卓设备推出必应壁纸应用 可在每天清晨自动更换最新壁纸...
  9. 华大HC32-(05)-定时器输入捕获
  10. UI设计中的一致性原则