SpringBoot 2.X Kotlin系列之JavaMailSender發送郵件

image

在不少服務中我常常須要用到發送郵件功能,所幸的是SpringBoot能夠快速使用的框架 spring-boot-starter-mail,只要引入改框架咱們能夠快速的完成發送郵件功能。

引入mailJar

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

獲取郵件發送服務器配置

在國內用的最多的就是QQ郵件和網易163郵件,這裏會簡單講解獲取兩家服務商的發送郵件配置。html

QQ郵箱

等錄QQ郵箱,點擊設置而後選擇帳戶在下方能夠看到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務,而後咱們須要把smtp服務開啓,開啓成功後會獲得一個祕鑰。如圖所示:
image
imagejava

開啓成功須要在application.properties配置文件中加入相應的配置,如下信息部分須要替換爲本身的信息,教程結束下面的帳號就會被停用spring

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郵箱號

實現簡單發送郵件

這裏發送郵件咱們主要用到的是JavaMailSender對象,發送簡單郵件主要是發送字符串內容,複雜的郵件咱們可能會添加附件或者是發送HTML格式的郵件,咱們先測試簡單的發送,代碼以下:app

override fun sendSimple(receiver: String, title: String, content: String) {
    logger.info("發送簡單郵件服務")
    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發送郵件")
    }

}

檢查郵件是否收到發送的內容
imageide

發送模板郵件

咱們這裏用的HTML模板引擎是thymeleaf,你們須要引入一下spring-boot-starter-thymeleafspring-boot

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

有個地方須要注意,SpringBoot項目默認靜態資源都是放在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>

發送模板郵件主要實現代碼測試

override fun sendMail(receiver: String, title: String, o: Any, templateName: String) {
    logger.info("開始發送郵件服務,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)
    /*
     * 設置動態數據,這裏不建議強轉,具體業務需求傳入具體的對象
     */
    context.setVariables(o as MutableMap<String, Any>?)
    /*
     * 讀取取模板html代碼並賦值
     */
    val content = templateEngine.process(templateName, context)
    helper.setText(content, true)

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

測試代碼

@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

郵件添加附件

附件的添加也是很是容易的,我須要先把發送的附件放在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("發送簡單郵件服務")
        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("開始發送郵件服務,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)
        /*
         * 設置動態數據,這裏不建議強轉,具體業務需求傳入具體的對象
         */
        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("郵件發送結束")
    }
}

測試代碼

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發送郵件")
    }

    @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發送郵件的介紹就到此結束了,若是你們以爲教程有用麻煩點一下贊,若是有錯誤的地方歡迎指出。

相關文章
相關標籤/搜索