在很多服務中我經常需要用到發(fā)送郵件功能,所幸的是SpringBoot可以快速使用的框架
spring-boot-starter-mail
韧拒,只要引入改框架我們可以快速的完成發(fā)送郵件功能。
引入mail
Jar
<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
服務開啟劲适,開啟成功后會得到一個秘鑰楷掉。如圖所示:
開啟成功需要在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服務,具體操作如下圖所示愕贡,然后修改對應的配置文件
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ā)送的內容
發(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")
}
查看郵件我們可以看到如下內容:
郵件添加附件
附件的添加也是非常容易的,我需要先把發(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ā)送郵件的介紹就到此結束了纯路,如果大家覺得教程有用麻煩點一下贊,如果有錯誤的地方歡迎指出寞忿。