SpringBoot 动态配置邮箱发件人
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 动态配置邮箱发件人相关推荐
- SpringBoot 动态配置数据源
SpringBoot 动态配置数据源 增删改查 概述 1.首先要搞明白为什么要用要动态数据源,在很多应用场景中,需要用到动态数据源,比如多个能源类项目,登录系统时根据用户信息切换到对应的数据库进行操作 ...
- 如何在项目运行过程中动态修改邮箱发件人的配置信息
- SpringBoot动态配置开启关闭定时任务
背景介绍 springboot定时任务是通过@EnableScheduling注解的方式进行启用的,但是实际开发中本地是不需要进行开启的,而部署至生产环境需要进行开启,那么每次手动进行设置比较繁琐,下 ...
- springboot整合Quartz实现动态配置定时任务
版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/liuchuanhong1/article/details/60873295 前言 在我们日常的开发中,很多 ...
- SpringBoot打成jra包启动时读取外部配置文件实现动态配置
场景 若依前后端分离版手把手教你本地搭建环境并运行项目: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662 在上面 ...
- maven springboot 除去指定的jar包_Spring Boot打包瘦身 Docker 使用全过程 动态配置、日志记录配置...
springBoot打包的时候代码和jar包打包在同一个jar包里面,会导致jar包非常庞大,在不能连接内网的时候调试代码,每次只改动了java代码就需要把所有的jar包一起上传,导致传输文件浪费了很 ...
- springboot动态多数据源配置和使用(二)
很久之前写一篇静态的springboot多数据源配置,一直没写下篇,这里补充一下自己用动态多数据源的场景和开发逻辑. 之前说的静态多数据源是每个数据源配置一套mapper,现在说说如何动态多数据源共用 ...
- springboot动态多数据源配置和使用(从数据库读取数据源配置)(三)
上两遍已经描述了动态多数据源的原理和基础实现了,前面的数据源配置都是从application.yml中配置多数据源的,这里再拓展补充一下其他场景,如何读取数据源不从application.yml中配置 ...
- Springboot 如何动态配置AOP切点
AOP系列文章 AOP 的动态匹配和静态匹配 Springboot 可以定义注解切点去拦截注解修饰的类方法以及execution (xxxx)切点去拦截具体的类方法.默认情况下我们都会使用注解@Poi ...
最新文章
- java中如何调用自身结构_如何在Java中的自定义异常中设置我自己的消息,可以检索我的getMessage()但是没有使用构造函数,有什么办法吗?...
- Day 02 你最爱的交通方式
- mysql 索引生命周期_MYSQL 索引(一)--- 简介
- 牛客假日团队赛2 A.买一送一
- IM应用中如何计算富文本的高度
- 由浅到深理解ROS(6)-坐标转换
- 让FLASH背景透明-可运用于在网页内的FLASH内嵌入另一个网页
- Stella 知识库--模型类的设计
- 前景检测算法(十六)--背景减除结束篇
- (转)利用个人电脑搭建网站WEB服务器域名访问
- 2018-01-03 烂尾工程: Java实现的汇编语言编译器
- 四叶草引导程序 CloverBootloader 5125中文版
- 目标检测的图像特征提取之(二)LBP特征
- IDEA 2021首个大版本发布,羊哥反手就是一个更新!附新亮点演示!
- 郭天祥10天学会单片机笔记学习资料(1.1)
- ATX结合Maxim实现多设备并行执行压力测试(AUI自动化测试框架)
- 【情人节警报】看我如何智斗陌陌情爱骗子
- PCA9555 Studying
- 修改数据库账号密码(最新版本)
- Neo4j中的OGM(Object Graph Mapping)类似于ORM(对象关系映射)
热门文章
- 太阳能自动灌溉系统 利用spwm实现逆变正弦波
- 图像二值化——OTSU大津法
- STC8H1K08 TSSOP20 - UART1 - Mode 1 - 使用 T2 做为波特率发生器
- 不得不说,这是我面过的最优秀的Linux运维!
- 电信诈骗“喽啰”庭上不识东家
- 2017年7月17日 星期一 --出埃及记 Exodus 28:8
- 文献计量分析方法与工具
- windows无法访问指定设备_微软为安卓设备推出必应壁纸应用 可在每天清晨自动更换最新壁纸...
- 华大HC32-(05)-定时器输入捕获
- UI设计中的一致性原则