
Generate by ChatGPT
最近在工作上有機會接觸到 SMTP(Simple Mail Transfer Protocol)。以前對它的印象是「一個處理信件的中介系統」,類似於訊息傳遞中的 broker,負責把信件整理再發送出去。為了擺脫這種一知半解的狀態,於是深入了研究其原理,發現其實不難理解,也難怪它的名字裡帶有 Simple。
本系列預計會分成三篇:
- 第一篇:介紹 SMTP 的基本原理、工作流程、常見的使用方式與加密機制
- 第二篇:建立 SMTP Server,探討自建過程中的各種細節
- 第三篇:延伸應用,將 SMTP 與 Google 行事曆、LINE Notify、股價變化等功能結合
接下來進入正題,什麼是 SMTP?顧名思義它就是一個信件傳輸協定,把信件從寄信端發送到收信端。整個流程大概是這樣(名詞後續會慢慢解釋):
- 使用者寄信
- 寄件方 MTA 處理
- 寄件方與收件方建立 SMTP 連線(Port 25/465/587)
- 收件方 MTA 接收,檢查 SPF、DKIM、黑名單與垃圾郵件等
- MDA 投遞,將信件存放到使用者的信箱
- 收信人讀取信件,使用者透過 POP 或是 IMAP 連線方式收信
1. 使用者寄信
使用者透過郵件客戶端(如 Outlook、Gmail Web)撰寫信件後,MUA 會將信件傳遞給寄件方的 MTA 進行處理。
*MUA(Mail User Agent)- 使用者代理,使用者用來閱讀、撰寫、發送和管理電子郵件的應用程式或軟體
*MTA(Mail Transfer Agent)- 郵件發送代理,主要負責郵件的路由與轉發。SMTP Server 就是 MTA 的一種實作
2. 寄件方 MTA 處理 & 3. 寄件方與收件方建立 SMTP 連線
寄件方 MTA 收到待發送的信件後,會經過以下幾個步驟:
- 讀取收件人地址:解析收件人信箱(如
[email protected]),分離出使用者帳號(Alan)與網域名稱(gmail.com)。 - 查找收件方伺服器:向 DNS 伺服器查詢該網域名稱的 MX Record(Mail Exchange Record),以取得負責接收該網域郵件的伺服器清單。
- 建立 SMTP 連線並發送信件:根據查詢結果,使用 SMTP 協定(通常是 Port 25/465/587)與收件方 MTA 建立連線並發送信件。為確保傳輸安全,通常會使用 TLS 加密。若暫時無法連線,信件會被放入重試佇列(Queue),並按策略重新嘗試發送。
*Port 25 - 主要用途為 MTA 與 MTA 之間的郵件傳輸,但因缺乏強制加密且易被用於發送垃圾郵件,在實務上許多網路會封鎖此埠位的對外連線
*Port 465 - 使用者對 MTA 發送郵件使用,用於 SSL/TLS 加密,已經比較少使用
*Port 587 - 用於 MUA 向 MTA 提交郵件,使用 STARTTLS(先連線再升級為加密),是目前實務上通用的 port - 紀錄與通知:MTA 會記錄信件的投遞狀態。若最終投遞失敗或重試超過次數上限,系統會產生退信通知(Bounce Mail)並返回給寄件人。
- 讀取收件人地址:解析收件人信箱(如
- 收件方 MTA 處理
當寄件方 MTA 將郵件送到收件方 MTA 時,收件方 MTA 會進行多種檢查以確保郵件的合法性與安全性:
- SPF(Sender Policy Framework)檢查:核對寄件人的 IP 地址是否在其網域名稱的 SPF 記錄所授權的發送伺服器清單中。若檢查失敗,郵件可能被標記為垃圾郵件或拒絕接收。
- DKIM(DomainKeys Identified Mail)驗證:檢查郵件中的數位簽章,以驗證郵件在傳輸過程中未被竄改,且確實來自其所聲稱的網域。
- 黑名單檢查:查詢寄件伺服器的 IP 或網域名稱是否被列入已知的垃圾郵件黑名單(DNSBL/RBL)。
*DNSBL(DNS-based Blackhole List) 與 RBL(Realtime Blackhole List),是透過 DNS 查詢的方式,提供郵件伺服器用來判斷「寄件 IP 是否有垃圾郵件紀錄」的黑名單系統。 - 垃圾郵件與惡意軟體過濾:綜合評估郵件標題、內容、附件等,並使用演算法判斷其為垃圾郵件的可能性。同時會掃描附件是否含有病毒或惡意軟體。
- SPF(Sender Policy Framework)檢查:核對寄件人的 IP 地址是否在其網域名稱的 SPF 記錄所授權的發送伺服器清單中。若檢查失敗,郵件可能被標記為垃圾郵件或拒絕接收。
- MDA 投遞
MDA(Mail Delivery Agent,郵件投遞代理)是郵件系統中負責「最終投遞」的應用。當郵件通過收件方 MTA 的所有安全檢查後,便會交由 MDA 處理,其任務是將郵件準確地存入收件人的信箱中。
核心功能:
- 存入信箱:根據收件者帳號,將郵件寫入對應的實體信箱中。儲存位置可能是伺服器上的特定檔案(如
/var/mail/username)或資料庫。 - 信件處理:可執行進階操作,例如根據自訂規則進行自動分類、過濾(如將特定信件歸檔至資料夾),或執行自動轉寄(forwarding)。
- 存入信箱:根據收件者帳號,將郵件寫入對應的實體信箱中。儲存位置可能是伺服器上的特定檔案(如
- 收信人讀取信件
當郵件已投遞至信箱後,收件人會透過 MUA (Mail User Agent),使用郵件收取協定從伺服器上取得信件。主要的協定有以下兩種:
- POP (Post Office Protocol):將郵件從伺服器下載到本地端設備(如電腦、手機),並通常會從伺服器上刪除原始郵件。常使用在單一設備的使用者,優點是可以離線閱讀並且節省空間。
- IMAP (Internet Message Access Protocol):郵件始終保留在伺服器上,用戶在客戶端(如 Outlook、手機 App)上的所有操作(讀取、刪除、移動郵件)都會與伺服器雙向同步。適合在多台設備存取信箱的使用者,是目前最常見的做法。
- POP (Post Office Protocol):將郵件從伺服器下載到本地端設備(如電腦、手機),並通常會從伺服器上刪除原始郵件。常使用在單一設備的使用者,優點是可以離線閱讀並且節省空間。

gmail 預設為 IMAP 模式
本篇介紹了 E-mail 傳輸的完整流程,過程中使用的專有名稱比較多,從 MUA、MTA 到 MDA,再到 SMTP、POP、IMAP 等協定,初次接觸需要一點時間慢慢消化。只要仔細思考會發現整個生命週期其實相當清晰直觀:從寄信 MUA > 寄件方 MTA > 收件方 MTA > MDA > 收信 MUA。
理解這些基礎理論之後,下一篇會帶大家實際建立自己的 SMTP Server,並透過簡單的程式範例演示如何將信件寄出去,這樣會更了解這個應用。以上內容如果有描述不精確或是需要補充的地方,再麻煩指正一下,非常感謝!



























