springboot發送郵件的幾種方式


springboot發送郵件的幾種方式

准備工作(以QQ郵箱為例)

SMTP 協議全稱為 Simple Mail Transfer Protocol,譯作簡單郵件傳輸協議,它定義了郵件客戶端軟件與 SMTP 服務器之間,以及 SMTP 服務器與 SMTP 服務器之間的通信規則。

也就是說 aaa@qq.com 用戶先將郵件投遞到騰訊的 SMTP 服務器這個過程就使用了 SMTP 協議,然后騰訊的 SMTP 服務器將郵件投遞到網易的 SMTP 服務器這個過程也依然使用了 SMTP 協議,SMTP 服務器就是用來收郵件。

而 POP3 協議全稱為 Post Office Protocol ,譯作郵局協議,它定義了郵件客戶端與 POP3 服務器之間的通信規則,那么該協議在什么場景下會用到呢?當郵件到達網易的 SMTP 服務器之后, 111@163.com 用戶需要登錄服務器查看郵件,這個時候就該協議就用上了:郵件服務商都會為每一個用戶提供專門的郵件存儲空間,SMTP 服務器收到郵件之后,就將郵件保存到相應用戶的郵件存儲空間中,如果用戶要讀取郵件,就需要通過郵件服務商的 POP3 郵件服務器來完成。

所以在使用springboot發送郵件之前,要開啟POP3和SMTP協議,需要獲得郵件服務器的授權碼,這里以qq郵箱為例,展示獲取授權碼的過程:

image-20201111225147543

在賬戶的下面有一個開啟SMTP協議的開關並進行密碼驗證:

image-20201111225250134

以下就是你的授權碼:

image-20201111225344720

項目創建

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

配置郵箱基本信息

spring:
  mail:
    # 配置 SMTP 服務器地址
    host: smtp.qq.com
    # 發送者郵箱
    username: 790933839@qq.com
    # 配置密碼,注意不是真正的密碼,而是剛剛申請到的授權碼
    password: vjst32rgdaawbdbd
    # 端口號465或587
    port: 587 
    # 默認的郵件編碼為UTF-8
    default-encoding: UTF-8
    # 配置SSL 加密工廠
    properties:
      mail:
        smtp:
          socketFactoryClass: javax.net.ssl.SSLSocketFactory
        #表示開啟 DEBUG 模式,這樣,郵件發送過程的日志會在控制台打印出來,方便排查錯誤
        debug: true

126郵箱SMTP服務器地址:smtp.126.com,端口號:465或者994
2163郵箱SMTP服務器地址:smtp.163.com,端口號:465或者994
yeah郵箱SMTP服務器地址:smtp.yeah.net,端口號:465或者994
qq郵箱SMTP服務器地址:smtp.qq.com,端口號465或587*

配置好這些后,springboot會自動幫我們配置好相關的郵件發送類。

發送普通郵件

發送普通郵件就是指發送一段文本文件。

    @Autowired
    JavaMailSender javaMailSender;   
		/**
     * 普通郵件發送
     */
    @Test
    public void sendSimpleMail() {
        // 構建一個郵件對象
        SimpleMailMessage message = new SimpleMailMessage();
        // 設置郵件主題
        message.setSubject("這是一封測試郵件");
        // 設置郵件發送者,這個跟application.yml中設置的要一致
        message.setFrom("7*****9@qq.com");
        // 設置郵件接收者,可以有多個接收者,中間用逗號隔開,以下類似
      	// message.setTo("10*****16@qq.com","12****32*qq.com");
        message.setTo("10*****16@qq.com");
        // 設置郵件抄送人,可以有多個抄送人
        message.setCc("12****32*qq.com");
        // 設置隱秘抄送人,可以有多個
        message.setBcc("7******9@qq.com");
        // 設置郵件發送日期
        message.setSentDate(new Date());
        // 設置郵件的正文
        message.setText("這是測試郵件的正文");
        // 發送郵件
        javaMailSender.send(message);
    }

抄送:將郵件同時送給收信人以外的人,用戶所寫的郵件抄送一份給別人,對方可以看見該用戶的E-mail發送給了誰。
密送:將郵件同時送給收信人以外的人,用戶所寫的郵件抄送一份給別人,但是對方不能查看到這封郵件同時還發送給了哪些人。

發送的效果如下:

image-20201111225443023

發送帶附件的郵件

    /**
     * 發送帶附件的郵件
     * @throws MessagingException
     */
    @Test
    public void sendAttachFileMail() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
      	// true表示構建一個可以帶附件的郵件對象
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);

        helper.setSubject("這是一封測試郵件");
        helper.setFrom("79******9@qq.com");
        helper.setTo("10*****16@qq.com");
        //helper.setCc("37xxxxx37@qq.com");
        //helper.setBcc("14xxxxx098@qq.com");
        helper.setSentDate(new Date());
        helper.setText("這是測試郵件的正文");
        // 第一個參數是自定義的名稱,后綴需要加上,第二個參數是文件的位置
        helper.addAttachment("資料.xlsx",new File("/Users/gamedev/Desktop/測試數據 2.xlsx"));
        javaMailSender.send(mimeMessage);
    }

注意這里的構建郵件對象的方式跟上面有一點不同,因為這里是需要帶附件上傳,所以先使用javaMailSender創建一個復雜的郵件對象,然后使用MimeMessageHelper對郵件進行配置,MimeMessageHelper 是一個郵件配置的輔助工具類,創建時候的 true 表示構建一個 multipart message 類型的郵件,有了 MimeMessageHelper 之后,我們針對郵件的配置都是由 MimeMessageHelper 來代勞。然后通過addAttachment()方法添加附件。

發送的效果如下:

image-20201111225524112

發送帶圖片資源的郵件

圖片資源和附件有什么區別呢?圖片資源是放在郵件正文中的,即一打開郵件,就能看到圖片。但是一般來說,不建議使用這種方式,一些公司會對郵件內容的大小有限制(因為這種方式是將圖片一起發送的)。

/**
 * 正文中帶圖片的郵件
 * @throws MessagingException
 */
@Test
public void sendImgResMail() throws MessagingException {
    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
    helper.setSubject("這是一封測試郵件");
    helper.setFrom("79*****39@qq.com");
    helper.setTo("10****6@qq.com");
    //helper.setCc("37xxxxx37@qq.com");
    //helper.setBcc("14xxxxx098@qq.com");
    helper.setSentDate(new Date());
    // src='cid:p01' 占位符寫法 ,第二個參數true表示這是一個html文本
    helper.setText("<p>hello 大家好,這是一封測試郵件,這封郵件包含兩種圖片,分別如下</p><p>第一張圖片:</p><img src='cid:p01'/><p>第二張圖片:</p><img src='cid:p02'/>",true);
    // 第一個參數指的是html中占位符的名字,第二個參數就是文件的位置
    helper.addInline("p01",new FileSystemResource(new File("/Users/gamedev/Desktop/壓縮.jpeg")));
    helper.addInline("p02",new FileSystemResource(new File("/Users/gamedev/Desktop/瑞文.jpg")));
    javaMailSender.send(mimeMessage);
}

發送的效果如下:

image-20201111225615968

在公司實際開發中,第一種和第三種都不是使用最多的郵件發送方案。因為正常來說,郵件的內容都是比較的豐富的,所以大部分郵件都是通過 HTML 來呈現的,如果直接拼接 HTML 字符串,這樣以后不好維護,為了解決這個問題,一般郵件發送,都會有相應的郵件模板。

使用 Thymeleaf 作郵件模板

推薦在 Spring Boot 中使用 Thymeleaf 來構建郵件模板。因為 Thymeleaf 的自動化配置提供了一個 TemplateEngine,通過 TemplateEngine 可以方便的將 Thymeleaf 模板渲染為 HTML ,同時,Thymeleaf 的自動化配置在這里是繼續有效的 。

首先,引入 Thymeleaf 依賴:

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

創建Thymeleaf模板:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>hello 歡迎加入 xxx 大家庭,您的入職信息如下:</p>
<table border="1">
    <tr>
        <td>姓名</td>
        <td th:text="${username}"></td>
    </tr>
    <tr>
        <td>工號</td>
        <td th:text="${num}"></td>
    </tr>
    <tr>
        <td>薪水</td>
        <td th:text="${salary}"></td>
    </tr>
</table>
<div style="color: #ff1a0e">一起努力創造輝煌</div>
</body>
</html>

發送郵件:

    @Autowired
    TemplateEngine templateEngine;

    @Test
    public void sendThymeleafMail() throws MessagingException {
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setSubject("這是一封測試郵件");
        helper.setFrom("790933839@qq.com");
        helper.setTo("1032065316@qq.com");
//        helper.setCc("37xxxxx37@qq.com");
//        helper.setBcc("14xxxxx098@qq.com");
        helper.setSentDate(new Date());
      	// 這里引入的是Template的Context
        Context context = new Context();
      	// 設置模板中的變量
        context.setVariable("username", "javaboy");
        context.setVariable("num","000001");
        context.setVariable("salary", "99999");
      	// 第一個參數為模板的名稱
        String process = templateEngine.process("hello.html", context);
      	// 第二個參數true表示這是一個html文本
        helper.setText(process,true);
        javaMailSender.send(mimeMessage);
    }

發送的效果如下:

image-20201111225704511

本文參考:http://springboot.javaboy.org/2019/0717/springboot-mail


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM