SpringBoot發(fā)送異步郵件流程與實(shí)現(xiàn)詳解
1、基本簡(jiǎn)介
- Servlet階段郵件發(fā)送非常的復(fù)雜,如果現(xiàn)代化的Java開(kāi)發(fā)是那個(gè)樣子該有多糟糕;現(xiàn)在SpringBoot中集成好了郵件發(fā)送的東西,而且操作十分簡(jiǎn)單容易上手。
- 發(fā)送郵件最主要的一步是需要去對(duì)應(yīng)的郵箱開(kāi)啟POP3/SMTP 或者 IMAP/SMTP,并且拿到授權(quán)碼!
- 導(dǎo)入依賴(lài)包spring-boot-starter-mail。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2、郵件發(fā)送流程
首先導(dǎo)入mail的依賴(lài)包之后,根據(jù)SpringBoot的自動(dòng)裝配原理。幾乎所有的Bean對(duì)象都給裝配好了,直接拿來(lái)可以使用。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ MimeMessage.class, MimeType.class, MailSender.class })
@ConditionalOnMissingBean(MailSender.class)
@Conditional(MailSenderCondition.class)
@EnableConfigurationProperties(MailProperties.class) //配置文件綁定
@Import({ MailSenderJndiConfiguration.class, MailSenderPropertiesConfiguration.class })
public class MailSenderAutoConfiguration {
static class MailSenderCondition extends AnyNestedCondition {
MailSenderCondition() {
super(ConfigurationPhase.PARSE_CONFIGURATION);
}
// 配置文件前綴名稱(chēng)
@ConditionalOnProperty(prefix = "spring.mail", name = "host")
static class HostProperty {
}
@ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name")
static class JndiNameProperty {
}
}
}
簡(jiǎn)單分析一手可以看到只需要配置一下application文件即可,前綴以spring.mail開(kāi)頭;
spring:
mail:
username: xxxx@163.com
password: 授權(quán)碼
host: smtp.163.com # 不同郵箱對(duì)應(yīng)的服務(wù)器不一樣
default-encoding: UTF-8
# username: xxxx@qq.com
# password: 授權(quán)碼
# host: smtp.qq.com
3、配置線(xiàn)程池
這個(gè)步驟不是必須的,但是使用異步的郵件建議還是配置一下。
@Configuration
@EnableAsync//開(kāi)啟異步
public class ThreadPoolConfig {
@Bean("threadPool")
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 設(shè)置核心線(xiàn)程數(shù)
executor.setCorePoolSize(5);
// 設(shè)置最大線(xiàn)程數(shù)
executor.setMaxPoolSize(10);
// 設(shè)置隊(duì)列容量
executor.setQueueCapacity(100);
// 設(shè)置線(xiàn)程活躍時(shí)間(秒)
executor.setKeepAliveSeconds(60);
// 設(shè)置默認(rèn)線(xiàn)程名稱(chēng)
executor.setThreadNamePrefix("Thread-");
// 設(shè)置拒絕策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 等待所有任務(wù)結(jié)束后再關(guān)閉線(xiàn)程池
executor.setWaitForTasksToCompleteOnShutdown(true);
return executor;
}
}
4、編寫(xiě)郵件工具類(lèi)
- 郵件在SpringBoot中被封裝成簡(jiǎn)單純文本郵件、多媒體郵件兩種形式。
- 針對(duì)上述兩種形式的郵件可以進(jìn)行編寫(xiě)一個(gè)工具類(lèi)便于操作使用。
public class EmailUtil {
private static final String content = "這是郵件的主內(nèi)容";
// 純文本郵件
public static SimpleMailMessage simple(String from, String to){
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject("歡迎xxx");
message.setText(content);
return message;
}
// 多媒體郵件
public static MimeMessage mimeMessage(MimeMessage message,String from, String to) throws MessagingException {
MimeMessageHelper helper = new MimeMessageHelper(message,true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject("復(fù)雜郵件主題");
helper.setText("<p style='color: deepskyblue'>這是淺藍(lán)色的文字</p>", true);
helper.addAttachment("1.docx", new File("C:\\Users\\Splay\\Desktop\\說(shuō)明書(shū).docx"));
helper.addAttachment("1.pdf", new File("C:\\Users\\Splay\\Desktop\\參考.pdf"));
return message;
}
}
5、郵件發(fā)送
郵件發(fā)送是需要時(shí)間的,因此為了不讓用戶(hù)等待的時(shí)間過(guò)長(zhǎng)建議這里使用異步的形式發(fā)送。避免阻塞
@Service
public class SendEmailService {
// SpringBoot自動(dòng)裝配的郵件發(fā)送實(shí)現(xiàn)類(lèi)
@Autowired
JavaMailSenderImpl mailSender;
@Async("threadPool")
public void sendSimpleMail(String from, String to) {
SimpleMailMessage message = EmailUtil.simple(from, to);
mailSender.send(message); //簡(jiǎn)單純文本郵件發(fā)送
}
@Async("threadPool")
public void sendMultiPartMail(String from, String to) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessage mimeMessage = EmailUtil.mimeMessage(message,from, to);
mailSender.send(mimeMessage); //復(fù)雜郵件發(fā)送
}
}
6、編寫(xiě)controller
編寫(xiě)幾個(gè)controller進(jìn)行測(cè)試
@Controller
public class RouterController {
@Value("${spring.mail.username}")
private String from;
@Autowired
SendEmailService mail;
@RequestMapping("/simple")
@ResponseBody
public String simpleMail(@RequestParam(required = true,name = "mail",defaultValue = "xxx@qq.com") String to) {
mail.sendSimpleMail(from, to);
return "Send SimpleEmail Successful!";
}
@RequestMapping("/complex")
@ResponseBody
public String complexMail(@RequestParam(required = true,name = "mail",defaultValue = "xxx@qq.com") String to) throws MessagingException {
mail.sendMultiPartMail(from, to);
return "Send SimpleEmail Successful!";
}
}
到此這篇關(guān)于SpringBoot發(fā)送異步郵件流程與實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)SpringBoot發(fā)送異步郵件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot?正確的在異步線(xiàn)程中使用request的示例代碼
這篇文章主要介紹了springboot中如何正確的在異步線(xiàn)程中使用request,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
Java開(kāi)發(fā)之內(nèi)部類(lèi)對(duì)象的創(chuàng)建及hook機(jī)制分析
這篇文章主要介紹了Java開(kāi)發(fā)之內(nèi)部類(lèi)對(duì)象的創(chuàng)建及hook機(jī)制,結(jié)合實(shí)例形式分析了java基于hook機(jī)制內(nèi)部類(lèi)對(duì)象的創(chuàng)建與使用,需要的朋友可以參考下2018-01-01
SpringBoot常見(jiàn)錯(cuò)誤圖文總結(jié)
最近在使用idea+Springboot開(kāi)發(fā)項(xiàng)目中遇到一些問(wèn)題,這篇文章主要給大家介紹了關(guān)于SpringBoot常見(jiàn)錯(cuò)誤總結(jié)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-06-06
java代碼實(shí)現(xiàn)MD5加密及驗(yàn)證過(guò)程詳解
這篇文章主要介紹了java代碼實(shí)現(xiàn)MD5加密及驗(yàn)證過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
Idea安裝bpmn插件actiBPM的詳細(xì)過(guò)程(解決高版本無(wú)法安裝actiBPM插件)
這篇文章主要介紹了Idea安裝bpmn插件actiBPM的詳細(xì)過(guò)程(解決高版本無(wú)法安裝actiBPM插件)的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01
微服務(wù)鏈路追蹤Spring Cloud Sleuth整合Zipkin解析
這篇文章主要為大家介紹了微服務(wù)鏈路追蹤Spring Cloud Sleuth整合Zipkin解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
實(shí)例化JFileChooser對(duì)象報(bào)空指針異常問(wèn)題的解決辦法
今天小編就為大家分享一篇關(guān)于實(shí)例化JFileChooser對(duì)象報(bào)空指針異常問(wèn)題的解決辦法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
詳解spring cloud分布式整合zipkin的鏈路跟蹤
這篇文章主要介紹了詳解spring cloud分布式整合zipkin的鏈路跟蹤,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07

