閱讀 Postfix 日誌,排查郵件投遞
從日誌位置、佇列 ID、投遞結果到當前佇列,按步驟調查郵件延遲與未送達問題。
原文釋出: · 中文版更新:
確認實際日誌位置
先確認伺服器、故障時間、時區和信封地址。Postfix 通常透過 syslog 記錄,也可使用自身日誌服務。常見檔名為 /var/log/maillog 和 /var/log/mail.log,不能只按作業系統判斷路徑。
postconf mail_version maillog_file
sudo tail -n 100 /var/log/maillogmaillog_file 為空時檢查 syslog 路由,例如使用 rsyslog 時檢視 /etc/rsyslog.conf 和 /etc/rsyslog.d/。舊版 Postfix 可能不支援此引數;非空時使用 Postfix 指定目標。請替換範例路徑。
使用 systemd journal 時,按故障時間範圍查詢 Postfix 程序。只篩選單一服務單元可能漏掉其他例項,應結合伺服器時區。
sudo journalctl --since '2026-09-20 10:00:00' --until '2026-09-20 11:00:00'沒有輸出時檢查權限、服務狀態、syslog 規則、輪轉檔案和容器輸出。檔案不存在不代表沒有投遞。參考 Postfix 官方日誌說明與除錯指南。
使用佇列 ID 串聯記錄
以下使用文件專用地址、IP 和虛構佇列 ID,實際格式因版本、日誌設定和投遞傳輸方式而異。
Sep 20 10:15:01 mail postfix/smtpd[1201]: 4F2A812345: client=client.example.org[192.0.2.10]
Sep 20 10:15:01 mail postfix/cleanup[1202]: 4F2A812345: message-id=<example-001@example.org>
Sep 20 10:15:01 mail postfix/qmgr[1203]: 4F2A812345: from=<sender@example.org>, size=2048, nrcpt=1 (queue active)
Sep 20 10:15:02 mail postfix/smtp[1204]: 4F2A812345: to=<recipient@example.net>, relay=mx.example.net[198.51.100.20]:25, delay=1.2, delays=0.1/0.1/0.4/0.6, dsn=2.0.0, status=sent (250 2.0.0 accepted)
Sep 20 10:15:02 mail postfix/qmgr[1203]: 4F2A812345: removed4F2A812345 將這些記錄關聯起來。smtpd 記錄客戶端,cleanup 整理郵件,qmgr 管理佇列,smtp 將郵件交給中繼。參見官方架構說明。
| 欄位 | 含義 |
|---|---|
| 時間、主機、PID | 產生記錄的伺服器和程序;無年份時間戳需按檔案來源確認年份。 |
| client / from / to | 連線主機及 IP、信封寄件者和收件者,與郵件信頭並非同一概念。 |
| size / nrcpt | 大小與收件者數,逐個檢查收件結果。 |
| relay / dsn / status | 下一跳、投遞狀態碼與結果,結合回應文字理解。 |
| removed | 郵件從該佇列移除,單憑此行不能證明所有收件者均成功。 |
sudo grep -F '4F2A812345:' /var/log/maillog替換 ID 與路徑並檢視相鄰記錄。過濾或轉發可能分配新 ID;佇列 ID 不跨伺服器全域性唯一,單個例項也可能重複使用,因此同時關聯時間和 message-id。
檢查失敗與延遲
- 確認接收:NOQUEUE: reject 表示入隊前拒絕;SASL authentication failed 應結合認證設定、客戶端和時間排查。
- 逐個收件者檢查:sent 表示本次投遞成功,deferred 為暫時延遲,bounced 為永久失敗。SMTP 接受不保證最終收件箱接收或閱讀。
- 閱讀真實回應:區分 DNS 解析、連線逾時和遠端拒收,單純延遲不能證明網路故障。
- 追蹤後續嘗試:檢查是否最終 sent 或仍在佇列;最終成功可能掩蓋此前臨時問題。
delay 是投遞耗時。delays=a/b/c/d 分別表示到達至最後一次進入 active 佇列、隨後等待開始連線、連線建立,以及郵件傳輸。建立連線可能包含 DNS 和 SMTP/TLS 握手。參見官方延遲定義。
詳細除錯日誌應限制到相關對端及調查時段,以免增加儲存並暴露敏感資訊。按官方步驟操作後恢復正常設定。
檢視當前佇列與郵件內容
postqueue -p檢視佇列 ID、大小、到達時間、寄件者、尚待投遞的收件者和失敗原因。* 表示 active,! 表示 hold。佇列持續變化,當前數量不等於歷史事件數量。支援的版本可用 postqueue -j 輸出 JSON Lines。參見 postqueue 手冊。
普通投遞日誌沒有完整正文。授權管理員可在郵件仍在佇列中時執行 sudo postcat -q QUEUE_ID,將佔位符替換為實際 ID。輸出可能包含私人內容,不要原樣貼上到公開網站或問題跟蹤器。參見 postcat 手冊。這些檢視命令不會刪除郵件或要求重新投遞;調查前刪除佇列可能丟失待檢查內容。
使用 LogGraphic 分析與監控
在桌面應用載入儲存的 Postfix 文字日誌,按開始時間、佇列 ID 或地址篩選。本網頁不提供日誌上傳功能。ADDRESS FLOW 展示信箱關係,MAIL FLOW 展示配送中繼;回放、暫停和快進幫助追蹤歷史。設定 SSH 後可 LIVE 監控。DKIM 檢視展示日誌記錄的處理過程,不獨立驗證郵件簽名。
常見問題
status=sent 保證進入收件箱嗎?
不保證。SMTP 投遞中表示下一跳已接受,後續轉發或過濾仍可能影響最終接收和閱讀。
能從投遞日誌恢復已刪除郵件正文嗎?
普通日誌不包含完整正文,無法據此重建。應檢查仍在佇列中的檔案、另行歸檔郵件或備份。
deferred 行數等於失敗郵件數嗎?
不一定,重試和多個收件者會產生多條記錄。請關聯收件者、佇列 ID、時間和後續結果。