天天看點

SpringBoot 發送郵件引入jar包配置郵件發送方測試發送簡單郵件發送模闆郵件使用異步線程發送郵件具體代碼請參考GitHub項目

目錄

  • 引入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郵箱,到郵箱設定->安全->賬号安全,如下圖

SpringBoot 發送郵件引入jar包配置郵件發送方測試發送簡單郵件發送模闆郵件使用異步線程發送郵件具體代碼請參考GitHub項目

測試發送簡單郵件

@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);
}
           

測試結果如下,我收到了測試郵件

SpringBoot 發送郵件引入jar包配置郵件發送方測試發送簡單郵件發送模闆郵件使用異步線程發送郵件具體代碼請參考GitHub項目

主要方法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

繼續閱讀