Mail Server 征服指南 (二) 第一章:架構規劃與環境準備

在我們登入伺服器輸入任何指令之前,必須先建立一張清晰的「地圖」。

很多初學者在架設 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)時,流程如下:

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

流程二:你收信看信 (User Retrieval)

當你打開手機或電腦的 郵件客戶端 (Outlook/Thunderbird) 想看信時:

  1. 建立連接:郵件客戶端 (Client) 向伺服器的 Dovecot (IMAP/POP3 服務) 發起連接請求。
  2. 伺服器響應:Dovecot 回應握手信息 (Greeting),確認服務正常並準備進行會話。
  3. 發送帳密:客戶端發送帳號與密碼,請求登入並獲取郵件列表。
  4. 查詢路徑:Dovecot 連接 MySQL 資料庫,查詢該用戶的郵箱存放路徑與存取權限。
  5. 返回資訊:MySQL 確認用戶身分無誤,並回傳對應的磁碟路徑資訊。
  6. 讀取郵件:Dovecot 根據獲取的路徑,前往磁碟存儲 (Storage) 讀取實際的郵件檔案。
  7. 獲取內容:存儲系統將郵件的標頭與內文數據流回傳給 Dovecot。
  8. 傳送數據:Dovecot 將完整的郵件內容傳送給客戶端,用戶即可在軟體介面中閱讀郵件。

流程三:你寄信給別人 (Outgoing Mail)

這是最容易混淆的部分。當你要寄信時,雖然是透過 Postfix 寄出,但驗證工作卻是外包給 Dovecot 的(這稱為 SASL 認證):

  1. 連接伺服器:郵件客戶端 (Client) 向 Postfix 發起 SMTP 連接請求。
  2. 伺服器響應:Postfix 回應握手信息 (Greeting),準備建立會話。
  3. 傳送帳密:客戶端發送經過編碼的帳號與密碼以進行身分驗證。
  4. 請求驗證:Postfix 本身不儲存密碼,將認證請求轉交給後端的 Dovecot (SASL 服務)。
  5. 查詢帳號:Dovecot 連接 MySQL 資料庫,查詢該用戶的帳號是否存在與密碼是否正確。
  6. 返回結果:MySQL 將查詢與比對的結果回傳給 Dovecot。
  7. 認證通過:Dovecot 確認身分無誤後,通知 Postfix 驗證通過。
  8. 認證成功:Postfix 向客戶端回報登入成功 (Authentication successful),允許開始發信。
  9. 發送郵件:客戶端正式上傳編寫好的郵件內容(標頭與內文)。
  10. 轉發郵件: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) 使用者寄信專用端口,強制加密。 流程三 (寄信)

第一章:架構規劃與環境準備

第二章:基礎建設篇——DNS、SSL 與資料庫

第三章:郵差的武裝——安裝 Postfix 並連接資料庫

第四章:安裝與設定 Dovecot (最後一塊拼圖)。

第五章:驗收時刻——全流程測試

第六章:設定 AWS SES Relay (讓信件使命必達)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料