天天看點

SpringBoot系列之郵件發送姿勢介紹

SpringBoot系列之郵件發送姿勢介紹
SpringBoot系列之郵件發送姿勢介紹

郵件發送,在實際的項目開發中,可能用的不是特别多,如果沒有特定的需求,相信也沒有多少小夥伴會特意的去關注,那麼如果現在我們希望針對項目做一個異常的報警系統,當出現異常的時候,可以向指定的小夥伴發送郵件提醒,那麼讓我們來實作這個功能,可以怎麼辦呢?

這裡介紹一下如何使用SpringBoot封裝好的MailSender來實作郵件發送

I. 項目環境

1. 項目依賴

本項目借助​

​SpringBoot 2.2.1.RELEASE​

​​ + ​

​maven 3.5.3​

​​ + ​

​IDEA​

​進行開發

開一個web服務用于測試

<dependencies>
    <!-- 郵件發送的核心依賴 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <!-- 适用于html模闆形式的郵件發送,借助freemarker來實作html模闆渲染 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
</dependencies>      

2. 配置

在開始之前,我們需要先準備一個用于發送郵件的賬号,比如我這裡使用163的郵箱來發送郵件,需要先到郵箱提供商哪裡擷取授權碼,具體如何擷取這個東西,不同的郵箱姿勢有些不同,各位小夥伴根據自己的實際情況,搜尋一下,相信很快就能get到

這裡簡單介紹下網易郵箱的擷取方式

SpringBoot系列之郵件發送姿勢介紹

接下來設定發送郵件相關的配置資訊,配置檔案​

​application.yml​

spring:
  #郵箱配置
  mail:
    host: smtp.163.com
    from: [email protected]
    # 使用自己的發送方使用者名 + 授權碼填充
    username:
    password:
    default-encoding: UTF-8
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true      

II. 郵件發送

接下來進入正題,我們将從簡單基礎的文本郵件發送開始,逐漸介紹如何添加附件,使用漂亮的html模闆等

1. 簡單文本郵件發送

我們這裡直接使用​

​JavaMailSender​

​來發送一個基礎的文本郵件

@Service
public class MailDemo {
    @Autowired
    private JavaMailSender javaMailSender;

    @Value("${spring.mail.from:[email protected]}")
    private String from;

    private void basicSend() {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        //郵件發送人
        simpleMailMessage.setFrom(from);
        //郵件接收人,可以是多個,參數為可變參數
        simpleMailMessage.setTo("[email protected]");
        //郵件主題,也就是标題
        simpleMailMessage.setSubject("SpringBoot測試郵件發送");
        //郵件内容
        simpleMailMessage.setText("簡單的郵件正文");

        javaMailSender.send(simpleMailMessage);
    }
}      
  • JavaMailSender: 直接作為一個Spring 的bean對象使用
  • SimpleMailMessage:簡單的郵件對象,裡面有一些郵件發送時,關聯的基礎資訊
  • from: 發送方
  • replyTo: 郵件回複的收件人
  • to: 收件人
  • cc: 抄送
  • bcc: 密送
  • subject: 主題,也就是郵件标題
  • text: 郵件正文,文本格式
  • date: 郵件發送時間

2. html發送

對于簡單的文本郵件發送,用上面的基本就夠了,如果我們希望郵件的内容更美觀一點的話,可以借助HTML來實作排版

差別于上面的SimpleMailMessage, 這裡使用的是MimeMessage,來實作html内容發送

使用姿勢與上面相比差不多,無非就是正文變成了html文本罷了

/**
 * 發送html
 */
public void sendHtml() throws MessagingException {
    MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
    mimeMessageHelper.setFrom(from);
    mimeMessageHelper.setTo("[email protected]");
    mimeMessageHelper.setSubject("SpringBoot測試郵件發送");

    //郵件内容
    mimeMessageHelper.setText("<h1>Hello World</h1> <br/> " +
            "<div> 歡迎點選 <a href=\"https://blog.hhui.top\">一灰灰博文位址</a><br/>" +
            " <img width=\"200px\" height=\"200px\" src=\"https://blog.hhui.top/hexblog/imgs/info/wx.jpg\"/>" +
            "</div>", true);

    javaMailSender.send(mimeMailMessage);
}      

重點注意

  • 注意上面的​

    ​setText​

    ​方法的第二個參數,必須有,且為true,否則會當成文本内容發送

3. 添加附件

郵件中添加附件,我們自己寫郵件的時候可以直接選擇附件上傳,那麼代碼的實作方式又有什麼差別呢?

/**
 * 發送附件
 */
public void sendWithFile() throws MessagingException, IOException {
    MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
    mimeMessageHelper.setFrom(from);
    mimeMessageHelper.setTo("[email protected]");
    mimeMessageHelper.setSubject("SpringBoot測試郵件發送");

    mimeMessageHelper.setText("<h1>Hello World</h1> <br/> " +
            "<div> 歡迎點選 <a href=\"https://blog.hhui.top\">一灰灰博文位址</a><br/>" +
            " <img width=\"200px\" height=\"200px\" src=\"https://blog.hhui.top/hexblog/imgs/info/wx.jpg\"/>" +
            "</div>");

    String url = "https://blog.hhui.top/hexblog/imgs/info/wx.jpg";
    URL imgUrl = new URL(url);
    mimeMessageHelper.addAttachment("img.jpg", imgUrl::openStream);

    javaMailSender.send(mimeMailMessage);
}      

注意上面的實作,與前面差别不大,關鍵點在于​

​attachment​

​附件,上面的實作是在附件中添加一個圖檔,為了簡單起見,圖檔是直接從網絡下載下傳的,然後将Stream作為傳參

4. Freemaker模闆

上面的html發送,會發現需要我們自己來組裝html正文,這個操作可能就不是很美好了,借助頁面渲染引擎來實作郵件模闆支援,可以說是一個比較常見的方案了,這裡簡單介紹下Freemaker的實作姿勢,至于themlaf, beef或者jsp啥的,都沒有太大的差別

首先寫一個郵件模闆 ​

​resources/template/mail.ftl​

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="description" content="SpringBoot thymeleaf"/>
    <meta name="author" content="YiHui"/>
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
    <title>郵件模闆</title>
</head>
<style>
    .title {
        color: #c00;
        font-weight: normal;
        font-size: 2em;
    }

    .content {
        color: darkblue;
        font-size: 1.2em;
    }

    .sign {
        color: lightgray;
        font-size: 0.8em;
        font-style: italic;
    }
</style>
<body>

<div>
    <div class="title">${title}</div>
    <div class="content">${content}</div>
</div>
</body>
</html>      

上面的模闆中,定義了兩個變量,一個​

​title​

​​,一個​

​content​

​,這個就是我們需要替換的值

接下來是郵件發送執行個體

import freemarker.template.Configuration;

@Autowired
private Configuration configuration;

/**
 * freemarker 模闆
 */
public void freeMakerTemplate() throws MessagingException, IOException, TemplateException {
    MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);
    mimeMessageHelper.setFrom(from);
    mimeMessageHelper.setTo("[email protected]");
    mimeMessageHelper.setSubject("SpringBoot測試郵件發送");

    Map<String, Object> map = new HashMap<>();
    map.put("title", "郵件标題");
    map.put("content", "郵件正文");
    String text = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate("mail.ftl"), map);
    mimeMessageHelper.setText(text, true);

    String url = "https://blog.hhui.top/hexblog/imgs/info/wx.jpg";
    URL imgUrl = new URL(url);
    mimeMessageHelper.addAttachment("img.jpg", imgUrl::openStream);

    javaMailSender.send(mimeMailMessage);
}      

注意上面的實作,關鍵點就利用​

​FreeMarkerTemplateUtils​

​來實作模闆的渲染,輸出html正文,是以如果想使用其他的模闆渲染引擎,就是改這裡即可

5. 測試與小結

最後簡單的調用一下上面的實作,看下郵件是否可以發送成功

SpringBoot系列之郵件發送姿勢介紹
SpringBoot系列之郵件發送姿勢介紹

本篇博文介紹了一下如何發送郵件,并針對簡單的文本郵件,html正文,附件等不同的給出了執行個體;整體看下來使用姿勢不難,不過郵件的幾個術語可以了解一下

  • to: 接收人,就是郵件發送的目标群衆
  • cc: 抄送,一般來講抄送的名單,隻是讓他感覺到有這封郵件,屬于周知對象
  • bcc: 密送,與上面兩個不一樣,接收人和抄送人不知道密送給誰了,這就是最大的差別,說實話這個玩意我從沒用過

接下來一篇博文,将介紹一下如何将log日志與郵件發送關聯起來,當出現異常的時候,郵件發送給開發者

III. 不能錯過的源碼和相關知識點

0. 項目

  • 工程:​​https://github.com/liuyueyi/spring-boot-demo​​
  • 源碼:​​https://github.com/liuyueyi/spring-boot-demo/tree/master/spring-boot/​​

1. 一灰灰Blog