最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot 動態(tài)配置郵箱發(fā)件人過程解析

 更新時間:2019年08月29日 08:26:10   作者:ITDragon龍  
這篇文章主要介紹了SpringBoot 動態(tài)配置郵箱發(fā)件人過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

前言

現(xiàn)在的消息模塊少不了郵件發(fā)送、短信發(fā)送和手機推送的功能。郵件發(fā)送的功能歷史最為悠久,也算的上爛大街的功能。一般在配置文件中設(shè)置好郵箱地址、賬號、密碼和發(fā)件服務(wù)器地址后便不會再去改動??墒怯械目蛻魠s希望人為指定發(fā)件人信息。這個需求并不過分,需要解決兩個大問題:如何在容器啟動成功后重新修改發(fā)送郵件的Bean。如何在服務(wù)器重啟后,發(fā)件人依然是更改后的配置信息。這里記錄實現(xiàn)的步驟。

需求分析

一)、在未配置郵箱賬號時,系統(tǒng)擁有默認的郵箱發(fā)件人

二)、重新設(shè)置郵箱發(fā)件人后,需立即生效

三)、重啟服務(wù)器后,郵箱發(fā)件人依然是更改后的郵箱賬號,而非默認發(fā)件人

基礎(chǔ)的郵箱發(fā)送

郵箱發(fā)送的功能放在現(xiàn)在變得非常的簡單好用,一導(dǎo)二配三發(fā)送。😊

第一步:導(dǎo)入郵箱依賴包

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

第二步:配置發(fā)件人郵箱信息

spring:
  mail:
   host: smtp.mxhichina.com
   username: itdragon@xx
   password: itdragon
   default-encoding: utf-8

第三步:發(fā)送郵件

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

可配置的郵件發(fā)送

這里的可配置值的是配置郵箱的發(fā)件人。首先我們要解決第一個問題,JavaMailSender 的Bean對象是在容器啟動成功后就已經(jīng)注入到容器中。如何在容器啟動后重新注入新的JavaMailSender 的Bean對象呢?

網(wǎng)上找了一些案例,他們都是通過銷毀Bean然后再重新創(chuàng)建Bean的方式實現(xiàn)。我有點好奇地是,為什么不直接將新的對象直接賦值從而替換原有的Bean對象?Spring默認是單例模式,從Java內(nèi)存的角度看,這樣做似乎沒毛?。∪绻胁粚Φ牡胤酵涣哔n教😋

@Autowired
lateinit var javaMailSender: JavaMailSender
fun configEmail(postMailConfig: PostMailConfig): JavaMailSender {
  val javaMailSender = JavaMailSenderImpl()
  javaMailSender.host = postMailConfig.mailHost
  javaMailSender.username = postMailConfig.mailUsername
  javaMailSender.password = postMailConfig.mailPassword
  val javaMailProperties = Properties()
  javaMailProperties["mail.smtp.auth"] = true
  javaMailProperties["mail.smtp.starttls.enable"] = true
  javaMailProperties["mail.smtp.timeout"] = 5000
  javaMailProperties["mail.smtp.socketFactory.class"] = "javax.net.ssl.SSLSocketFactory"
  javaMailProperties["mail.smtp.socketFactory.port"] = "465"
  javaMailProperties["mail.smtp.port"] = "465"
  javaMailSender.javaMailProperties = javaMailProperties
  this.javaMailSender = javaMailSender
  return javaMailSender
}

再來解決第二個問題,服務(wù)器重啟后,默認情況下依然會重新加載application.yml中的配置信息。這會出現(xiàn)郵箱發(fā)件人和實際配置的發(fā)件人不匹配的情況。其實這個問題也很好解決,加一個事件監(jiān)聽器,在容器初始化成功后執(zhí)行,根據(jù)之前保存的郵箱信息,重新配置郵箱。當然,我們需要一張表記錄當前發(fā)件人信息。

// 創(chuàng)建事件監(jiān)聽器
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)
  }
  
}
// 注冊事件監(jiān)聽器
fun main(args: Array<String>) {
  
  val springApplication = SpringApplication(StartApplication::class.java)
  springApplication.addListeners(ApplicationStartup())
  springApplication.run(*args)  
}

最后發(fā)送郵件的代碼如下

@Service
class MailServiceImpl : MailService {
  @Value("\${spring.mail.username}")
  var mailUserName: String? = null
  @Autowired
  lateinit var javaMailSender: JavaMailSender
  @Autowired
  lateinit var systemBaseConfigMapper: SystemBaseConfigMapper
  override fun pushMsgEmail(target: String, subject: String, content: String) {
    if (target.isEmpty() || !Pattern.matches(REG_EMAIL_FORMAT, target)) return
    val 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.mailHost
    javaMailSender.username = postMailConfig.mailUsername
    javaMailSender.password = postMailConfig.mailPassword
    val javaMailProperties = Properties()
    javaMailProperties["mail.smtp.auth"] = true
    javaMailProperties["mail.smtp.starttls.enable"] = true
    javaMailProperties["mail.smtp.timeout"] = 5000
    javaMailProperties["mail.smtp.socketFactory.class"] = "javax.net.ssl.SSLSocketFactory"
    javaMailProperties["mail.smtp.socketFactory.port"] = "465"
    javaMailProperties["mail.smtp.port"] = "465"
    javaMailSender.javaMailProperties = javaMailProperties
    this.javaMailSender = javaMailSender
    return javaMailSender
  }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java Map接口及其實現(xiàn)類原理解析

    Java Map接口及其實現(xiàn)類原理解析

    這篇文章主要介紹了Java Map接口及其實現(xiàn)類原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Jboss Marshalling服務(wù)端無法接受消息

    Jboss Marshalling服務(wù)端無法接受消息

    這篇文章主要介紹了Jboss Marshalling服務(wù)端無法接受消息,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • Spring JDBC的使用方法詳解

    Spring JDBC的使用方法詳解

    這篇文章主要介紹了Spring JDBC的使用方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • springboot2.0?@Slf4j?log?彩色日志配置輸出到文件

    springboot2.0?@Slf4j?log?彩色日志配置輸出到文件

    這篇文章主要介紹了springboot2.0 @Slf4j log日志配置輸出到文件(彩色日志),解決方式是使用了springboot原生自帶的一個log框架,結(jié)合實例代碼給大家講解的非常詳細,需要的朋友可以參考下
    2023-08-08
  • 詳解如何解析pom文件方法示例

    詳解如何解析pom文件方法示例

    這篇文章主要為大家介紹了詳解如何解析pom文件方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 使用Postman傳遞arraylist數(shù)據(jù)給springboot方式

    使用Postman傳遞arraylist數(shù)據(jù)給springboot方式

    這篇文章主要介紹了使用Postman傳遞arraylist數(shù)據(jù)給springboot方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Spring整合Mybatis框架方法剖析

    Spring整合Mybatis框架方法剖析

    這篇文章主要為大家介紹了Spring整合Mybatis框架方法剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-07-07
  • 利用Maven實現(xiàn)將代碼打包成第三方公共jar包

    利用Maven實現(xiàn)將代碼打包成第三方公共jar包

    在項目開發(fā)過程中,我們經(jīng)常需要將一些公共方法提取出來,然后單獨封裝成一個第三方公共jar包,采用普通的方式打包后的jar,依賴的工程執(zhí)行編譯時,卻提示找不到對應(yīng)的依賴包,那么如何將工程打包為可執(zhí)行jar包呢?下面向大家分享三種方法
    2022-10-10
  • Spring的事務(wù)機制實例代碼

    Spring的事務(wù)機制實例代碼

    這篇文章主要介紹了Spring的事務(wù)機制實例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Java實現(xiàn)默認目錄查看與修改的方法

    Java實現(xiàn)默認目錄查看與修改的方法

    本項目介紹了Java如何獲取和修改默認目錄,并通過示例代碼展示了如何在默認目錄下創(chuàng)建和操作文件,盡管Java無法直接更改全局默認目錄,但可以通過System.setProperty間接影響部分API的默認行為,需要的朋友可以參考下
    2025-03-03

最新評論

平南县| 绥中县| 伊川县| 桓台县| 五河县| 常熟市| 绥德县| 休宁县| 永平县| 霸州市| 固始县| 乌苏市| 永修县| 平塘县| 东海县| 开封县| 西宁市| 昌平区| 东阳市| 武宁县| 灵丘县| 万州区| 福贡县| 垫江县| 绥江县| 娄烦县| 六枝特区| 青川县| 黄陵县| 沧源| 密云县| 大渡口区| 仲巴县| 砚山县| 刚察县| 砀山县| 双城市| 温泉县| 资中县| 中阳县| 两当县|