目錄
- 引入jar包
- 配置郵件發送方
- 測試發送簡單郵件
- 發送模闆郵件
-
- 主要方法sendWithHTMLTemplate說明
- 使用異步線程發送郵件
- 具體代碼請參考GitHub項目
引入jar包
<!-- SpringBoot郵件starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- freemarker模闆 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
配置郵件發送方
在application.properties檔案中添加以下配置,這裡以qq郵箱為例
spring.mail.host=smtp.qq.com
# 發送方郵件
[email protected]
# qq郵箱的授權碼,擷取方式下邊有介紹
spring.mail.password=abcdefg
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
授權碼擷取方式: 登入qq郵箱,到郵箱設定->安全->賬号安全,如下圖

測試發送簡單郵件
@Autowired
private JavaMailSender javaMailSender;
@Test
public void test1() {
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
// 郵件主題
simpleMailMessage.setSubject("測試");
// 郵件接收人郵箱
simpleMailMessage.setTo("[email protected]");
// 郵件内容
simpleMailMessage.setText("這是一封測試郵件");
javaMailSender.send(simpleMailMessage);
}
發送模闆郵件
上面的測試發送了簡單郵件,郵件内容是簡單的文本字元串,這滿足不了我們更複雜的需求。我們可以結合freemarker模闆引擎,實作發送富文本功能的Mime郵件
@Autowired
private MailSendService mailSendService;
@Test
public void test2() {
Map<String, Object> params = new HashMap<>();
params.put("company", "a公司");
params.put("contact", "b聯系方式");
params.put("email", "c詢問下單郵件");
params.put("fax", "d傳真");
params.put("more", "e備注");
Mail mail = new Mail();
// 設定接收方郵箱
mail.setReceiverEmail("[email protected]");
// 使用的模闆名稱
mail.setTemplateName("place_order.ftl");
// 設定
mail.setParams(params);
mail.setSubject("主題:測試郵件");
boolean isSucc = mailSendService.sendWithHTMLTemplate(mail);
}
測試結果如下,我收到了測試郵件
主要方法sendWithHTMLTemplate說明
/**
* spring提供的Java郵件發送類
*/
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;
@Override
public boolean sendWithHTMLTemplate(Mail mail) {
try {
//發件人昵稱
String nick = MimeUtility.encodeText("David");
//發件人網絡位址
InternetAddress from = new InternetAddress(nick + "<[email protected]>");
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setTo(mail.getReceiverEmail());
mimeMessageHelper.setFrom(from);
mimeMessageHelper.setSubject(mail.getSubject());
// 使用模闆生成html郵件内容
String result = getMailTextByTemplateName(mail.getTemplateName(), mail.getParams());
mimeMessageHelper.setText(result, true);
javaMailSender.send(mimeMessage);
return true;
} catch (Exception e) {
log.error("TAG=sendEmailFailed, msg={}", e.getMessage());
return false;
}
}
@Override
public String getMailTextByTemplateName(String templateName, Map<String, Object> params) throws IOException, TemplateException {
String mailText = "";
// 通過指定模闆名擷取FreeMarker模闆執行個體
Template template = freeMarkerConfigurer.getConfiguration().getTemplate(templateName);
// FreeMarker通過Map傳遞動态資料
// 注意動态資料的key和模闆标簽中指定的屬性相比對
// 解析模闆并替換動态資料,最終code将替換模闆檔案中的${code}标簽。
mailText = FreeMarkerTemplateUtils.processTemplateIntoString(template, params);
return mailText;
}
模闆檔案放在resources/templates檔案夾即可
使用異步線程發送郵件
發送郵件時間比較長,這裡簡單配置下線程池,然後異步發送郵件
添加AsyncConfig配置類
@Configuration
@EnableAsync
public class AsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// 線程池維護線程的最少數量
executor.setCorePoolSize(30);
// 線程池維護線程的最大數量
executor.setMaxPoolSize(50);
// 緩存隊列 TODO 最大同時線程隻能是maxPoolSize+Queue=150
executor.setQueueCapacity(100);
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60 * 10);
// 拒絕task的處理政策, 當pool已經達到max size的時候, 抛出異常
executor.setThreadNamePrefix("AsyncThread-");
// 如果不初始化, 導緻找到不到執行器
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new AsyncExceptionHandler();
}
}
配置好之後,隻需要在需要異步執行的方法上面添加@Async注解即可實作該方法的異步執行,例如我們在sendWithHTMLTemplate()方法上添加@Async注解,則實作了sendWithHTMLTemplate()方法的異步執行
@Async
@Override
public boolean sendWithHTMLTemplate(Mail mail) {
...
}
具體代碼請參考GitHub項目
這裡偷個懶,把代碼放在之前的resttemplate項目下
GitHub