【計算機網路筆記】2.3 Electronic Mail in the Internet
【計算機網路筆記】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 Source:Computer Networking: A Top-Down Approach (8th ed., p. 147, Figure 2.14)
上圖中呈現一份網際網路郵件系統的高層級觀點,可看到有三個主要元件:
- 使用者代理(User Agent):
- 解釋:用來寫信和讀信的軟體。例如 Gmail、Microsoft Outlook、iCloud 等等。
- 功能:讓使用者撰寫、回覆、閱讀郵件。當寫好信按下傳送後,使用者代理就會把信交給郵件伺服器。
- 郵件伺服器(Mail Server):
- 解釋:電子郵件系統的核心,相當於郵局。
- 功能:
- 信箱(Mailbox):用來存放別人寄的信(收件)。
- 訊息佇列(Message Queue):當要寄信時,郵件會先排在這裡,等待被送出去(寄件)。
- 簡單郵件傳輸協定(Simple Mail Transfer Protocol, SMTP):
- 解釋:郵件伺服器之間用來傳輸郵件的規則,相當於負責長途運輸的郵差卡車。
- 功能:使用 TCP 協定來確保郵件能可靠地從發信伺服器傳送到收信伺服器。
2.3.1 SMTP
SMTP(Simple Mail Transfer Protocol)是網際網路電子郵件的核心傳輸協定。
為什麼需要 SMTP?當按下傳送後,郵件需要跨越網際網路到達對方的伺服器。SMTP 提供了標準化的規則,確保不同廠牌、不同地點的伺服器能互相交談並傳遞訊息。
核心特徵:SMTP 基於 TCP 的應用層協定,表示其非常重視可靠性,郵件必須準確無誤地送達,不能像 UDP 那樣允許掉包。
術語解析
正式進入流程前,先了解這些術語吧:
- SMTP 客戶端與伺服器(SMTP Client & Server):
- 注意:這裡的「客戶端」和「伺服器」是指郵件伺服器內部執行的行程(Process)。
- 當郵件伺服器要「寄信」給別的伺服器時,扮演 SMTP 客戶端。
- 當郵件伺服器要「收信」(從別的伺服器接收)時,扮演 SMTP 伺服器。
- 直接連線(Direct Connection):
- SMTP 通常不經過中繼站。
- 如果 Alice 在香港,Bob 在聖路易斯,則 Alice 的伺服器會建立一條 TCP 連線,「直接」連到 Bob 的伺服器,中間不會經過第三方的郵件伺服器轉手。
- 如果 Bob 的伺服器掛了,郵件會留在 Alice 的伺服器上排隊重試,而不是丟給中間人。
- 7-bit ASCII 限制:
- 這是一個「歷史遺留問題」。
- SMTP 設計之初(1980年代),網路頻寬珍貴,且沒人傳送大圖片,因此,SMTP 限制郵件體必須是 7-bit ASCII 文字。
- 現今影響:這就是為什麼今天我們要傳送圖片、影片時,必須先經過編碼(如 Base64),把它們偽裝成 ASCII 文字才能傳送。
SMTP 運作流程範例
- 撰寫:Alice 用他的 User Agent(使用者代理,如 Gmail)寫信給
bob@someschool.edu,並指示 User Agent 發送。 - 佇列:Alice 的 User Agent 將郵件推送到他的郵件伺服器,郵件被放入訊息佇列(Message Queue)等待發送。
- 連線:Alice 伺服器上的 SMTP 客戶端發現佇列中有信,於是向 Bob 的伺服器(運作在主機
someschool.edu上)發起建立 TCP 連線(目標連接埠25)。 - 交握:TCP 連線建立後,進行 SMTP 應用層交握(自我介紹)。
- 傳送:SMTP 客戶端透過 TCP 連線發送 Alice 的訊息。
- 接收:Bob 的伺服器(SMTP 伺服器端)接收訊息,並將其放入 Bob 的信箱(Mailbox)。
如果步驟 3 失敗,例如 Bob 的伺服器沒開機,Alice 的伺服器會稍後重試,不會丟棄郵件。

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」。 |
| S | 250 Hello crepes.fr, pleased to meet you | 確認:「收到,很高興見到你」。(250 代表 OK) |
| C | MAIL FROM: <alice@crepes.fr> | 發信人:「這封信是 Alice 寫的」。 |
| S | 250 alice@crepes.fr ... Sender ok | 確認:「寄件人沒問題」。 |
| C | RCPT TO: <bob@hamburger.edu> | 收信人:「我要寄給 Bob」(RCPT 為 Recipient 的縮寫) |
| S | 250 bob@hamburger.edu ... Recipient ok | 確認:「收件人存在,沒問題」。 |
| C | DATA | 請求發送內容:「我要開始傳送內容了」。 |
| S | 354 Enter mail, end with "." on a line by itself | 同意:「請輸入內容,最後用單獨一行『.』結束」。 |
| C | Do you like ketchup? | (郵件內容…) |
| C | How about pickles? | (郵件內容…) |
| C | . | 結束符號:單獨一行的句號代表內容結束(CRLF.CRLF)。 |
| S | 250 Message accepted for delivery | 接收成功:「郵件已接收」。 |
| C | QUIT | 道別:「我沒事了,掰掰」。 |
| S | 221 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/EHLO、MAIL FROM、RCPT TO或DATA等指令並成功處理時,會回傳此代碼,代表郵件已順利被接納並傳輸。
- 當伺服器接收到
- 354:開始郵件輸入(Start mail input)的成功狀態代碼,意即郵件伺服器已準備好接收電子郵件內容(郵件主旨與本文)。
- 伺服器收到 DATA 指令後回傳此代碼,並等待用戶端以單獨一行輸入點號
.(CRLF.CRLF)來結束郵件傳輸。
- 伺服器收到 DATA 指令後回傳此代碼,並等待用戶端以單獨一行輸入點號
- 221:服務關閉傳輸通道(Service closing transmission channel)。
- 此為 SMTP 伺服器在接收到
QUIT命令後,正常終止與用戶端連線的狀態碼,表示郵件傳輸任務完成或會話結束。 - 此代碼通常為正常操作,但若在郵件發送中途出現,則可能代表連線被強制中斷或認證失敗。
- 此為 SMTP 伺服器在接收到
2.3.2 Mail Message Formats(郵件訊息格式)
這節的核心在於定義電子郵件本身的內容格式。
SMTP 是傳輸協定(像是郵差),而該節講的是郵件本身的寫法(像是郵件上的格式),由 RFC 5322 標準定義。
術語解析
- 標頭列(Header Lines):
- 位於郵件的最上方,包含像是
To:、From:、Subject:等資訊。 - 每一行都包含一個關鍵字,後面跟著冒號,然後是內容值。
- 位於郵件的最上方,包含像是
- 空白行(Blank Line):
- 用來分隔「標頭」與「內文」。
- 在電腦世界裡,通常是一個
CRLF(Carriage Return + Line Feed)。
- 訊息內文(Body):真正寫給對方的內容,位於空白行之後。
郵件標準結構
一封標準的電子郵件(RFC 5322)長這樣:
1 | From: alice@crepes.fr <-- 標頭 (Header) |
- 必要的標頭:
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 能不能用來收信?」答案為否,因為它是設計用來推送的協定。
術語解析
該節介紹了兩個現代最主流的郵件存取方式:
- HTTP(HyperText Transfer Protocol):
- 解釋:現在絕大多數人(用 Gmail、Outlook Web 版本等)皆透過瀏覽器或手機 App,利用 HTTP 協定從伺服器讀取郵件。
- 特點:方便,不需要安裝專用的郵件軟體。
- 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 運作流程:
- 連線:客戶端程式向伺服器建立 TCP 連線。
- 認證:使用者輸入帳號密碼登入。
- 交易:用戶端下達指令(如
RETR抓取郵件、DELE標記刪除)。 - 更新:中斷連線前,伺服器正式執行刪除動作並結束工作。
:::
完整的郵件傳輸路徑
假設 Alice(使用 Web-based email)寄信給 Bob(使用 Outlook 軟體)。
- Alice → Alice 的郵件伺服器:
- 協定:HTTP(或 SMTP,取決於他用的是網頁還是軟體)。
- 動作:Alice 在瀏覽器寫好信,透過 HTTP 傳送到他的伺服器。
- Alice 的郵件伺服器 → Bob 的郵件伺服器:
- 協定:SMTP。
- 動作:伺服器之間的對話。Alice 的伺服器扮演 SMTP Client,Bob 的伺服器扮演 SMTP Server,信件被推送過去。
- Bob 的郵件伺服器 → Bob(User Agent):
- 協定:IMAP(或 HTTP)。
- 動作:Bob 的電腦扮演 Client,主動去連線伺服器,驗證帳號密碼後,把郵件清單或內容取回。

Image Source:Computer Networking: A Top-Down Approach (8th ed., p. 152, Figure 2.16)
SMTP vs. Mail Access Protocols
| 比較項 | SMTP | Mail 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 標準對話流程
基本順序:
- 220 → 伺服器準備好
- HELO / EHLO → 客戶端打招呼
- MAIL FROM → 指定寄件者
- RCPT TO → 指定收件者
- DATA → 開始傳送內容
- CRLF.CRLF → 單獨一行「
.」表示結束 - 250 → 接收成功
- QUIT → 結束連線
- 221 → 關閉通道
重要概念:
- 持續連線(Persistent Connection):可在同一 TCP 連線中寄多封信。
- SMTP 是「命令+回應」的應用層協定。
郵件內容格式(RFC 5322)
SMTP 負責「送信」。
RFC 5322 定義「信的格式」。
標準郵件結構:
- 標頭列(Header Lines):
- 位於郵件的最上方,包含像是
To:、From:、Subject:等資訊。 - 必填欄位:
From:、To:。 - 每一行都包含一個關鍵字,後面跟著冒號,然後是內容值。
- 位於郵件的最上方,包含像是
- 空白行(Blank Line):
- 用來分隔「標頭(Header)」與「內文(Body)」。
- 在電腦世界裡,通常是一個
CRLF(Carriage Return + Line Feed)。
- 訊息內文(Body):真正寫給對方的內容,位於空白行之後。
1 | Header |
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:
- Alice → 自己的郵件伺服器。
- HTTP 或 SMTP
- Alice 伺服器 → Bob 伺服器。
- SMTP(Push)
- Bob → 自己的伺服器。
- IMAP 或 HTTP(Pull)
為什麼需要中繼伺服器?
若沒有寄件者伺服器:
- 使用者必須自行重試。
- 必須長時間開機。
- 錯誤處理複雜。
透過中繼伺服器:
- 使用者只需成功提交一次。
- 伺服器自動重試。
- 提高可靠性。
- 支援非同步通訊。
