SpringBoot擴展——發送郵件!

發送郵件

在日常工作和生活中經常會用到電子郵件。例如,當注冊一個新賬戶時,系統會自動給注冊郵箱發送一封激活郵件,通過郵件找回密碼,自動批量發送活動信息等。郵箱的使用基本包括這幾步:先打開瀏覽器并登錄郵箱,然后創建郵件再發送郵件。在這個過程中有大量的重復性工作且不能批量發送郵件,說明手動的方式效率太低。本節就介紹如何通過代碼完成發送郵件的功能。

SMTP與發送一封郵件的步驟

電子郵件在網絡中傳輸時需要遵從協議,常用的電子郵件協議包括SMTP、POP3、IMAP。其中,郵件的創建和發送只需要使用SMTP(Simple MailTransfer Protocol,簡單郵件傳輸協議)。

如果需要給客戶發送郵件,可以直接使用Java代碼發送。發送郵件的過程是先登錄指定的郵箱,然后再給用戶發送郵件,因此需要配置郵箱的權限或者SMTP。本小節以QQ郵箱作為收件人,介紹怎么配置163郵箱發送郵件。首先登錄163郵箱,選擇“設置”標簽,就會看到設置頁面如圖6.14所示。

必須開啟IMAP/SMTP服務和POP3/SMTP服務,開啟后可以看到服務器的地址,然后就可以使用Java配置163郵箱發送郵件了,這個很重要。

在網頁上創建并發送一封電子郵件的步驟如下:

(1)創建一個郵件對象(MimeMessage)。

(2)設置發件人、收件人,可以增加多個收件人、抄送人。

(3)設置郵件的主題(標題)。

(4)設置郵件的正文(內容)。

(5)設置郵件的發送時間。

(6)發送郵件。

同理,在Java中發送郵件的步驟和上面相似,完成上述步驟就能成功發送郵件,具體的代碼實現后面會詳細介紹。

實戰:使用Java Mail發送郵件

前面簡述了郵件的發送過程,下面使用Java的API完成郵件的發送。

(1)在pom.xml中添加E-mail的依賴坐標:

<dependency>

<groupId>com.sun.mail</groupId>

<artifactId>javax.mail</artifactId>

<version>1.6.2</version>

</dependency>

(2)編寫發送郵件的代碼:

package com.example.springextenddemo.email;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

import java.util.Date;

import java.util.Properties;

/**

* Java 發送郵件

*/

public class JavaSendMailDemo {

/**

* 郵箱賬戶

*/

public static String emailAddress = "changhe626@163.com";

/**

* 授權碼 */

public static String emailPassword = "OTLXYXXOELTJRMSO";

// 發件人郵箱的SMTP服務器地址

public static String smtpHost = "smtp.163.com";

public static void main(String[] args) throws Exception {

// 1. 創建參數配置,用于連接郵件服務器的參數配置

Properties props = new Properties();

// 使用的協議(JavaMail規范要求)

props.setProperty("mail.transport.protocol", "smtp");

// 發件人郵箱的SMTP服務器地址

props.setProperty("mail.smtp.host", smtpHost);

// 是否需要請求認證

props.setProperty("mail.smtp.auth", "true");

// 2. 根據配置創建會話對象,用于和郵件服務器進行交互

Session session = Session.getInstance(props);

// 設置為debug模式,觀察詳細的發送日志

session.setDebug(true);

// 3. 創建一封郵件

MimeMessage message = createMimeMessage(session,

emailAddress,"1507775353@qq.com");

// 4. 根據 Session 獲取郵件傳輸對象

Transport transport = session.getTransport();

//5. 輸入郵箱賬號和密碼連接郵件服務器,這里認證的郵箱必須與message中的發

件人郵箱一致,否則會報錯

transport.connect(emailAddress, emailPassword);

// 6.給所有的收件地址發送郵件,message.getAllRecipients() 獲取的是在

創建郵件對象時添加的所有收件人、抄送人、密送人

transport.sendMessage(message, message.getAllRecipients());

// 7. 關閉連接

transport.close();

System.out.println("完成郵件的發送");

}

/**

* 創建一封只包含文本的簡單郵件

* @param session 和服務器交互的會話

* @param sendMailAddress 發件人郵箱

* @param receiveMailAddress 收件人郵箱

* @return * @throws Exception

*/

public static MimeMessage createMimeMessage(Session session,

String sendMailAddress,

String receiveMailAddress) throws Exception {

// 1. 創建一封郵件

MimeMessage message = new MimeMessage(session);

// 2. From: 發件人

message.setFrom(new InternetAddress(sendMailAddress, "紫龍

神","UTF-8"));

// 3. To: 收件人(可以增加多個收件人、抄送和密送)

message.setRecipient(MimeMessage.RecipientType.TO, new

Internet Address(receiveMailAddress, "你好", "UTF-8"));

// 4. Subject: 郵件主題

message.setSubject("你好,請問你吃飯了沒有啊", "UTF-8");

// 5. Content: 郵件正文(可以使用HTML標簽)

message.setContent("你好,許久不見,想問問你吃飯了沒有啊",

"text/html; charset=UTF-8");

// 6. 設置發件時間

message.setSentDate(new Date());

// 7. 保存設置

message.saveChanges();

return message;

}

}

上述代碼演示了郵件從創建到發送的過程。運行代碼,控制臺上打印的發送郵件的日志如圖6.15所示,發件箱的發送記錄如圖6.16所示,收件箱的收件記錄如圖6.17所示。可以看到,已經成功發送郵件。

說明:在實際開發中,一般會把郵件發送封裝成一個工具類,然后再配置一個只發送郵件的郵箱,最后直接調用工具類完成郵件的發送。

實戰:Spring Boot集成郵件發送

Spring Boot為郵件發送功能提供了自動配置類,開發者只需要加入相關依賴,然后再配置郵箱的基本信息就可以發送郵件了,相較于郵件發送工具,類更加簡便。

下面介紹在Spring Boot項目中如何實現郵件發送的功能。

(1)在application.properties中添加E-mail配置文件,內容如下:

#email config

spring.mail.host=smtp.163.com

spring.mail.port=25

spring.mail.username=changhe626@163.com

spring.mail.password=OTLXYXXOELTJRMSO

spring.mail.default-encoding=UTF-8

spring.mail.properties.mail.debug=true

(2)編寫郵件發送的服務類和具體方法:

package com.example.springextenddemo.email;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.mail.SimpleMailMessage;

import org.springframework.mail.javamail.JavaMailSender;

import org.springframework.stereotype.Service;

import java.util.Date;

@Service

public class SpringEmailService {

@Autowired

private JavaMailSender javaMailSender;

/**

* 輸入發件人的郵箱地址

*/

@Value("${spring.mail.username}")

private String from;

public void sendSimpleMail() {

SimpleMailMessage message = new SimpleMailMessage();

message.setSubject("Spring 郵件發送");

message.setFrom(from);

message.setTo("1507775353@qq.com");

message.setSentDate(new Date());

message.setText("這是使用Spring發送郵件");

javaMailSender.send(message);

}

}

(3)新建一個郵件發送的Controller作為Web入口,其中包括發送郵件的方法:

package com.example.springextenddemo.controller;

import com.example.springextenddemo.email.SpringEmailService;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class EmailController {

@Autowired

private SpringEmailService springEmailService;

@GetMapping("/sendEamil")

public String sendEmail(){

springEmailService.sendSimpleMail();

return "send success";

}

}

(4)啟動當前項目,訪問localhost:8080/sendE mail,在控制臺能看到郵件發送成功的提示。查看控制臺打印的日志,如圖6.18所示,收件箱收到的郵件如圖6.19所示。

在Spring Boot中添加完E-mail的依賴和E-mail的配置文件后,SpringBoot會自動把E-mail的配置注入郵件的發送配置類中,不需要再手動配置。

使用的配置類是MailSender- AutoConfiguration,其中的部分源碼如下:

package org.springframework.boot.autoconfigure.mail;

@Configuration(

proxyBeanMethods = false

)

@ConditionalOnClass({MimeMessage.class, MimeType.class,

MailSender.class})

@ConditionalOnMissingBean({MailSender.class})

@Conditional({MailSenderAutoConfiguration.MailSenderCondition.class})

@EnableConfigurationProperties({MailProperties.class})

@Import({MailSenderJndiConfiguration.class, MailSenderProperties

Configuration.class})

public class MailSenderAutoConfiguration {

static class MailSenderCondition extends AnyNestedCondition {

MailSenderCondition() {

super(ConfigurationPhase.PARSE_CONFIGURATION);

}

@ConditionalOnProperty(

prefix = "spring.mail",

name = {"jndi-name"}

)

static class JndiNameProperty {

JndiNameProperty() {

}

}

@ConditionalOnProperty(

prefix = "spring.mail",

name = {"host"}

)

static class HostProperty {

HostProperty() {

}

}

}

}


MailSenderAutoConfiguration類中可以看到還導入了另外一個配置類,即Mail-?SenderPropertiesConfiguration類,其部分源碼如下:

@Configuration(

proxyBeanMethods = false

)

@ConditionalOnProperty(

prefix = "spring.mail",

name = {"host"}

)


MailSenderPropertiesConfiguration類獲取application.properties中E-mail的配置文件,把application.properties中E-mail的相關配置組裝成E-mail的配置對象,然后注入Spring容器中,這樣用戶就可以方便地發送Email,不需要再手動配置E-mail信息了。

擴展知識——郵件格式

電子郵件因為其傳播的廣泛性,所以必須具備公共認同的格式,以便于客戶端郵箱軟件識別、拆解相應的信息。

電子郵件本身是由ASCII字符構成,總體上分為郵件頭和郵件體兩部分,允許字符編碼、附件和壓縮等多樣化的格式。郵件體實際上是由一行行的字符構成的簡單序列,它和郵件頭是靠一個空行(該行只有一個回車換行符CRLF)來區分的。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/87585.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87585.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/87585.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【html】iOS26 液態玻璃實現效果

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>液體玻璃效果演示</title><style>bo…

探索算法秘境:量子隨機游走算法及其在圖論問題中的創新應用

目錄 ?編輯 一、量子隨機游走算法的起源與原理 二、量子隨機游走算法在圖論問題中的創新應用 三、量子隨機游走算法的優勢與挑戰 四、結語 在算法研究的浩瀚星空中&#xff0c;總有一些領域如同遙遠星系&#xff0c;閃爍著神秘而誘人的光芒。今天&#xff0c;我們將一同深…

C# 一維數組和矩形數組全解析

在編程的世界里&#xff0c;數組是一種非常重要的數據結構。今天&#xff0c;我們就來詳細了解一下一維數組和矩形數組。 數組基礎認知 數組實例是從 System.Array 繼承類型的對象。由于它從 BCL 基類派生而來&#xff0c;所以繼承了許多有用的成員&#xff1a; Rank 屬性&a…

WebStorm編輯器側邊欄

目錄 編輯器側邊欄行號配置行號隱藏行號 代碼折疊側邊欄圖標書簽添加匿名書簽添加助記符書簽 運行和調試管理斷點配置斷點圖標 版本控制配置Git Blame注釋 編輯器側邊欄 編輯器左側的垂直區域。當編寫代碼時&#xff0c;提供重要信息和操作圖標。外觀和行為可以根據你的喜好進…

騰訊云TCCA認證考試報名 - TDSQL數據庫交付運維工程師(PostgreSQL版)

數據庫交付運維工程師-騰訊云TDSQL(PostgreSQL版)認證 適合人群&#xff1a; 適合從事TDSQL(PostgreSQL版)交付、運維、售前咨詢以及TDSQL(PostgreSQL版)相關項目的管理人員。 認證考試 單選*40道多選*20道 成績查詢 70分及以上通過認證&#xff0c;官網個人中心->認證考…

attn_mask 為 (1, 1) 時什么意思? 7,7又是什么意思?

在深度學習中&#xff0c;特別是在 Transformer 模型和注意力機制&#xff08;Attention Mechanism&#xff09;中&#xff0c;attn_mask&#xff08;注意力掩碼&#xff09;是一個用于控制注意力計算的張量。它決定了在計算注意力分數時&#xff0c;哪些位置應該被關注&#x…

Qt聯合Halcon開發二:Halcon窗口綁定Qt控件顯示Hobject圖像【詳細圖解流程】

1. 項目準備 在本項目中&#xff0c;我們將使用Qt框架與Halcon庫結合&#xff0c;展示圖像并進行圖像處理。首先&#xff0c;確保你已經配置好Qt和Halcon的開發環境。 環境配置可查看上篇文章 2. 創建Qt界面 在Qt中&#xff0c;創建一個窗口并拖入按鈕和Graphics View控件。G…

Redis 持久化機制詳解:RDB、AOF 原理與面試最佳實踐(AOF篇)

在上一章我們深入學習了 Redis 中重要的數據持久化機制 ——RDB&#xff08;Redis Database&#xff09;&#xff0c;了解了其通過周期性快照將數據以二進制文件形式保存到磁盤的原理&#xff0c;包括觸發條件、文件結構以及優缺點等核心內容。 Redis 持久化機制詳解&#xff…

【GateWay】和權限驗證

【GateWay】網關詳解和權限驗證 一、Gateway 核心概念與架構二、路由斷言&#xff08;Route Predicates&#xff09;詳解三、過濾器&#xff08;Filters&#xff09;機制四、權限認證的核心理論模型五、Spring Cloud Gateway Security OAuth2 集成方案六、OAuth2.0 集成 一、…

QSqlDatabase: QSQLITE driver not loaded

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言可能的原因解決辦法1. 確認 SQLite 驅動插件文件2. 拷貝插件文件到應用程序目錄3. 設置插件搜索路徑4. 安裝 SQLite 依賴庫5. 解決 QCoreApplication 實例問題 …

20250619在榮品的PRO-RK3566開發板的Android13下解決海羅光電有限公司HL070T58C-05屏在啟動的時候出現白色條紋的問題【時序】

20250619在榮品的PRO-RK3566開發板的Android13下解決海羅光電有限公司HL070T58C-05屏在啟動的時候出現白色條紋的問題 2025/6/19 20:39 緣起&#xff1a;榮品的PRO-RK3566開發板的Android13下&#xff0c;點亮海羅光電有限公司HL070T58C-05屏。 在啟動的時候會出現花屏/白色條紋…

docker使用Volume對Nginx進行掛載

需求&#xff1a; 需要將Nginx的歡迎頁面也就是index.html文件進行修改。 原始方法&#xff1a;由于docker會為每一個容器創建其對應的文件信息&#xff0c;但是創建的信息內容只有其最基礎的運行信息&#xff0c;所以想要直接去訪問其index.html就無法做到。 使用volume&am…

基于springboot的寵物服務預約系統

博主介紹&#xff1a;java高級開發&#xff0c;從事互聯網行業六年&#xff0c;熟悉各種主流語言&#xff0c;精通java、python、php、爬蟲、web開發&#xff0c;已經做了六年的畢業設計程序開發&#xff0c;開發過上千套畢業設計程序&#xff0c;沒有什么華麗的語言&#xff0…

idea 2025會在用戶目錄創建IdeaSnapshots文件夾

推薦一個api管理測試工具 一個簡單的API測試和編寫文檔的工具 idea 2025會在用戶目錄創建IdeaSnapshots文件夾 解決方案 打開 Profiler 點擊 setting 參考 https://youtrack.jetbrains.com/articles/SUPPORT-A-1086/How-to-change-or-turn-off-the-IdeaSnapshots-folder-…

【Mini-F5265-OB開發板試用測評】2、PWM驅動遙控車RX2接收解碼帶馬達驅動控制IC

手頭有帶轉向電機和動力電機小車底盤&#xff0c;買了很久一直在吃灰。 最近查了一下小車的驅動IC是富滿微的8D420L,是一款傳統的RX2接收解碼芯片&#xff0c;帶馬達驅動。 手頭沒有TX2發送芯片&#xff0c;所以考慮用MCU直接發送PWM直接接入RX2&#xff0c;可能可以驅動。 一…

Tcpdump網絡抓包工具詳解!

一、簡介 tcpdump就是&#xff1a;dump the traffic on a network&#xff0c;根據使用者的定義對網絡上的數據包進行截獲的包分析工具。 tcpdump是一個用于截取網絡分組&#xff0c;并輸出分組內容的工具。憑借強大的功能和靈活的截取策略&#xff0c;使其成為類UNIX系統下用…

Spring Boot的Security安全控制——應用SpringSecurity!

應用Spring Security 前面介紹了在項目開發時為什么選擇Spring Security&#xff0c;還介紹了它的原理。本節開始動手實踐Spring Security的相關技術。 實戰&#xff1a;Spring Security入門 現在開始搭建一個新項目&#xff0c;實踐一個Spring Security的入門程序。 &…

FPGA基礎 -- Verilog行為級建模之alawys語句

Verilog 中的 always 語句塊&#xff0c;這是行為級建模的核心結構之一&#xff0c;在 RTL 級設計中廣泛用于時序邏輯和組合邏輯的建模。 一、什么是 always 語句&#xff1f; ? 定義&#xff1a; always 語句用于描述可綜合的硬件行為邏輯&#xff0c;表示一個**“事件驅動…

【力扣 簡單 C】704. 二分查找

目錄 題目 解法一&#xff1a;二分查找 題目 解法一&#xff1a;二分查找 int find(const int* nums, int size, int target) {int left 0, right size - 1;while (left < right){int mid (left right) / 2;if (nums[mid] < target)left left 1;else if (nums[m…

Java并發編程實戰 Day 30:并發編程未來展望與最佳實踐總結

【Java并發編程實戰 Day 30】并發編程未來展望與最佳實踐總結 文章簡述 經過30天的系統學習&#xff0c;我們從Java并發編程的基礎知識逐步深入到高并發系統的架構設計與性能優化。本文作為“Java并發編程實戰”系列的收官之作&#xff0c;將全面回顧整個系列的核心內容&#…