在我們登入伺服器輸入任何指令之前,必須先建立一張清晰的「地圖」。
很多初學者在架設 Mail Server 時感到挫折,是因為不知道資料現在流向哪裡:是卡在防火牆?是 DNS 設定錯了?還是資料庫連線失敗?透過理解下面第二點的的三個核心流程,你在除錯時就能精準判斷問題出在哪個環節。
1. 為什麼我們應該選擇 AWS EC2作為初學上手的平台?
雖然你可以在家裡的舊電腦或 Raspberry Pi 上練習,但我強烈建議初學者使用 AWS EC2(或其他雲端 VPS),這能大幅降低「卡關」的機率:
- 擁有乾淨的網路環境:家用網路通常是浮動 IP,且 ISP 經常封鎖郵件所需的 Port 25,這會讓你一開始就無法收信。EC2 提供了標準的網路環境與公網 IP (Public IP)。
- 容錯率與「時光機」:這是最重要的理由。在進行危險設定(例如修改資料庫結構或防火牆)之前,我們可以對 EC2 建立「快照 (Snapshot)」。萬一設定檔改壞了、服務起不來了,不需要重灌系統,一鍵就能還原到壞掉前的狀態。這給了我們大膽嘗試的勇氣。
2. 郵件運作的三大流程
我們將採用業界標準的 Postfix + Dovecot + MariaDB (MySQL) 組合。為了方便管理,我們使用「虛擬使用者」架構,將所有帳號、網域儲存在資料庫中,而非 Linux 系統帳號。
流程一:別人寄信給你 (Incoming Mail)
當網路上有人(postmaster@mydomain.com)寄信給你(username@mydomain.net)時,流程如下:

- 查詢 MX 記錄:發件方伺服器 (mydomain.com) 向 DNS 查詢目標域名 (mydomain.net) 的 MX 記錄,以確認郵件該發送到哪裡。
- 指向伺服器:DNS 解析出目標 Postfix 伺服器的 IP 地址,指引發件方進行連接。
- 發送郵件:發件方透過 SMTP 協議,將郵件內容發送給 Postfix 伺服器。
- 查詢域名:Postfix 接收到郵件後,暫停處理並向 MySQL 資料庫查詢:該信件的目標域名是否屬於本機需要負責的範圍?
- 確認接收:MySQL 確認域名有效且為本地託管,返回確認信息給 Postfix。
- 投遞郵件:Postfix 使用 LMTP 協議,將郵件轉交給後端的 Dovecot 服務進行最終投遞。
- 保存內容:Dovecot 根據設定(還是要再向MySQL查詢或是根據快取的紀錄決定存檔路徑),將郵件寫入接收者 (username) 在磁碟上對應的郵箱目錄,完成收信。
流程二:你收信看信 (User Retrieval)
當你打開手機或電腦的 郵件客戶端 (Outlook/Thunderbird) 想看信時:

- 建立連接:郵件客戶端 (Client) 向伺服器的 Dovecot (IMAP/POP3 服務) 發起連接請求。
- 伺服器響應:Dovecot 回應握手信息 (Greeting),確認服務正常並準備進行會話。
- 發送帳密:客戶端發送帳號與密碼,請求登入並獲取郵件列表。
- 查詢路徑:Dovecot 連接 MySQL 資料庫,查詢該用戶的郵箱存放路徑與存取權限。
- 返回資訊:MySQL 確認用戶身分無誤,並回傳對應的磁碟路徑資訊。
- 讀取郵件:Dovecot 根據獲取的路徑,前往磁碟存儲 (Storage) 讀取實際的郵件檔案。
- 獲取內容:存儲系統將郵件的標頭與內文數據流回傳給 Dovecot。
- 傳送數據:Dovecot 將完整的郵件內容傳送給客戶端,用戶即可在軟體介面中閱讀郵件。
流程三:你寄信給別人 (Outgoing Mail)
這是最容易混淆的部分。當你要寄信時,雖然是透過 Postfix 寄出,但驗證工作卻是外包給 Dovecot 的(這稱為 SASL 認證):

- 連接伺服器:郵件客戶端 (Client) 向 Postfix 發起 SMTP 連接請求。
- 伺服器響應:Postfix 回應握手信息 (Greeting),準備建立會話。
- 傳送帳密:客戶端發送經過編碼的帳號與密碼以進行身分驗證。
- 請求驗證:Postfix 本身不儲存密碼,將認證請求轉交給後端的 Dovecot (SASL 服務)。
- 查詢帳號:Dovecot 連接 MySQL 資料庫,查詢該用戶的帳號是否存在與密碼是否正確。
- 返回結果:MySQL 將查詢與比對的結果回傳給 Dovecot。
- 認證通過:Dovecot 確認身分無誤後,通知 Postfix 驗證通過。
- 認證成功:Postfix 向客戶端回報登入成功 (Authentication successful),允許開始發信。
- 發送郵件:客戶端正式上傳編寫好的郵件內容(標頭與內文)。
- 轉發郵件:Postfix 接收郵件後,透過 SMTP 協議將其投遞至外部網絡 (Internet) 的對方郵箱伺服器。
小結:軟體職責分工表
看完上面三個流程,你可能會覺得有點眼花撩亂。沒關係,我們只要記住這三個軟體在團隊中的「職位」與「核心任務」即可:
Postfix, Dovecot, 與Mysql的功能
| 軟體名稱 | 角色代號 | 核心職責 | 詳細工作內容 |
| Postfix | 郵差 (MTA) | 負責「傳送」與「接收」 | 它是對外的窗口。負責把信從網路收進來,或是把你的信送到對方的伺服器。它只管「運送」,不管「存儲」。 |
| Dovecot | 管家 (MDA) | 負責「存庫」、「取信」與「驗身」 | 它是對內的管家。負責把 Postfix 收到的信寫入硬碟 (LMTP),也負責讓使用者用手機/電腦把信讀出來 (IMAP)。同時,它還負責幫 Postfix 檢查使用者的帳號密碼是否正確 (SASL)。 |
| MySQL | 名冊 (DB) | 負責「記憶」資料 | 它是大腦記憶區。系統裡有哪些網域?有哪些使用者?密碼是什麼?別名要轉寄給誰?全部都記在這裡。Postfix 和 Dovecot 做決定前,都要先問過它。 |
3. 防火牆策略 (Security Group)
理解了上述三個流程後,我們就很清楚為什麼需要開啟以下 Port 了。請登入 AWS Console,在你的 EC2 Security Group 中設定以下「Inbound Rules (入站規則)」:
| 服務名稱 | Port | 協定 | 用途說明 | 對應流程 |
| SSH | 22 | TCP | 讓我們能遠端登入管理伺服器。 | 系統管理 |
| SMTP | 25 | TCP | (最重要) 讓網際網路上的其他伺服器能寄信給你。 | 流程一 (收信) |
| HTTP | 80 | TCP | 用於申請 Let's Encrypt SSL 憑證驗證。 | 安全性設定 |
| HTTPS | 443 | TCP | 用於 SSL 憑證驗證。 | 安全性設定 |
| IMAP | 143 | TCP | 接收郵件標準協定 (無加密或 STARTTLS)。 | 流程二 (讀信) |
| IMAPS | 993 | TCP | 接收郵件加密協定 (SSL/TLS)。 | 流程二 (讀信) |
| SMTP | 587 | TCP | (Submission) 使用者寄信專用端口,強制加密。 | 流程三 (寄信) |