Spring Boot傳送郵件
阿新 • • 發佈:2021-01-09
技術標籤:Spring-Bootjavaspring boot郵件
概述
要傳送郵件,必須藉助已有的SMTP服務。要麼藉助本地安裝的郵箱客戶端,要麼藉助網路郵箱的SMTP服務。
從本地直接憑空將資訊傳送到某個指定郵箱是做不到的。
這裡使用網路郵箱的SMTP服務。
開啟SMTP服務
網路郵箱的SMTP服務預設都是關閉的,需要進入設定後開啟。
所有網路郵箱開啟SMTP服務的方式都基本相同。這裡以QQ郵箱為例。開啟郵箱後點擊設定,選擇其下的賬戶選項卡:
向下找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務,然後將其中的IMAP/SMTP服務開啟。
注意後面的 (什麼是 IMAP,它又是如何設定?) ,點選後彈出說明,在裡面可以看到QQ郵箱的傳送郵件伺服器
點選開啟IMAP/SMTP服務,會彈窗提示需要用繫結的手機發簡訊到指定號碼:
傳送後,點選我已傳送,就會開啟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
字尾的檔案,否則收不到。