【Springboot】Springboot整合郵件服務(HTML/附件/模板-QQ、網易)

介紹

郵件服務是經常使用的服務之一,做用不少,對外能夠給用戶發送活動、營銷廣告等;對內能夠發送系統監控報告與告警。html

本文將介紹Springboot如何整合郵件服務,並給出不一樣郵件服務商的整合配置。java

如圖所示: Springboot整合郵件服務spring

開發過程

Springboot搭建

Springboot的搭建很是簡單,咱們使用 Spring Initializr來構建,十分方便,選擇須要用到的模塊,就能快速完成項目的搭建: Spring Initializrapp

引入依賴

爲了使用郵件服務,咱們須要引入相關的依賴,對於Springboot加入下面的依賴便可:spring-boot

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

配置文件

須要配置郵件服務提供商的相關參數,如服務地址、用戶名及密碼等。下面的例子是QQ的配置,其中密碼並非QQ密碼,而是QQ受權碼,後續咱們再講怎麼得到。post

Springboot的配置文件application.yml以下:測試

server:
  port: 8080
spring:
  profiles:
    active: qq
---
spring:
  profiles: qq
  mail:
    host: smtp.qq.com
    username: xxx@qq.com
    password: xxx
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
---
spring:
  profiles: netEase
  mail:
    host: smtp.163.com
    username: xxx@163.com
    password: xxx
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true

實現發送服務

JavaMailSender注入,組裝Message後,就能夠發送最簡單的文本郵件了。ui

@Autowired
private JavaMailSender emailSender;

public void sendNormalText(String from, String to, String subject, String text) {
  SimpleMailMessage message = new SimpleMailMessage();
  message.setFrom(from);
  message.setTo(to);
  message.setSubject(subject);
  message.setText(text);
  emailSender.send(message);
}

調用接口

服務調用實現後,經過Controller對外暴露REST接口,具體代碼以下:3d

@Value("${spring.mail.username}")
private String username;
@Autowired
private MailService mailService;

@GetMapping("/normalText")
public Mono<String> sendNormalText() {
  mailService.sendNormalText(username, username,
              "Springboot Mail(Normal Text)",
              "This is a mail from Springboot!");
  return Mono.just("sent");
}

把實現的MailService注入到Controller裏,調用對應的方法便可。本次的郵件發送人和收件人都是同一個賬戶,實際實現能夠靈活配置。code

經過Postman調用接口來測試一下能不能正常發送: Postman 成功返回"sent",並收到了郵件,測試經過。

多種類型郵件

簡單文本郵件

簡單文本郵件如何發送,剛剛已經講解,再也不贅述。

HTML郵件

純文本雖然已經能知足不少需求,但不少時候也須要更加豐富的樣式來提升郵件的表現力。這時HTML類型的郵件就很是有用。

Service代碼以下:

public void sendHtml(String from, String to, String subject, String text) throws MessagingException {
  MimeMessage message = emailSender.createMimeMessage();
  MimeMessageHelper helper = new MimeMessageHelper(message, true);
  helper.setFrom(from);
  helper.setTo(to);
  helper.setSubject(subject);
  helper.setText(text, true);
  emailSender.send(message);
}

與簡單的文本不一樣的是,本次用到了MimeMessageMimeMessageHelper,這是很是有用的類,後續咱們常常會用到,組合使用能大大豐富郵件表現形式。

Controller的代碼以下:

@GetMapping("/html")
public Mono<String> sendHtml() throws MessagingException {
  mailService.sendHtml(username, username,
              "Springboot Mail(HTML)",
              "<h1>This is a mail from Springboot!</h1>");
  return Mono.just("sent");
}

帶附件郵件

郵件發送文件再正常不過,發送附件須要使用MimeMessageHelper.addAttachment(String attachmentFilename, InputStreamSource inputStreamSource)方法,第一個參數爲附件名,第二參數爲文件流資源。Service代碼以下:

public void sendAttachment(String from, String to, String subject, String text, String filePath) throws MessagingException {
  MimeMessage message = emailSender.createMimeMessage();
  MimeMessageHelper helper = new MimeMessageHelper(message, true);
  helper.setFrom(from);
  helper.setTo(to);
  helper.setSubject(subject);
  helper.setText(text, true);
  FileSystemResource file = new FileSystemResource(new File(filePath));
  helper.addAttachment(filePath, file);
  emailSender.send(message);
}

Controller代碼以下:

@GetMapping("/attachment")
public Mono<String> sendAttachment() throws MessagingException {
  mailService.sendAttachment(username, username,
              "Springboot Mail(Attachment)",
              "<h1>Please check the attachment!</h1>",
              "/Pictures/postman.png");
  return Mono.just("sent");
}

帶靜態資源郵件

咱們訪問的網頁其實也是一個HTML,是能夠帶不少靜態資源的,如圖片、視頻等。Service代碼以下:

public void sendStaticResource(String from, String to, String subject, String text, String filePath, String contentId) throws MessagingException {
  MimeMessage message = emailSender.createMimeMessage();
  MimeMessageHelper helper = new MimeMessageHelper(message, true);
  helper.setFrom(from);
  helper.setTo(to);
  helper.setSubject(subject);
  helper.setText(text, true);
  FileSystemResource file = new FileSystemResource(new File(filePath));
  helper.addInline(contentId, file);
  emailSender.send(message);
}

其中,contentId爲HTML裏靜態資源的ID,須要對應好。

Controller代碼以下:

@GetMapping("/inlinePicture")
public Mono<String> sendStaticResource() throws MessagingException {
  mailService.sendStaticResource(username, username,
             "Springboot Mail(Static Resource)",
             "<html><body>With inline picture<img src='cid:picture' /></body></html>",
             "/Pictures/postman.png",
             "picture");
  return Mono.just("sent");
}

模板郵件

Java的模板引擎不少,著名的有Freemarker、Thymeleaf、Velocity等,這不是本點的重點,因此只以Freemarker爲例使用。

Service代碼以下:

@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;

public void sendTemplateFreemarker(String from, String to, String subject, Map<String, Object> model, String templateFile) throws Exception {
  MimeMessage message = emailSender.createMimeMessage();
  MimeMessageHelper helper = new MimeMessageHelper(message, true);
  helper.setFrom(from);
  helper.setTo(to);
  helper.setSubject(subject);
  Template template = freeMarkerConfigurer.getConfiguration().getTemplate(templateFile);
  String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
  helper.setText(html, true);
  emailSender.send(message);
}

注意須要注入FreeMarkerConfigurer,而後使用FreeMarkerTemplateUtils解析模板,返回String,就能夠做爲內容發送了。

Controller代碼以下:

@GetMapping("/template")
public Mono<String> sendTemplateFreemarker() throws Exception {
  Map<String, Object> model = new HashMap<>();
  model.put("username", username);
  model.put("templateType", "Freemarker");
  mailService.sendTemplateFreemarker(username, username,
                                     "Springboot Mail(Template)",
                                     model,
                                     "template.html");
  return Mono.just("sent");
}

注意模板文件template.html要放在**resources/templates/**目錄下面,這樣才能找獲得。

模板內容以下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Hello ${username}</h1>
<h1>This is a mail from Springboot using ${templateType}</h1>
</body>
</html>

其中${username}${templateType}爲須要替換的變量名,Freemarker提供了不少豐富的變量表達式,這裏不展開講了。

集成不一樣郵件服務商

郵件服務的提供商不少,國內最經常使用的應該是QQ郵箱和網易163郵箱了。

QQ

集成QQ郵件須要有必備的帳號,還要開通受權碼。開通受權碼後配置一下就可使用了,官方的文檔以下:

什麼是受權碼,它又是如何設置?

須要注意的是,開通受權碼是須要使用綁定的手機號發短信到特定號碼的,若是沒有綁定手機或者綁定手機不可用,那都會影響開通。

開通以後,受權碼就要以做爲密碼配置到文件中。

163

網易的開通方式與QQ沒有太大差異,具體的指導能夠看以下官方文檔:

如何開啓客戶端受權碼?

一樣也是須要綁定手機進行操做。

總結

本次例子發送後收到郵件如圖所示: 郵件 郵件功能強大,Springboot也很是容易整合。技術利器,善用而不濫用。


歡迎關注公衆號**<南瓜慢說>**,將爲你持續更新...

本文由博客一文多發平臺 OpenWrite 發佈!

相關文章
相關標籤/搜索