【計算機網路筆記】2.3 Electronic Mail in the Internet

Hello Guys, I’m LukeTseng. 歡迎你也感謝你點入本篇文章,本系列主要讀本為《Computer Networking: A Top-Down Approach, 8th Edition》,就是計算機網路的聖經,會製作該系列也主要因為修課上會用到。若你喜歡本系列或本文,不妨動動你的手指,為這篇文章按下一顆愛心吧,或是追蹤我的個人公開頁也 Ok。


電子郵件系統的核心在於提供一種非同步(Asynchronous)的通訊方式。

什麼意思?就像傳統的郵政服務,寄信時,收件人不需要坐在家裡等,寄件人寫好信丟進郵筒,系統會負責傳遞到收件人的郵箱,對方有空時再開箱讀取。

電子郵件的出現打破了時間的限制,不需要通訊雙方同時在線(Always-on)也能交換資訊,且成本極低、速度快。

image

Image Source:Computer Networking: A Top-Down Approach (8th ed., p. 147, Figure 2.14)

上圖中呈現一份網際網路郵件系統的高層級觀點,可看到有三個主要元件:

  1. 使用者代理(User Agent):
    • 解釋:用來寫信和讀信的軟體。例如 Gmail、Microsoft Outlook、iCloud 等等。
    • 功能:讓使用者撰寫、回覆、閱讀郵件。當寫好信按下傳送後,使用者代理就會把信交給郵件伺服器。
  2. 郵件伺服器(Mail Server):
    • 解釋:電子郵件系統的核心,相當於郵局。
    • 功能:
      • 信箱(Mailbox):用來存放別人寄的信(收件)。
      • 訊息佇列(Message Queue):當要寄信時,郵件會先排在這裡,等待被送出去(寄件)。
  3. 簡單郵件傳輸協定(Simple Mail Transfer Protocol, SMTP):
    • 解釋:郵件伺服器之間用來傳輸郵件的規則,相當於負責長途運輸的郵差卡車。
    • 功能:使用 TCP 協定來確保郵件能可靠地從發信伺服器傳送到收信伺服器。

2.3.1 SMTP

SMTP(Simple Mail Transfer Protocol)是網際網路電子郵件的核心傳輸協定。

為什麼需要 SMTP?當按下傳送後,郵件需要跨越網際網路到達對方的伺服器。SMTP 提供了標準化的規則,確保不同廠牌、不同地點的伺服器能互相交談並傳遞訊息。

核心特徵:SMTP 基於 TCP 的應用層協定,表示其非常重視可靠性,郵件必須準確無誤地送達,不能像 UDP 那樣允許掉包。

術語解析

正式進入流程前,先了解這些術語吧:

  1. SMTP 客戶端與伺服器(SMTP Client & Server):
    • 注意:這裡的「客戶端」和「伺服器」是指郵件伺服器內部執行的行程(Process)。
    • 當郵件伺服器要「寄信」給別的伺服器時,扮演 SMTP 客戶端。
    • 當郵件伺服器要「收信」(從別的伺服器接收)時,扮演 SMTP 伺服器。
  2. 直接連線(Direct Connection):
    • SMTP 通常不經過中繼站。
    • 如果 Alice 在香港,Bob 在聖路易斯,則 Alice 的伺服器會建立一條 TCP 連線,「直接」連到 Bob 的伺服器,中間不會經過第三方的郵件伺服器轉手。
    • 如果 Bob 的伺服器掛了,郵件會留在 Alice 的伺服器上排隊重試,而不是丟給中間人。
  3. 7-bit ASCII 限制:
    • 這是一個「歷史遺留問題」。
    • SMTP 設計之初(1980年代),網路頻寬珍貴,且沒人傳送大圖片,因此,SMTP 限制郵件體必須是 7-bit ASCII 文字。
    • 現今影響:這就是為什麼今天我們要傳送圖片、影片時,必須先經過編碼(如 Base64),把它們偽裝成 ASCII 文字才能傳送。

SMTP 運作流程範例

  1. 撰寫:Alice 用他的 User Agent(使用者代理,如 Gmail)寫信給 bob@someschool.edu,並指示 User Agent 發送。
  2. 佇列:Alice 的 User Agent 將郵件推送到他的郵件伺服器,郵件被放入訊息佇列(Message Queue)等待發送。
  3. 連線:Alice 伺服器上的 SMTP 客戶端發現佇列中有信,於是向 Bob 的伺服器(運作在主機 someschool.edu 上)發起建立 TCP 連線(目標連接埠 25)。
  4. 交握:TCP 連線建立後,進行 SMTP 應用層交握(自我介紹)。
  5. 傳送:SMTP 客戶端透過 TCP 連線發送 Alice 的訊息。
  6. 接收:Bob 的伺服器(SMTP 伺服器端)接收訊息,並將其放入 Bob 的信箱(Mailbox)。

如果步驟 3 失敗,例如 Bob 的伺服器沒開機,Alice 的伺服器會稍後重試,不會丟棄郵件。

image

Image Source:Computer Networking: A Top-Down Approach (8th ed., p. 149, Figure 2.15)

SMTP 協定對話:伺服器之間是如何聊天的?

SMTP 的對話非常像兩個禮貌的人在對話。

假設客戶端主機是 crepes.fr,伺服器主機是 hamburger.edu

方向訊息內容解讀
S(伺服器)220 hamburger.edu服務就緒:伺服器說「我準備好了」。
C(客戶端)HELO crepes.fr打招呼:HELO 為 HELLO 的縮寫,如同說「嗨,我是 crepes.fr」。
S250 Hello crepes.fr, pleased to meet you確認:「收到,很高興見到你」。(250 代表 OK)
CMAIL FROM: <alice@crepes.fr>發信人:「這封信是 Alice 寫的」。
S250 alice@crepes.fr ... Sender ok確認:「寄件人沒問題」。
CRCPT TO: <bob@hamburger.edu>收信人:「我要寄給 Bob」(RCPT 為 Recipient 的縮寫)
S250 bob@hamburger.edu ... Recipient ok確認:「收件人存在,沒問題」。
CDATA請求發送內容:「我要開始傳送內容了」。
S354 Enter mail, end with "." on a line by itself同意:「請輸入內容,最後用單獨一行『.』結束」。
CDo you like ketchup?(郵件內容…)
CHow about pickles?(郵件內容…)
C.結束符號:單獨一行的句號代表內容結束(CRLF.CRLF)。
S250 Message accepted for delivery接收成功:「郵件已接收」。
CQUIT道別:「我沒事了,掰掰」。
S221 hamburger.edu closing connection斷線:伺服器關閉連線。

重點整理:

  • 持續連線(Persistent Connections):如果 Alice 還有別的信要寄給 Bob 同一家公司的其他人,SMTP 可以利用同一條 TCP 連線繼續發送(MAIL FROM …),不用重新建立連線,可節省時間。
  • 結束符號:SMTP 使用單獨一行的句點(.)來告訴伺服器「講完了」,在 ASCII 術語中表示為 CRLF.CRLF
  • SMTP 狀態碼:
    • 220:服務就緒(Service Ready)。
    • 250:要求郵件動作已完成(Requested mail action okay, completed)。
      • 當伺服器接收到 HELO/EHLOMAIL FROMRCPT TODATA 等指令並成功處理時,會回傳此代碼,代表郵件已順利被接納並傳輸。
    • 354:開始郵件輸入(Start mail input)的成功狀態代碼,意即郵件伺服器已準備好接收電子郵件內容(郵件主旨與本文)。
      • 伺服器收到 DATA 指令後回傳此代碼,並等待用戶端以單獨一行輸入點號 .CRLF.CRLF)來結束郵件傳輸。
    • 221:服務關閉傳輸通道(Service closing transmission channel)。
      • 此為 SMTP 伺服器在接收到 QUIT 命令後,正常終止與用戶端連線的狀態碼,表示郵件傳輸任務完成或會話結束。
      • 此代碼通常為正常操作,但若在郵件發送中途出現,則可能代表連線被強制中斷或認證失敗。

2.3.2 Mail Message Formats(郵件訊息格式)

這節的核心在於定義電子郵件本身的內容格式。

SMTP 是傳輸協定(像是郵差),而該節講的是郵件本身的寫法(像是郵件上的格式),由 RFC 5322 標準定義。

術語解析

  1. 標頭列(Header Lines):
    • 位於郵件的最上方,包含像是 To:From:Subject: 等資訊。
    • 每一行都包含一個關鍵字,後面跟著冒號,然後是內容值。
  2. 空白行(Blank Line):
    • 用來分隔「標頭」與「內文」。
    • 在電腦世界裡,通常是一個 CRLF(Carriage Return + Line Feed)。
  3. 訊息內文(Body):真正寫給對方的內容,位於空白行之後。

郵件標準結構

一封標準的電子郵件(RFC 5322)長這樣:

1
2
3
4
5
6
From: alice@crepes.fr          <-- 標頭 (Header)
To: bob@hamburger.edu <-- 標頭 (Header)
Subject: Searching for life <-- 標頭 (Header)
<-- 空白行 (Blank Line)
Hi Bob, <-- 內文 (Body)
How are you? <-- 內文 (Body)
  • 必要的標頭:From:To: 是必須存在的。
  • 可選的標頭:Subject:(主旨)雖然很重要,但在技術規範上是可選的。

SMTP 指令 vs. 郵件標頭

「信封上的地址」不一定等於「信紙上的抬頭」。

比較項SMTP郵件標頭
類比信封(Envelope)信紙抬頭(Letterhead)
用途給郵件伺服器(MTA)看的,用於傳遞。給收件人或郵件軟體(MUA)看的,用於顯示。
指令範例MAIL FROM: <alice@crepes.fr>
RCPT TO: <bob@hamburger.edu>
From: Alice <alice@crepes.fr>
To: Bob <bob@hamburger.edu>
影響決定郵件會寄到哪裡、退信退給誰。決定在 Gmail 裡看到是誰寄的。

2.3.3 Mail Access Protocols(郵件存取協定)

該節的核心概念在於區分「推送(Push)」與「取回(Pull)」的不同操作。

Bob 的設備(筆電、手機等)不會 24 小時開機,也不一定隨時連網。

因此,我們不能讓 Alice 的伺服器直接把信推送給 Bob 的個人電腦(如果 Bob 關機,信就沒了)。

解法:郵件必須先存在 Bob 的 郵件伺服器 上。等到 Bob 開機上線時,再由 Bob 的使用者代理主動去伺服器把信取回(Pull)。

與 SMTP 的區別

  • SMTP 是推送式協定(Push Protocol):用於發送(Alice → 伺服器)和轉發(伺服器 → 伺服器)。
  • 郵件存取協定是取回式協定(Pull Protocol):用於接收(伺服器 → Bob)。

因此在這有個考點可以考:「SMTP 能不能用來收信?」答案為否,因為它是設計用來推送的協定。

術語解析

該節介紹了兩個現代最主流的郵件存取方式:

  1. HTTP(HyperText Transfer Protocol):
    • 解釋:現在絕大多數人(用 Gmail、Outlook Web 版本等)皆透過瀏覽器或手機 App,利用 HTTP 協定從伺服器讀取郵件。
    • 特點:方便,不需要安裝專用的郵件軟體。
  2. IMAP(Internet Mail Access Protocol):
    • 解釋:IMAP 是專門為了「存取與管理」郵件而設計的複雜協定(RFC 3501),常見於 Microsoft Outlook, iCloud Mail 等桌面軟體。
    • 特點:
      • 它將郵件保留在伺服器上,並允許使用者在伺服器上建立資料夾、移動郵件。
      • 最重要的是,它也維護了狀態(State)。例如在手機上讀了一封信,伺服器會標記為「已讀」,當回到電腦上看時,它也會顯示為「已讀」。

註:早期還有 POP3(Post Office Protocol - Version 3),稱為郵局協定,但功能較簡單且逐漸被 IMAP 所取代。

:::info
補充說明:

POP3 核心特性:

  • 單向傳輸:POP3 採「下載並刪除」模式,郵件下載到電腦後,預設會從伺服器上刪除。
  • 離線閱讀:下載完成後,即使沒有網路也能在本地設備閱讀信件。
  • 節省空間:由於信件不長期存放在伺服器,能有效節省信箱主機的儲存空間。
  • 通訊埠:預設使用 Port 110,而加密版本(POP3S,當中 S 為 SSH/TLS)則使用 Port 995。

POP3 運作流程:

  1. 連線:客戶端程式向伺服器建立 TCP 連線。
  2. 認證:使用者輸入帳號密碼登入。
  3. 交易:用戶端下達指令(如 RETR 抓取郵件、DELE 標記刪除)。
  4. 更新:中斷連線前,伺服器正式執行刪除動作並結束工作。
    :::

完整的郵件傳輸路徑

假設 Alice(使用 Web-based email)寄信給 Bob(使用 Outlook 軟體)。

  1. Alice → Alice 的郵件伺服器:
    • 協定:HTTP(或 SMTP,取決於他用的是網頁還是軟體)。
    • 動作:Alice 在瀏覽器寫好信,透過 HTTP 傳送到他的伺服器。
  2. Alice 的郵件伺服器 → Bob 的郵件伺服器:
    • 協定:SMTP。
    • 動作:伺服器之間的對話。Alice 的伺服器扮演 SMTP Client,Bob 的伺服器扮演 SMTP Server,信件被推送過去。
  3. Bob 的郵件伺服器 → Bob(User Agent):
    • 協定:IMAP(或 HTTP)。
    • 動作:Bob 的電腦扮演 Client,主動去連線伺服器,驗證帳號密碼後,把郵件清單或內容取回。

image

Image Source:Computer Networking: A Top-Down Approach (8th ed., p. 152, Figure 2.16)

SMTP vs. Mail Access Protocols

比較項SMTPMail Access Protocols(IMAP、HTTP)
方向推送(Push)取回(Pull)
主要用途寄信、伺服器間轉發收信、管理信箱
發起方擁有信件的一方(Sender)想要信件的一方(Receiver)
伺服器角色接收信件並放入佇列或信箱提供信件內容給使用者
使用情境User Agent → Server
Server → Server
Server → User Agent

為什麼需要中繼?

在圖 2.16,為什麼 Alice 不直接把信傳到 Bob 的伺服器,而是要先傳給自己的伺服器?

原因:如果沒有 Alice 的伺服器當作中繼站,Alice 的 User Agent 就必須自己處理所有錯誤。

如果 Bob 的伺服器當機了,或者網路暫時不通:

  • 直接傳:Alice 必須一直開著電腦重試,直到傳送成功,非常不方便。
  • 透過伺服器傳:Alice 只要把信丟給她的伺服器(通常很快且保證成功),就可以關機去睡覺了。他的伺服器會負責在 Bob 伺服器恢復時,反覆重試(例如每 30 分鐘試一次),直到送達。

總整理

電子郵件系統的核心概念:非同步通訊(Asynchronous Communication)

電子郵件的本質是一種非同步通訊機制。

  • 通訊雙方不需同時在線。
  • 郵件可先存放於伺服器。
  • 收件者可在任何時間取回。
  • 成本低、可靠性高、跨地域傳輸快速。

比喻:寄信 → 放入郵局 → 郵局負責轉送 → 收件人有空再讀。

電子郵件系統的三大核心元件

使用者代理(User Agent, UA)

代表使用者操作的軟體,例如:

  • Gmail
  • Microsoft Outlook
  • iCloud

功能:

  • 撰寫、閱讀、回覆郵件。
  • 將郵件提交給郵件伺服器。

郵件伺服器(Mail Server)

電子郵件系統的核心基礎設施。

主要組成:

  • Mailbox(信箱):儲存收到的郵件。
  • Message Queue(訊息佇列):暫存待發送郵件。

如果對方伺服器無法連線,郵件會留在佇列中重試,而不會遺失。

SMTP(Simple Mail Transfer Protocol)

SMTP 是伺服器之間傳送郵件的標準協定。

  • 建立在 TCP 之上。
  • 強調可靠性。
  • 預設使用 Port 25。
  • 採「推送(Push)」模式。

其角色如同長途運輸系統。

SMTP 的核心特性

客戶端與伺服器角色會切換

  • 發送方伺服器 → 扮演 SMTP Client
  • 接收方伺服器 → 扮演 SMTP Server

直接連線(Direct Connection)

SMTP 通常:

  • 發送伺服器直接連線到接收伺服器。
  • 不經第三方轉手。
  • 若失敗則重試。

7-bit ASCII 限制(歷史遺留)

SMTP 初期僅允許 7-bit ASCII 文字。

因此:

  • 圖片、影片需轉為 Base64 編碼。
  • 造成傳輸量增加約 33%。

SMTP 標準對話流程

基本順序:

  1. 220 → 伺服器準備好
  2. HELO / EHLO → 客戶端打招呼
  3. MAIL FROM → 指定寄件者
  4. RCPT TO → 指定收件者
  5. DATA → 開始傳送內容
  6. CRLF.CRLF → 單獨一行「.」表示結束
  7. 250 → 接收成功
  8. QUIT → 結束連線
  9. 221 → 關閉通道

重要概念:

  • 持續連線(Persistent Connection):可在同一 TCP 連線中寄多封信。
  • SMTP 是「命令+回應」的應用層協定。

郵件內容格式(RFC 5322)

SMTP 負責「送信」。

RFC 5322 定義「信的格式」。

標準郵件結構:

  1. 標頭列(Header Lines):
    • 位於郵件的最上方,包含像是 To:From:Subject: 等資訊。
    • 必填欄位:From:To:
    • 每一行都包含一個關鍵字,後面跟著冒號,然後是內容值。
  2. 空白行(Blank Line):
    • 用來分隔「標頭(Header)」與「內文(Body)」。
    • 在電腦世界裡,通常是一個 CRLF(Carriage Return + Line Feed)。
  3. 訊息內文(Body):真正寫給對方的內容,位於空白行之後。
1
2
3
Header
(空白行)
Body

SMTP 與郵件標頭的差異

比較項SMTP郵件標頭
類比信封(Envelope)信紙抬頭(Letterhead)
用途給郵件伺服器(MTA)看的,用於傳遞。給收件人或郵件軟體(MUA)看的,用於顯示。
指令範例MAIL FROM: <alice@crepes.fr>
RCPT TO: <bob@hamburger.edu>
From: Alice <alice@crepes.fr>
To: Bob <bob@hamburger.edu>
影響決定郵件會寄到哪裡、退信退給誰。決定在 Gmail 裡看到是誰寄的。

Mail Access Protocols(收信協定)

SMTP 只能「推送」,不能「收信」。

收信屬於「取回(Pull)」模式。

HTTP

現代 Web-based Email 主流方式:

  • 透過瀏覽器。
  • 不需安裝專用軟體。

例如使用 Gmail Web 版。

IMAP(Internet Mail Access Protocol)

專門設計用來管理郵件。

特點:

  • 郵件保留在伺服器。
  • 可建立資料夾。
  • 支援跨裝置同步。
  • 維護「已讀/未讀」狀態。

常見於:

  • Microsoft Outlook。
  • iCloud。
  • Gmail。

POP3(逐漸被取代)

英文全名:Post Office Protocol v3。

特性:

  • 下載後刪除。
  • 適合單一設備使用。
  • 離線閱讀。
  • Port 110(加密 995)。

缺點:

  • 無法跨裝置同步。
  • 不保留伺服器狀態。

完整郵件傳輸流程

假設 Alice 寄信給 Bob:

  1. Alice → 自己的郵件伺服器。
    • HTTP 或 SMTP
  2. Alice 伺服器 → Bob 伺服器。
    • SMTP(Push)
  3. Bob → 自己的伺服器。
    • IMAP 或 HTTP(Pull)

為什麼需要中繼伺服器?

若沒有寄件者伺服器:

  • 使用者必須自行重試。
  • 必須長時間開機。
  • 錯誤處理複雜。

透過中繼伺服器:

  • 使用者只需成功提交一次。
  • 伺服器自動重試。
  • 提高可靠性。
  • 支援非同步通訊。