目录
- Sendmail 简介
- 核心概念
- MTA (Mail Transfer Agent)
- Sendmail 的主要配置文件
- 工作流程
- 安装 Sendmail
- 基础配置
- 生成 Sendmail 配置文件 (
m4) - 配置主机名和域名
- 设置允许中继的主机
- 启动并启用 Sendmail
- 生成 Sendmail 配置文件 (
- 安全加固 (非常重要)
- 配置 SMTP 认证
- 配置 TLS/SSL 加密
- 防止垃圾邮件
- 测试邮件服务器
- 使用
sendmail命令行测试 - 使用
telnet/nc手动测试 SMTP - 使用在线工具测试
- 使用
- 常见问题与故障排查
- 查看日志
- 常见错误代码
- 现代替代品
Sendmail 简介
Sendmail 是一个开源的邮件传输代理,负责在邮件服务器之间发送和接收电子邮件,它通常被称为“邮件服务器的引擎”,因为它处理邮件的路由、排队和投递。

- 优点:
- 功能极其强大和灵活。
- 高度可定制,支持各种复杂的路由规则。
- 几乎在所有 Linux/Unix 系统上都可用。
- 缺点:
- 配置非常复杂,学习曲线陡峭。
- 默认配置安全性不高,容易被滥发垃圾邮件。
- 相比现代 MTA(如 Postfix),其配置文件格式(
m4)对新手不友好。
重要提示: 对于新部署,很多人会选择 Postfix 作为 Sendmail 的替代品,因为它更易于配置、更安全,并且性能相当,但如果你需要维护遗留系统或使用特定于 Sendmail 的功能,了解 Sendmail 仍然很有必要。
核心概念
MTA (Mail Transfer Agent)
邮件传输代理是邮件系统的核心,它监听 25 端口,接收来自其他 MTA 或本地邮件用户代理(如 mail, mutt, Thunderbird)的邮件,并根据收件人地址决定将邮件发送到哪里。
Sendmail 的主要配置文件
/etc/mail/sendmail.cf: 核心配置文件,这是 Sendmail 启动时读取的主配置文件。强烈建议不要直接编辑此文件,因为它是通过m4宏处理器从其他文件生成的。/etc/mail/: 配置目录,这里存放了用于生成sendmail.cf的源文件。sendmail.mc: 主配置模板文件,这是你应该编辑的文件,它使用m4宏语言来定义服务器的行为。access: 访问控制列表,用于控制哪些主机或 IP 地址可以中继(发送邮件)通过你的服务器。local-host-names: 定义哪些域名或主机名是你的服务器负责接收邮件的本地域名。virtusertable: 虚拟用户映射,用于将虚拟邮箱地址(如webmaster@yourdomain.com)映射到本地系统用户。
/var/log/maillog或/var/log/mail.log: 邮件日志文件,排查问题时最重要的文件。
工作流程
- 一封邮件需要发送到
user@example.com。 - Sendmail 查询 DNS 的 MX (Mail Exchange) 记录,找到
example.com的邮件服务器 IP 地址。 - Sendmail 连接到目标邮件服务器的 25 端口。
- 通过 SMTP 协议将邮件递交给目标服务器。
- 目标服务器将邮件投递到
user的邮箱中。
安装 Sendmail
在基于 Red Hat/CentOS 的系统上:
# 更新软件包列表 sudo yum update -y # 安装 sendmail 及相关组件 sudo yum install -y sendmail sendmail-cf
在基于 Debian/Ubuntu 的系统上:

# 更新软件包列表 sudo apt update # 安装 sendmail sudo apt install -y sendmail
安装完成后,Sendmail 通常是停止状态。
基础配置
步骤 1: 生成 Sendmail 配置文件
我们通过修改 sendmail.mc 模板文件,然后使用 m4 工具来生成最终的 sendmail.cf。
# 切换到配置目录 cd /etc/mail # 编辑主配置模板文件 sudo vi sendmail.mc
步骤 2: 配置主机名和域名
确保你的服务器主机名和域名设置正确,这通常在 /etc/hostname 和 /etc/hosts 文件中配置。
# 查看当前主机名 hostname # 设置主机名 ( mail.yourdomain.com) sudo hostnamectl set-hostname mail.yourdomain.com # 编辑 /etc/hosts 文件,确保有如下行 sudo vi /etc/hosts 127.0.0.1 localhost localhost.localdomain 127.0.1.1 mail.yourdomain.com mail # 你的服务器公网IP 203.0.113.10 mail.yourdomain.com mail
在 sendmail.mc 文件中,dnl 表示注释,找到类似 DOMAIN(generic) 的行,并根据你的域名进行修改,但通常,sendmail 会自动从系统主机名中获取这些信息。

步骤 3: 设置允许中继的主机
这是防止你的邮件服务器被“开放中继”(Spam Relay)的关键一步,默认情况下,Sendmail 只允许从本机发送邮件。
方法 A:允许特定 IP 发送邮件
编辑 /etc/mail/access 文件:
sudo vi /etc/mail/access
添加以下规则,允许来自特定 IP 或网段的邮件中继:
# 允许来自本地网络 192.168.1.0/24 的所有主机
192.168.1. RELAY
# 允许来自特定 IP 203.0.113.20 的主机
203.0.113.20 RELAY
# 允许来自本机
localhost RELAY
127.0.0.1 RELAY
保存后,需要将 access 文件编译为 access.db 数据库:
sudo makemap hash access.db < access
方法 B:启用 SMTP 认证(推荐) 更安全的方法是只允许经过认证的用户发送邮件,我们将在“安全加固”部分详细介绍。
步骤 4: 生成 sendmail.cf 并启动服务
-
生成配置文件: 在
/etc/mail目录下运行:# 生成 sendmail.cf sudo make
这个命令会读取
sendmail.mc和其他.mc文件,并生成sendmail.cf。 -
启动并启用 Sendmail:
# 启动 Sendmail 服务 sudo systemctl start sendmail # 设置开机自启 sudo systemctl enable sendmail
-
检查服务状态:
sudo systemctl status sendmail
安全加固
A. 配置 SMTP 认证
这要求用户在发送邮件前提供用户名和密码,是防止滥用的核心措施。
-
安装 Cyrus SASL 库:
# CentOS/RHEL sudo yum install -y cyrus-sasl cyrus-sasl-plain # Debian/Ubuntu sudo apt install -y sasl2-bin libsasl2-modules
-
编辑
sendmail.mc: 取消注释或添加以下行,以启用 SASL 认证:sudo vi /etc/mail/sendmail.mc
找到并确保以下行存在且没有被注释掉(
dnl):dnl TRUST_AUTH_MECH(`EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
修改为:
TRUST_AUTH_MECH(`EXTERNAL GSSAPI LOGIN PLAIN')dnl define(`confAUTH_ME
