1. 程式人生 > 其它 >Spring Boot傳送郵件

Spring Boot傳送郵件

技術標籤:Spring-Bootjavaspring boot郵件

概述

要傳送郵件,必須藉助已有的SMTP服務。要麼藉助本地安裝的郵箱客戶端,要麼藉助網路郵箱的SMTP服務。
從本地直接憑空將資訊傳送到某個指定郵箱是做不到的。
這裡使用網路郵箱的SMTP服務。

開啟SMTP服務

網路郵箱的SMTP服務預設都是關閉的,需要進入設定後開啟。
所有網路郵箱開啟SMTP服務的方式都基本相同。這裡以QQ郵箱為例。開啟郵箱後點擊設定,選擇其下的賬戶選項卡:
mail-set
向下找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務,然後將其中的IMAP/SMTP服務開啟。
mail-open-smtp
注意後面的 (什麼是 IMAP,它又是如何設定?) ,點選後彈出說明,在裡面可以看到QQ郵箱的傳送郵件伺服器

地址,後面會用到。
點選開啟IMAP/SMTP服務,會彈窗提示需要用繫結的手機發簡訊到指定號碼:
mail-authority
傳送後,點選我已傳送,就會開啟SMTP並給出授權碼。記下該授權碼,後面要用到。

引入依賴

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

修改配置檔案

spring:
  mail:
    host: smtp.qq.com # 傳送郵件伺服器。
username: [email protected] # 傳送郵件的郵箱地址。 password: xxx # 客戶端授權碼,非郵箱密碼。由QQ郵箱生成。 default-encoding: utf-8 # 編碼。 properties: mail: smtp: port: 465 # 修改埠號為465(SMTP-over-SSL)。 ssl.enable: true # 開啟SSL。 starttls: enable: true required
: true

其中:

  • host: 郵件伺服器地址。各家地址是固定的。在QQ郵箱開啟IMAP/SMTP服務的地方有說明(什麼是 IMAP,它又是如何設定?),點選後可以在說明中看到QQ郵箱的傳送郵件伺服器為smtp.qq.com。其他郵箱同理。
  • password: 客戶端授權碼,非郵箱密碼。即前面開啟SMTP服務後生成的授權碼。
  • mail.smtp.port: 埠號。預設為25。但25埠是SMTP,不安全,現在大多數郵件伺服器都禁用該埠。因此將其修改為465埠,該埠是SMTPS,使用SSL/TLS通訊,更安全。但要注意必須配合mail.smtp.ssl.enable
  • mail.smtp.ssl.enable:開啟SSL。若將埠更換為465,則必須開啟。

傳送

傳送需要使用JavaMailSender。首先要將其引入:

@Resource
private JavaMailSender javaMailSender;

簡單郵件

簡單郵件只包含標題和文字內容。使用SimpleMailMessage來構造郵件訊息。

SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom(env.getProperty("spring.mail.username")); // 傳送方地址。必須與配置中的username相同。
simpleMailMessage.setTo("[email protected]"); // 接收方地址。
simpleMailMessage.setSubject("測試標題"); // 郵件標題。
simpleMailMessage.setText("測試內容"); // 郵件文字內容。

javaMailSender.send(simpleMailMessage);

複雜郵件

複雜郵件可在內容中嵌入html,可包含圖片,可新增附件。
複雜郵件需要使用MimeMessage來構造郵件訊息。

try {
    MimeMessage mimeMessage = javaMailSender.createMimeMessage();
    MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
    messageHelper.setFrom(env.getProperty("spring.mail.username"));
    messageHelper.setTo("[email protected]");
    messageHelper.setSubject("測試標題");
    messageHelper.setText("<h1>標題</h1><br/><p>這是內容</p><img src=\"cid:image01\">", true); // html內容字串。

    // 新增html中引用的圖片資源。
    File image = new File("D:/TEST/testImage.jpg");
    messageHelper.addInline("image01", new FileSystemResource(image));

    // 新增附件。
    File file = new File("D:/TEST/testFile.zip");
    messageHelper.addAttachment("測試檔案1", new FileSystemResource(file));

    // 傳送。
    javaMailSender.send(messageHelper.getMimeMessage());
} catch (MessagingException e) {
    e.printStackTrace();
}

其中:

  • MimeMessageHelper.setText()可傳入一個html格式的文字,該文字會以html形式展示在郵件內容中。注意第二個引數必須傳入true才會將第一個引數以html格式解析。
  • html格式文字中可以引用圖片,其屬性為src="cid:image01"cid:是固定格式,不需要修改。後面的image01是自定義的圖片id,需要與後面傳入的圖片資源對應起來。
  • MessageHelper.addInline()第一個引數為資源的cid,與html格式文字中引用的cid對應起來。若無法對應,則此處傳入的資原始檔會作為附件新增到郵件中。
  • MessageHelper.addAttachment()第一個引數為附件的檔名。

其他

  • 傳送郵件需要耗費一定時間。哪怕是最簡單的郵件,也無法做到請求後立即傳送完成。
  • 傳送的附件不能包含.bat字尾的檔案,否則收不到。