阅读 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、时间和后续结果。