最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
SpringBoot動(dòng)態(tài)配置郵箱發(fā)件人過(guò)程解析

前言

成都創(chuàng)新互聯(lián)公司于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元相山做網(wǎng)站,已為上家服務(wù),為相山各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220

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

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

需求分析

一)、在未配置郵箱賬號(hào)時(shí),系統(tǒng)擁有默認(rèn)的郵箱發(fā)件人

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

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

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

郵箱發(fā)送的功能放在現(xiàn)在變得非常的簡(jiǎ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ā)件人。首先我們要解決第一個(gè)問(wèn)題,JavaMailSender 的Bean對(duì)象是在容器啟動(dòng)成功后就已經(jīng)注入到容器中。如何在容器啟動(dòng)后重新注入新的JavaMailSender 的Bean對(duì)象呢?

網(wǎng)上找了一些案例,他們都是通過(guò)銷毀Bean然后再重新創(chuàng)建Bean的方式實(shí)現(xiàn)。我有點(diǎn)好奇地是,為什么不直接將新的對(duì)象直接賦值從而替換原有的Bean對(duì)象?Spring默認(rèn)是單例模式,從Java內(nèi)存的角度看,這樣做似乎沒(méi)毛??!如果有不對(duì)的地方望不吝賜教😋

@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
}

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

// 創(chuàng)建事件監(jiān)聽器
class ApplicationStartup : ApplicationListener {  
  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)
  }
  
}
// 注冊(cè)事件監(jiān)聽器
fun main(args: Array) {
  
  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
  }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


新聞標(biāo)題:SpringBoot動(dòng)態(tài)配置郵箱發(fā)件人過(guò)程解析
網(wǎng)頁(yè)鏈接:http://fisionsoft.com.cn/article/iiojii.html