SpringBoot 2.X Kotlin系列之JavaMailSender發(fā)送郵件

image

在很多服務中我經常需要用到發(fā)送郵件功能,所幸的是SpringBoot可以快速使用的框架spring-boot-starter-mail韧拒,只要引入改框架我們可以快速的完成發(fā)送郵件功能。

引入mailJar

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

獲取郵件發(fā)送服務器配置

在國內用的最多的就是QQ郵件和網易163郵件十性,這里會簡單講解獲取兩家服務商的發(fā)送郵件配置叛溢。

QQ郵箱

等錄QQ郵箱,點擊設置然后選擇賬戶在下方可以看到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務,然后我們需要把smtp服務開啟劲适,開啟成功后會得到一個秘鑰楷掉。如圖所示:

image

image

開啟成功需要在application.properties配置文件中加入相應的配置,以下信息部分需要替換為自己的信息霞势,教程結束下面的賬號就會被停用

spring.mail.host=smtp.qq.com
spring.mail.username=6928700@qq.com # 替換為自己的QQ郵箱號
spring.mail.password=owqpkjmqiasnbigc # 替換為自己的秘鑰或授權碼
spring.mail.port=465
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
# sender 
email.sender=6928700@qq.com # 替換為自己的QQ郵箱號

163郵箱

登錄賬戶然后在設置找到POP3/SMTP/IMAP選項烹植,然后開啟smtp服務,具體操作如下圖所示愕贡,然后修改對應的配置文件

image

image

image
spring.mail.host=smtp.163.com
spring.mail.username=xmsjgzs@163.com # 替換為自己的163郵箱號
spring.mail.password=owqpkj163MC # 替換為自己的授權碼
spring.mail.port=465
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
# sender 
email.sender=xmsjgzs@163.com # 替換為自己的163郵箱號

實現簡單發(fā)送郵件

這里發(fā)送郵件我們主要用到的是JavaMailSender對象草雕,發(fā)送簡單郵件主要是發(fā)送字符串內容,復雜的郵件我們可能會添加附件或者是發(fā)送HTML格式的郵件颂鸿,我們先測試簡單的發(fā)送促绵,代碼如下:

override fun sendSimple(receiver: String, title: String, content: String) {
    logger.info("發(fā)送簡單郵件服務")
    val message = mailSender.createMimeMessage()
    val helper = MimeMessageHelper(message, true)
    helper.setFrom(sender)
    helper.setTo(receiver)
    helper.setSubject(title)
    helper.setText(content)
    mailSender.send(message)
}

測試代碼

@RunWith(SpringJUnit4ClassRunner::class)
@SpringBootTest
class MailServiceImplTest {

    @Autowired lateinit var mailService: MailService

    @Test
    fun sendSimple() {
        mailService.sendSimple("xmsjgzs@163.com", "Hello Kotlin Mail", "SpringBoot Kotlin 專欄學習之JavaMailSender發(fā)送郵件")
    }

}

檢查郵件是否收到發(fā)送的內容


image

發(fā)送模板郵件

我們這里用的HTML模板引擎是thymeleaf,大家需要引入一下spring-boot-starter-thymeleaf

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

有個地方需要注意嘴纺,SpringBoot項目默認靜態(tài)資源都是放在resources/templates目錄下败晴,所以我們編寫的HTML模板就需要放在該目錄下,具體內容如下:

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title th:text="${title}">Title</title>
</head>
<body>
    <h1 th:text="${name}">Demo</h1>
    <h1 th:text="${phone}">xxx</h1>
</body>
</html>

發(fā)送模板郵件主要實現代碼

override fun sendMail(receiver: String, title: String, o: Any, templateName: String) {
    logger.info("開始發(fā)送郵件服務,To:{}", receiver)
    val message = mailSender.createMimeMessage()
    val helper = MimeMessageHelper(message, true)
    helper.setFrom(sender)
    helper.setTo(receiver)
    helper.setSubject(title)

    val context = Context()
    context.setVariable("title", title)
    /*
     * 設置動態(tài)數據栽渴,這里不建議強轉尖坤,具體業(yè)務需求傳入具體的對象
     */
    context.setVariables(o as MutableMap<String, Any>?)
    /*
     * 讀取取模板html代碼并賦值
     */
    val content = templateEngine.process(templateName, context)
    helper.setText(content, true)

    mailSender.send(message)
    logger.info("郵件發(fā)送結束")
}

測試代碼

@Test
fun sendMail() {
    val model = HashMap<String, Any>()
    model["name"] = "Tom"
    model["phone"] = "69288888"
    mailService.sendMail("xmsjgzs@163.com", "Kotlin Template Mail", model, "mail")
}

查看郵件我們可以看到如下內容:


image

郵件添加附件

附件的添加也是非常容易的,我需要先把發(fā)送的附件放在resources/templates目錄下闲擦,然后在MimeMessageHelper對象中設置相應的屬性即可慢味,如下所示:

helper.addAttachment("test.txt", FileSystemResource(File("test.txt")))

完整的代碼

package io.intodream.kotlin06.service.impl

import io.intodream.kotlin06.service.MailService
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.core.io.FileSystemResource
import org.springframework.mail.javamail.JavaMailSender
import org.springframework.mail.javamail.MimeMessageHelper
import org.springframework.stereotype.Service
import org.thymeleaf.TemplateEngine
import org.thymeleaf.context.Context
import java.io.File

/**
 * {描述}
 *
 * @author yangxianxi@gogpay.cn
 * @date 2019/4/8 19:19
 *
 */
@Service
class MailServiceImpl @Autowired constructor(private var mailSender: JavaMailSender, private var templateEngine: TemplateEngine) : MailService{

    val logger : Logger = LoggerFactory.getLogger(MailServiceImpl::class.java)

    @Value("\${email.sender}")
    val sender: String = "6928700@qq.com"

    override fun sendSimple(receiver: String, title: String, content: String) {
        logger.info("發(fā)送簡單郵件服務")
        val message = mailSender.createMimeMessage()
        val helper = MimeMessageHelper(message, true)
        helper.setFrom(sender)
        helper.setTo(receiver)
        helper.setSubject(title)
        helper.setText(content)
        mailSender.send(message)
    }

    override fun sendMail(receiver: String, title: String, o: Any, templateName: String) {
        logger.info("開始發(fā)送郵件服務,To:{}", receiver)
        val message = mailSender.createMimeMessage()
        val helper = MimeMessageHelper(message, true)
        helper.setFrom(sender)
        helper.setTo(receiver)
        helper.setSubject(title)

        val context = Context()
        context.setVariable("title", title)
        /*
         * 設置動態(tài)數據,這里不建議強轉墅冷,具體業(yè)務需求傳入具體的對象
         */
        context.setVariables(o as MutableMap<String, Any>?)
        /*
         * 添加附件
         */
        helper.addAttachment("test.txt", FileSystemResource(File("test.txt")))
        /*
         * 讀取取模板html代碼并賦值
         */
        val content = templateEngine.process(templateName, context)
        helper.setText(content, true)

        mailSender.send(message)
        logger.info("郵件發(fā)送結束")
    }
}

測試代碼

package io.intodream.kotlin06.service.impl

import io.intodream.kotlin06.service.MailService
import org.junit.Test
import org.junit.runner.RunWith
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner

/**
 * {描述}
 *
 * @author yangxianxi@gogpay.cn
 * @date 2019/4/9 18:38
 */
@RunWith(SpringJUnit4ClassRunner::class)
@SpringBootTest
class MailServiceImplTest {

    @Autowired lateinit var mailService: MailService

    @Test
    fun sendSimple() {
        mailService.sendSimple("xmsjgzs@163.com", "Hello Kotlin Mail",
                "SpringBoot Kotlin 專欄學習之JavaMailSender發(fā)送郵件")
    }

    @Test
    fun sendMail() {
        val model = HashMap<String, Any>()
        model["name"] = "Tom"
        model["phone"] = "69288888"
        mailService.sendMail("xmsjgzs@163.com", "Kotlin Template Mail", model, "mail")
    }
}

關于Kotlin使用JavaMailSender發(fā)送郵件的介紹就到此結束了纯路,如果大家覺得教程有用麻煩點一下贊,如果有錯誤的地方歡迎指出寞忿。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末驰唬,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌叫编,老刑警劉巖辖佣,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異搓逾,居然都是意外死亡卷谈,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門霞篡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來世蔗,“玉大人,你說我怎么就攤上這事朗兵⊥怪#” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵矛市,是天一觀的道長。 經常有香客問我诲祸,道長浊吏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任救氯,我火速辦了婚禮找田,結果婚禮上,老公的妹妹穿的比我還像新娘着憨。我一直安慰自己墩衙,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布甲抖。 她就那樣靜靜地躺著漆改,像睡著了一般。 火紅的嫁衣襯著肌膚如雪准谚。 梳的紋絲不亂的頭發(fā)上挫剑,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音柱衔,去河邊找鬼樊破。 笑死,一個胖子當著我的面吹牛唆铐,可吹牛的內容都是我干的哲戚。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼艾岂,長吁一口氣:“原來是場噩夢啊……” “哼顺少!你這毒婦竟也來了?” 一聲冷哼從身側響起澳盐,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤祈纯,失蹤者是張志新(化名)和其女友劉穎令宿,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體腕窥,經...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡粒没,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了簇爆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癞松。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖入蛆,靈堂內的尸體忽然破棺而出响蓉,到底是詐尸還是另有隱情,我是刑警寧澤哨毁,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布枫甲,位于F島的核電站,受9級特大地震影響扼褪,放射性物質發(fā)生泄漏想幻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一话浇、第九天 我趴在偏房一處隱蔽的房頂上張望脏毯。 院中可真熱鬧,春花似錦幔崖、人聲如沸食店。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吉嫩。三九已至,卻和暖如春蹋订,著一層夾襖步出監(jiān)牢的瞬間率挣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工露戒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留椒功,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓智什,卻偏偏與公主長得像动漾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荠锭,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359