核心概念:sendmail 与 SMTP 的关系
要明白 sendmail 和 SMTP 是两个不同但又紧密相关的东西。

-
SMTP (Simple Mail Transfer Protocol):协议,它是一套规则,定义了邮件服务器之间如何发送和转发电子邮件,你可以把它比作邮件系统的“交通规则”或“官方语言”,所有标准的邮件传输都遵循 SMTP 协议。
-
sendmail:邮件传输代理,它是一个实现了 SMTP 协议的软件程序,你可以把它比作一个“邮局”或“邮件卡车司机”,它的职责是:- 接收本地用户或应用程序(如
mail命令、PHP 脚本)发来的邮件。 - 根据 SMTP 协议,将这些邮件发送到正确的目标邮件服务器。
- 接收来自其他邮件服务器的邮件,并分发给本地用户。
- 接收本地用户或应用程序(如
简单总结:
sendmail 是执行者,而 SMTP 是它需要遵守的语言和规则,当你配置 sendmail 时,你实际上是在配置一个使用 SMTP 协议来收发邮件的软件。
sendmail 的工作流程
一个典型的邮件发送流程如下:

- 用户/应用:你使用
mail user@example.com命令,或者你的网站(如 WordPress)需要发送一封注册邮件。 sendmail程序:这个请求会调用本地的sendmail程序。- 本地处理:
sendmail首先检查user@example.com是不是本地服务器的用户,如果是,就直接把邮件投递到用户的邮箱(/var/spool/mail/username)。 - 远程发送:如果收件人不在本地,
sendmail就会启动SMTP 客户端功能。- 它会查询
example.com域名的 MX (Mail Exchange) 记录,找到example.com的邮件服务器地址(mail.example.com)。 sendmail作为客户端,通过 SMTP 协议连接到mail.example.com的 SMTP 服务器(端口 25)。- 双方进行 SMTP 对话,
sendmail说:“你好,我想发一封邮件”,然后把邮件内容传递过去。
- 它会查询
- 对方服务器接收:
mail.example.com的SMTP 服务器(可能也是由sendmail或其他 MTA 如 Postfix 运行)收到邮件后,会将其存入队列,最终分发给user@example.com的邮箱。
如何配置 sendmail 的 SMTP 服务器行为?
通常我们说的“配置 sendmail 的 SMTP 服务器”,指的是配置它作为邮件服务器,接收来自外部的邮件,并配置它如何发送邮件(中继)。
A. 查看 sendmail 版本和配置文件
在配置之前,先确认你的系统上安装了 sendmail 并查看其配置文件。
# 检查 sendmail 是否安装并运行 sendmail -d0.1 -bv < /dev/null # 查看版本信息 systemctl status sendmail # 查看服务状态 (CentOS/RHEL 7+) ps aux | grep sendmail # 查看进程 # 主要配置文件 /etc/mail/sendmail.cf # 核心配置文件 (语法复杂) /etc/mail/sendmail.mc # 宏配置文件 (语法简单,推荐修改这个)
现代系统通常使用 sendmail.mc 文件,因为它更易读,修改后需要重新生成 sendmail.cf。
B. 核心配置项:sendmail.mc
-
定义本地主机名和域名 这是最基本的配置,确保邮件有正确的发件人域名。
(图片来源网络,侵删)define(`confDOMAIN_NAME', `yourdomain.com')dnl define(`confDELIVERY_MODE', `interactive')dnl
-
配置本地网络,允许中继 这是最重要的一步,决定了哪些机器可以通过你的
sendmail服务器发送邮件。默认配置可能只允许本机(
localhost或0.0.1)发送邮件,如果你希望局域网内的其他机器也能通过它发送邮件,需要修改access文件。-
使用
access文件(推荐)sendmail会读取/etc/mail/access文件来决定是否允许中继。编辑
/etc/mail/access:# 允许来自 192.168.1.0/24 网段的所有机器发送邮件 192.168.1. RELAY # 允许特定 IP 10.0.0.50 RELAY # 允许特定域名 myfriendlyhost.com RELAY # 拒绝来自某个 IP 192.168.2. REJECT修改后,需要重新生成数据库:
makemap hash /etc/mail/access.db < /etc/mail/access
-
在
sendmail.mc中使用RELAY规则 在sendmail.mc中,你可以直接使用FEATURE宏来定义允许中继的网络。# 允许 192.168.1.0/24 网段进行邮件中继 FEATURE(`relay_entire_domain')dnl
-
-
配置智能主机 如果你的服务器不直接将邮件发送到最终目的地,而是通过另一个更可靠的邮件服务器(如你购买的云服务器或企业邮箱提供商的 SMTP 服务器)来发送,你需要配置一个“智能主机”。
这通常用于家庭服务器或 VPS,因为它们的 IP 可能被列入邮件黑名单。
在
sendmail.mc中添加:# 将所有邮件都通过 smtp.your-isp.com 发送 define(`SMART_HOST', `smtp.your-isp.com')dnl
如果你的智能主机需要认证,还需要配置认证信息,这会更复杂一些,通常需要用到
authinfo文件和FEATURE宏。 -
配置 SSL/TLS 加密 为了安全,应该让
sendmail在发送邮件时使用加密连接。在
sendmail.mc中启用:# 监听 465 端口 (SMTPS) DAEMON_OPTIONS(`Port=smtps, Name=MTA, M=a')dnl # 或监听 587 端口 (Submission) DAEMON_OPTIONS(`Port=submission, Name=MSA, M=s')dnl # 启用 STARTTLS define(`confAUTH_OPTIONS', `A p y')dnl TRUST_AUTH_MECH(`EXTERNAL LOGIN PLAIN')dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI LOGIN PLAIN')dnl
C. 应用配置更改
修改完 sendmail.mc 后,必须重新生成 sendmail.cf 并重启服务。
# 1. 从 .mc 文件生成 .cf 文件 # 在基于 Red Hat 的系统上 m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf # 在基于 Debian/Ubuntu 的系统上 make -C /etc/mail # 2. 重启 sendmail 服务 systemctl restart sendmail # 3. 重新生成 aliases 数据库(如果修改了 /etc/aliases) newaliases
现代替代品:Postfix
尽管 sendmail 非常经典且功能强大,但它的配置文件语法 (sendmail.cf) 以晦涩难懂而闻名,大多数现代 Linux 发行版(如 Ubuntu, Debian, CentOS)在安装时默认会选择 Postfix 作为 MTA。
Postfix 的优势:
- 配置简单:使用易读的文本文件(如
main.cf)。 - 性能高:设计更现代化,资源占用更低。
- 安全性好:架构设计更注重安全。
如果你需要配置一个邮件服务器,并且没有特殊原因必须使用 sendmail,强烈推荐使用 Postfix。
常见问题排查
-
问题:邮件发送失败,错误信息 "Relay access denied" 原因:
sendmail拒绝为你的来源 IP 地址进行邮件中继。 解决:检查并修改/etc/mail/access文件,确保你的客户端 IP 被标记为RELAY,然后重新生成access.db。 -
问题:邮件被对方服务器退回,提示 "IP is in a black list" 原因:你的服务器 IP 地址被列入了某个垃圾邮件黑名单。 解决:配置智能主机,通过一个信誉良好的邮件服务器中继你的邮件,或者,联系黑名单提供商申请移除。
-
问题:邮件发送很慢或超时 原因:可能是 DNS 解析问题,或目标邮件服务器响应慢。 解决:检查 DNS 配置,使用
dig yourdomain.com MX查看域名解析是否正常。
| 特性 | sendmail |
SMTP |
|---|---|---|
| 本质 | 一个具体的软件程序 (MTA) | 一套网络协议 (规则) |
| 角色 | 邮件的发送者和接收者 | 邮件服务器之间沟通的语言 |
| 配置 | 复杂 (sendmail.cf, sendmail.mc) |
协议本身是标准,但服务器配置各有不同 |
| 现状 | 经典,但配置困难,逐渐被 Postfix 替代 | 仍然是互联网邮件传输的基石 |
希望这份详细的解释能帮助你理解 sendmail 和 SMTP 服务器!
