玩轉 SpringBoot2.x 之整合郵件傳送

淼淼之森發表於2020-07-31

在實際專案中,經常需要用到郵件通知功能。比如,使用者通過郵件註冊,通過郵件找回密碼等;又比如通過郵件傳送系統情況,通過郵件傳送報表資訊等等,實際應用場景很多。

原文地址https://www.mmzsblog.cn/articles/2020/07/28/1595865811262.html

正常我們會用 JavaMail 相關 api 來寫傳送郵件的相關程式碼,但現在 SpringBoot 提供了一套更簡易使用的封裝。這篇文章,阿淼就帶大家通過 SpringBoot 快速的實現傳送郵件的功能。

1、開啟smtp

這裡以 163 郵箱為例。登入 163 郵箱之後,點選設定,如下圖:

1.1、登入郵箱-設定
獲取 spring.mail.password 授權碼:

1.2、開啟IMAP/SMTP服務,根據提示走獲取授權碼

這個授權碼,就是傳送郵件時需要的密碼。

1.3、下方有服務地址SMTP伺服器:smtp.163.com就是我們要的

以上步驟完成之後,就可以開始開發了。

2、新建 maven 專案

3、 pom 檔案中所涉及的依賴包

匯入 SpringBoot 父依賴版本為 2.02

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.0.2.RELEASE</version>
</parent>

匯入 webmail 郵件相關依賴包

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

4、配置檔案

配置檔案中引數的獲取,最後介紹。

server:
  port: 8082
spring:
  http:
    encoding:
      # 編碼集
      charset: utf-8
      enabled: true
  mail:
    default-encoding: UTF-8
    #傳送郵件的賬戶
    username: xxxxxxx@qq.com
    # 授權碼(獲取方式前文已描述)
    password: xxxxxxyyyyyy    
    # (郵箱伺服器地址,獲取方式前文已描述)  
    # 163 郵箱是smtp.163.com
    # qq郵箱則為smtp.qq.com
    host: smtp.163.com
    properties: 
      mail:
        smtp:
          ssl:
            enable: true

5、傳送類實現

Spring Email 抽象的核心是 MailSender 介面,MailSender 的實現能夠把 Email 傳送給郵件伺服器,由郵件伺服器實現郵件傳送的功能。

Spring 自帶了一個 MailSender 的實現 JavaMailSenderImpl,它會使用 JavaMail API 來傳送 Email。後來 spring 推出
JavaMailSender 進一步簡化郵件傳送的過程,然後 SpringBoot 對此進行了封裝,就有了
現在的 spring-boot-starter-mail

接下來,阿淼和大家一起通過例項看看如何在 SpringBoot 中使用 JavaMailSenderImpl 傳送郵件。

簡單訊息郵件

@Resource
private JavaMailSenderImpl javaMailSenderImpl;
    
public void sendSimpleMail() {
    SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
    // 設定郵件主題
    simpleMailMessage.setSubject("賬號啟用");
    // 設定要傳送的郵件內容
    simpleMailMessage.setText("hello!");
    // 要傳送的目標郵箱
    simpleMailMessage.setTo("yyyyyyyyyy@163.com");
    // 傳送者郵箱和配置檔案中的郵箱一致
    simpleMailMessage.setFrom("xxxxxxxx@qq.com");
    javaMailSenderImpl.send(simpleMailMessage);
}

複雜訊息郵件

@Resource
private JavaMailSenderImpl javaMailSenderImpl;

public void sendMimeMail() {
    MimeMessage mimeMessage = javaMailSenderImpl.createMimeMessage();
    try {
        // 開啟檔案上傳
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
        // 設定檔案主題
        mimeMessageHelper.setSubject("賬號啟用");
        // 設定檔案內容 第二個引數設定是否支援html
        mimeMessageHelper.setText("<b style='color:red'>賬號啟用,請點選我</b>", true);
        // 設定傳送到的郵箱
        mimeMessageHelper.setTo("yyyyyyyyyy@163.com");
        // 設定傳送人和配置檔案中郵箱一致
        mimeMessageHelper.setFrom("xxxxxxxx@qq.com");
        // 上傳附件
        // mimeMessageHelper.addAttachment("", new File(""));
    } catch (MessagingException e) {
        e.printStackTrace();
    }
    javaMailSenderImpl.send(mimeMessage);
}

6、 Controller

@RestController
public class SendMailController {
	@Resource
	private SendMail sendMail;
	
	@GetMapping("/sendSimpleMail")
	public void sendSimpleMail() {
		sendMail.sendSimpleMail();
	}
	
	@GetMapping("/sendMimeMail")
	public void sendMimeMail() {
		sendMail.sendMimeMail();
	}
}

7、測試

7.1、簡單郵件

利用 postman 傳送請求:

檢視郵箱結果:

7.2、複雜郵件

利用 postman 傳送請求:

檢視郵箱結果:

從結果可以看出,我們設定的 <b style='color:red'>賬號啟用,請點選我</b> 字型樣式已經展示出效果了!

參考https://www.cnblogs.com/jmcui/p/9758442.html

github程式碼地址:

https://github.com/mmzsblog/mmzsblog-util

相關文章