Postfix 和 Sendmail 是同一个东西吗?
Postfix 与 Sendmail 都是邮件传输代理(MTA)但不是同一个软件:架构、配置、安全性、性能对比,为什么现代系统默认 Postfix,以及兼容性说明与 FAQ。
不是。两者都是 MTA(邮件传输代理,负责在服务器间路由和投递邮件),但 Sendmail 是 1980 年代的历史级软件,Postfix 是 1998 年发布、面向兼容替代需求独立设计的 MTA——架构、安全性、可配置性全面不同。 发行版可能默认不安装 MTA,也可能采用不同实现,应检查实际软件包。
核心差异对照
| 维度 | 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 的兼容前端。这让不少人误以为二者是同一软件。
实际建议
- 新部署:可评估 Postfix(或 Exim),并结合现有集成和维护能力选择。
- 存量 Sendmail 系统:Postfix 支持常见别名和 forward 机制,但复杂规则、认证、中继与邮件网关配置需要逐项迁移验证。
- 只是要发通知邮件:更推荐用第三方 SMTP 服务 +
msmtp/ssmtp这类轻量提交代理,比维护完整 MTA 省心。
常见问题(FAQ)
Q:系统里 which sendmail 有输出,装的是 Sendmail 吗?
A:不一定。postfix 包提供了同名兼容命令。先用 command -v sendmail 查路径,再用发行版包管理器查该文件属于哪个软件包;postconf mail_version 能确认已安装的 Postfix 版本,但不单独证明当前 sendmail 路径指向它。
Q:PHP 的 mail() 函数需要装哪个?
A:类 Unix 系统通常由 sendmail_path 配置本机提交命令;Windows 可使用 SMTP 配置。安装 Postfix 后还需正确配置投递或中继,不能保证装完就能送达。但生产环境建议 PHP 直接走 SMTP 发信服务,绕开本机 MTA 的队列和信誉问题。
Q:Postfix 能完全替代 Sendmail 的所有功能吗?
A:常见发信、中继、虚拟域、别名场景通常有对应实现,但不能保证所有配置直接兼容。Sendmail 一些冷僻的邮件列表/网关特性在 Postfix 里要换实现方式,但新系统基本不会用到。