1. 程式人生 > >Spring Boot學習筆記:JavaMailSender發送郵件

Spring Boot學習筆記:JavaMailSender發送郵件

獲取 prop create subject intern dex autowired 需求 see

項目中經常會有這樣的需求,用戶註冊成功,需要給用戶發送一封郵件。郵件需要有一定格式和樣式。本次例子中用freemarker做樣式,其他的模版引擎類似。

首先Spring Boot項目,項目結構如下

技術分享圖片

在pom.xml文件中添加依賴

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

配置發件人信息,發件人郵箱需要開通POP3/SMTP服務,如下圖(我是采用126郵箱):

技術分享圖片

然後在application.properties中添加配置文件:

技術分享圖片

然後在service層中添加MailService類,代碼如下

import freemarker.core.ParseException;
import freemarker.template.MalformedTemplateNameException;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateNotFoundException;
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.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import org.springframework.util.ResourceUtils; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.File; import java.io.IOException; import java.util.HashMap; import java.util.Map; @Service public class MailService { private final static Logger logger = LoggerFactory.getLogger(MailService.class); @Value("${spring.mail.username}") private String from; @Autowired private JavaMailSender mailSender; @Autowired private FreeMarkerConfig freeMarkerConfig; // send simple email public String sendSimple(String to, String title, String content) { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(from); message.setTo(to); message.setSubject(title); message.setText(content); mailSender.send(message); logger.info("{} send email to {}", from, to); return "SUCESS"; } // send template mail public String sendTemplateMail(String to, String title) { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper; try { helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(title); Map<String, Object> model = new HashMap<>(); model.put("params", from); Template template = freeMarkerConfig.getConfiguration().getTemplate("message.ftl"); String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); helper.setText(text, true); mailSender.send(mimeMessage); } catch (MessagingException e) { e.printStackTrace(); } catch (MalformedTemplateNameException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (TemplateNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } return "SUCEESS"; } // send template mail with attachment public String sendAttactmentMail(String to, String title){ MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper; try { helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(title); // add template Map<String, Object> model = new HashMap<>(); model.put("params", from); Template template = freeMarkerConfig.getConfiguration().getTemplate("message.ftl"); String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); helper.setText(text, true); // add attachment File file = ResourceUtils.getFile("classpath:static/flcl.jpg"); helper.addAttachment(file.getName(), file); mailSender.send(mimeMessage); } catch (MessagingException e) { e.printStackTrace(); } catch (MalformedTemplateNameException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } catch (TemplateNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (TemplateException e) { e.printStackTrace(); } return "SUCCESS"; } }

這個service中寫了三個方法,三個方法的作用分別對應於:發送簡單郵件發送模版郵件發送帶附件的模版郵件

核心方法是 mailSender.send(message) ,message對象根據發送的郵件類型不同而不同,主要有MimeMessage MimeMessageHelper

發送帶附件的模板郵件方式是三者中最復雜,首先創建郵件對象MimeMessage ,然後通過MimeMessage對象創建MimeMessageHelper(此對象的作用:向MimeMessage對象中填充數據的助手),通過向MimeMessageHelper對象中添加一些屬性,例如發件人、收件人、郵件主題、模版、附件。其中freemarker模板文件xxx.ftl放在resources文件夾下中template(通過FreemakrerConfig獲取xxx.ftl的Template對象,然後轉換為String),其中附件flcl.jpg放在resources文件夾中的static中(通過ResourceUtils獲取文件對象File)。屬性添加完成後,就可以發送了。

然後在controller或者其他service層中調用該方法就可以了。

補充:

message.ftl文件內容如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello</title>
</head>
<body>
<h1>Send email</h1>
<div>this email come from ${params}</div>
</body>
</html> 

發送成功後,可在收件箱中收到郵件

技術分享圖片

Spring Boot學習筆記:JavaMailSender發送郵件