1. 程式人生 > >Spring Boot 2.x (十八):郵件服務一文打盡

Spring Boot 2.x (十八):郵件服務一文打盡

前景介紹

在日常的工作中,我們經常會用到郵件服務,比如傳送驗證碼,找回密碼確認,註冊時郵件驗證等,所以今天在這裡進行郵件服務的一些操作。

大致思路

我們要做的其實就是把Java程式作為一個客戶端,然後通過配置SMTP協議去連線我們所使用的傳送郵箱(from)對應的SMTP伺服器,然後通過SMTP協議,將郵件轉投到目標郵箱(to)對應的SMTP伺服器,最後將該郵件分發到目標郵箱

Spring Boot給我們集成了郵件的相關服務,並給出了對應的starter,這裡我們來實戰學習一下郵件服務是怎麼玩的。

引入POM

萬年不變的第一步:引入所需要的starter依賴,這裡我採用的是和我的Spring Boot對應的版本2.1.4,其餘版本的話應該是相差不大,可以同樣作為借鑑

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

配置檔案

這裡由於國內有幾大郵箱運營商,所以分為四種不同的情況來說明

  • QQ郵箱

    QQ郵箱是比較麻煩的一種,需要登入到郵箱中找到對應的配置,並驗證密碼後開啟STMP服務

​ 點選這裡可以去獲取對應的授權碼,後面的配置中我們會用到~

​ 個人QQ郵箱的SMTP伺服器的host是:smtp.qq.com

  • 163郵箱

    對應的授權碼就是我們郵箱的密碼~

    SMTP伺服器的host是:smtp.163.com

  • 騰訊企業郵箱

    對應的授權碼也是我們郵箱的密碼

    企業的和個人的host略有不同:smtp.exmail.qq.com

  • 阿里企業郵箱

    對應的授權碼也是我們郵箱的密碼

    阿里的企業郵箱host是: smtp.mxhichina.com

得到對應的資訊之後,我們就可以去完善我們的配置資訊了 ~

# 這裡的host對應是上面的幾大運營商的STMP伺服器的host
spring.mail.host=smtp.163.com
spring.mail.username=****@163.com
# 這裡的password對應的就是上面的授權碼
spring.mail.password=*** 
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8

編寫郵件的實體類

/**
 * 郵件實體類
 * @author vi
 * @since 2019/07/17
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Mail {

    /**
     * 郵件傳送人
     */
    private String from;
  
    /**
     * 郵件接收人
     */
    private String to;
  
    /**
     * 郵件主題
     */
    private String subject;
  
    /**
     * 郵件內容
     */
    private String content;
  
    /**
     * 郵件主題
     */
    private String type;

    /**
     * 傳送郵件模板時的模板檔名
     */
    private String templateName;

    /**
     * 模板引數
     */
    private Map<String,Object> variables;

    /**
     * 附件地址
     */
    private String attachPath;

}

編寫傳送郵件的方法

在這裡,我將傳送郵件分為了兩種情況:

  • 傳送普通郵件
   
     /**
       * 傳送普通郵件
       * @param email 郵件物件
       */
      private static void sendSimpleMail(Mail email) {
          SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
  //        郵件傳送人
          simpleMailMessage.setFrom(email.getFrom());
  //        郵件接收人
          simpleMailMessage.setTo(email.getTo());
  //        郵件主題
          simpleMailMessage.setSubject(email.getSubject());
  //        郵件內容
          simpleMailMessage.setText(email.getContent());
  //        傳送郵件
          javaMailSender.send(simpleMailMessage);
      }
      
     
  • 傳送MIME型別郵件(比如模板,附件,HTML都屬於該型別的郵件)

     /**
       * 傳送MIME型別的郵件
       * @param email 郵件物件
       */
      private static void sendMimeMail(Mail email) {
  //        生成郵件字串
          String content = email.getContent();
          if (email.getVariables() != null) {
              content = generate(email);
          }
  //        基於這個物件可以傳送HTML,或者攜帶附件的二進位制郵件
          MimeMessage message= javaMailSender.createMimeMessage();
          try {
  //            構建傳送模板郵件的物件
              MimeMessageHelper helper = new MimeMessageHelper(message,true);
  //            設定傳送郵箱
              helper.setFrom(email.getFrom());
  //            設定接收郵箱
              helper.setTo(email.getTo());
  //            設定郵件名(主題)
              helper.setSubject(email.getSubject());
  //            設定郵件內容
              helper.setText(content,true);
  //            這裡可以傳送帶有附件的郵件,如果沒有附件可以省略,就不在多做描述
              if (!StringUtils.isNullOrEmpty(email.getAttachPath())) {
                  FileSystemResource file = new FileSystemResource(new File(email.getAttachPath()));
                  helper.addAttachment(file.getFilename(), file);
              }
  //            傳送郵件
              javaMailSender.send(message);
          } catch (MessagingException e) {
  
          }
      }
  
  
     /**
       * 生成模板字串
       * @param email 郵件物件
       * @return
       */
      private static String generate(Mail email) {
          Context context = new Context();
  //        設定模板引數
          context.setVariables(email.getVariables());
  //        載入模板後的內容字串
          return templateEngine.process(email.getTemplateName(), context);
      }

最後可以把這兩個方法統一介面,通過Mail類中的型別來判斷呼叫哪一個方法即可~

    /**
     * 對外開放的統一發送郵件方法
     * @param mail
     */
    public static void sendEmail(Mail mail) {
        String  type = mail.getType();
        switch (type) {
            case "1":
                sendSimpleMail(mail);
            case "2":
                sendMimeMail(mail);
        }
    }

關於模板的一些補充

如果我們需要傳送模板郵件的話,需要使用到模板引擎freemaker或thymeleaf,這裡我拿thymeleaf來說一下~

第一步,可以引入pom檔案

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

第二步,需要在配置檔案中進行配置

spring.thymeleaf.check-template-location=true
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8

第三步,通過我們獲取到的模板引數對Mail類進行set方法

mail.setVariables(email.getVariables());

第四步,我們需要在模板中去使用引數

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
</head>
<body>
<h3 style="color: red;" th:text="${username}"></h3>
</body>
</html>

注意,這裡的thymeleaf的用法,使用標籤th:text來賦值,更多的模板用法,可以去

查閱thymeleaf的用法~

後記

郵件在這裡就告一段落了,下篇預告:JVM系列(一):JVM簡介,敬請期待,謝謝大家一直以來的支援!

公眾號

原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知!