Postfix 和 Sendmail 是同一个东西吗?
Postfix 与 Sendmail 都是邮件传输代理(MTA)但不是同一个软件:架构、配置、安全性、性能对比,为什么现代系统默认 Postfix,以及兼容性说明与 FAQ。
不是。两者都是 MTA(邮件传输代理,负责在服务器间路由和投递邮件),但 Sendmail 是 1980 年代的历史级软件,Postfix 是 1998 年为替代它而生的现代重写——架构、安全性、可配置性全面不同。 今天几乎所有 Linux 发行版的默认 MTA 都是 Postfix。
核心差异对照
| 维度 | Sendmail | Postfix |
|---|---|---|
| 诞生 | 1983 年,互联网早期 | 1998 年,Wietse Venema 设计 |
| 架构 | 单体大进程,一个程序干所有事 | 模块化,master 调度多个各司其职的小进程 |
| 安全记录 | 历史包袱重,早年漏洞频发 | 设计即以安全为先,权限最小化、队列隔离 |
| 配置 | sendmail.cf 由 m4 宏生成,语法晦涩 |
main.cf 键值对直白可读,postconf 管理 |
| 性能 | 高负载下表现一般 | 队列管理高效,吞吐明显更好 |
| 队列 | 单一队列目录 | 分层队列(incoming/active/deferred……) |
为什么会有"是同一个东西"的错觉
Postfix 刻意保持了命令行兼容:它自带一个名为 sendmail 的兼容命令,路径、参数和 Sendmail 的一致。所以很多教程里的 sendmail -t、PHP mail() 默认调 /usr/sbin/sendmail——在装了 Postfix 的机器上实际调用的是 Postfix 的兼容前端。这让不少人误以为二者是同一软件。
实际建议
- 新部署:没有理由选 Sendmail,用 Postfix(或 Exim,另一主流选择)。
- 存量 Sendmail 系统:迁移通常不复杂,Postfix 对 Sendmail 的别名文件、forward 文件都兼容。
- 只是要发通知邮件:更推荐用第三方 SMTP 服务 +
msmtp/ssmtp这类轻量提交代理,比维护完整 MTA 省心。
观测云对照
无论用哪个 MTA,"邮件发没发出去、卡在哪个队列"都不能靠猜。把 mail 日志(/var/log/mail.log 或 maillog)通过 DataKit 采集到观测云,在日志查看器里按 status=bounced/deferred 过滤;再对队列长度(mailq 输出做成指标)和退信率配告警,邮件通道的健康度就纳入了统一监控视图。
常见问题(FAQ)
Q:系统里 which sendmail 有输出,装的是 Sendmail 吗?
A:不一定。postfix 包提供了同名兼容命令。看 sendmail -d0.1 -bv root 的版本输出,或直接 postconf mail_version 确认是不是 Postfix。
Q:PHP 的 mail() 函数需要装哪个?
A:mail() 默认调本机 sendmail 命令,Postfix 装上即可满足。但生产环境建议 PHP 直接走 SMTP 发信服务,绕开本机 MTA 的队列和信誉问题。
Q:Postfix 能完全替代 Sendmail 的所有功能吗?
A:对 99% 的使用场景(发信、中继、虚拟域、别名)可以。Sendmail 一些冷僻的邮件列表/网关特性在 Postfix 里要换实现方式,但新系统基本不会用到。