Ubuntu 22.04 安装 Sendmail 8.15.2 指南

在 Ubuntu 22.04 上安装 Sendmail 的完整指南:apt 在线安装 8.15.2 与官方源码编译 8.18.2 双方案实测,含 systemd 托管、SMTP 端口验证、本地投递端到端实测与六则排障实录。

SendmailSendmailUbuntu 22.04邮件服务器2026/10/26

Ubuntu 22.04 安装 Sendmail 8.15.2 指南

目标:在 Ubuntu 22.04 服务器上从零安装并启动 Sendmail MTA,覆盖 apt 在线安装与官方源码编译两条主线,完成 SMTP 端口验证与本地投递端到端实测。已在 Ubuntu 22.04.5 LTS(x86_64)上全流程实测通过(2026-10-26)。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64,内核 7.0.0-38-generic)
  • Sendmail 版本:
    • 方案 A(apt):8.15.2-22ubuntu3(Ubuntu jammy/universe 源)
    • 方案 B(源码编译):8.18.2(官方 ftp.sendmail.org CURRENT 发布,2025-12-27 发布)
  • 编译工具链:gcc 11.4.0 / GNU Make 4.3 / GNU M4 1.4.18 / Berkeley DB 5.3.28(libdb5.3-dev)
  • 监听端口:25/smtp(MTA 收信)、587/submission(MSP 本地提交),安装后默认只监听 127.0.0.1
  • 主配置目录:/etc/mail/
  • 队列目录:/var/spool/mqueue(MTA 队列)、/var/spool/clientmqueue(MSP 客户端队列)
  • 演示账号:本地接收用户 admin(密码 q1w2e3r4)

二、前置条件

  • 一台 Ubuntu 22.04 服务器,具备 root 权限或 sudo 能力;
  • 服务器可访问 Ubuntu 软件源(方案 A 需要联网 apt,方案 B 需要联网下载源码包);
  • 主机名与 FQDN 规划好(如 mail.example.com)。Sendmail 强依赖「本机规范域名」,主机名不合格会引发规则集解析异常,建议先把 /etc/hosts 中的本机条目写成 FQDN:
cat /etc/hosts

实测回显:

127.0.0.1	localhost
::1		localhost ip6-localhost ip6-loopback
10.89.57.2	mail.example.com mail

说明:本机 IP 对应的行写为 IP FQDN 短名(mail.example.com mail),Sendmail 启动时做规范名解析就能拿到 mail.example.com,避免安装日志里出现 WARNING: local host name (mail) is not qualified(该警告的排障过程见「八、常见问题」)。

  • 若本机 25 端口已被其他 MTA(如 postfix、exim4)占用,需先卸载冲突 MTA,否则 Sendmail 无法绑定端口:
ss -ltn | grep -E ':25|:587'

实测回显(安装 Sendmail 前应为空,安装后再次执行可见 Sendmail 监听):

LISTEN 0      10         127.0.0.1:25         0.0.0.0:*
LISTEN 0      10         127.0.0.1:587        0.0.0.0:*

三、版本选型说明

Sendmail 官方稳定版发布在 https://ftp.sendmail.org/(CURRENT 符号链接永远指向最新稳定版)。截至 2026-10-26 实查,官方目录中的版本谱系如下:

版本发布时间说明
8.17.12021-08-178.17 系列首个稳定版
8.17.22023-06-038.17 系列修正版
8.18.12024-01-318.18 系列首个稳定版
8.18.22025-12-27当前最新稳定版(sendmail-current.tar.gz 符号链接指向 sendmail.8.18.2.tar.gz)

(来源:ftp.sendmail.org 目录列表,查询日期 2026-10-26。)

Ubuntu 22.04 的 universe 源中提供的是 8.15.2 打包版(8.15.2-22ubuntu3),与官方最新稳定版相差一个大版本线,这是选型时必须明确的差异:

维度方案 A:apt 安装 8.15.2方案 B:源码编译 8.18.2
版本8.15.2-22ubuntu3(jammy 源)8.18.2(官方最新稳定版)
是否联网需要(apt 拉包)需要(下载源码 + 编译工具)
安装耗时约 1 分钟约 3–5 分钟
配置体系Debian/Ubuntu m4 宏封装(sendmail.mc + sendmailconfig)上游原生 m4 体系(cf/cf/*.mc)
升级方式apt upgrade 随源更新重新下载新版源码编译
systemd 托管自动注册 sendmail.service需自写 unit 或用启动命令
适用场景通用服务器、追求可维护性需要最新安全特性(8.18 的 TLS 默认收紧等)

💡 技术拓展:Linux 下的 MTA 不止 Sendmail 一种,常见同类对比如下——

MTA特点典型场景
Sendmail历史(1983 年起)最悠久,m4 宏配置,milter 过滤体系传统 Unix 环境、AIX/Solaris 等非 Linux 平台
Postfix模块化、默认安全、配置直观,Debian/RHEL 默认现代通用服务器首选
Exim配置语言极强(单文件 ACL 逻辑),Debian 默认灵活路由与复杂策略
OpenSMTPDOpenBSD 项目,配置极简,安全审计严格小型邮件网关、Unix 哲学爱好者

本文按任务目标安装 Sendmail:它是 milter 过滤协议的发明者,也是大量遗留系统的既成标准。

四、方案 A:apt 在线安装(Ubuntu universe 源)

4.1 方案说明

Ubuntu 官方源把 Sendmail 放在 universe 仓库,安装 sendmail 元包会自动带上 sendmail-base、sendmail-bin、sendmail-cf(m4 宏配置体系)与 sensible-mda(本地投递代理),并自动完成首次配置文件的生成。这是 Ubuntu 服务器上最省事、升级最可控的方式。

4.2 确认候选版本

apt-get update
apt-cache policy sendmail

实测回显:

sendmail:
  Installed: (none)
  Candidate: 8.15.2-22ubuntu3
  Version table:
     8.15.2-22ubuntu3 500
        500 http://archive.ubuntu.com/ubuntu jammy/universe amd64 Packages

4.3 执行安装

apt-get install -y sendmail

实测回显(节选,实测首尾):

Reading package lists...
Building dependency tree...
Reading state information...
The following additional packages will be installed:
  libgdbm-compat4 libgdbm6 libldap-2.5-0 libldap-common liblockfile-bin
  liblockfile1 libperl5.34 libsasl2-2 libsasl2-modules libsasl2-modules-db
  libsigsegv2 libwrap0 lockfile-progs m4 make netbase perl perl-modules-5.34
  procmail sendmail-base sendmail-bin sendmail-cf sensible-mda
...
The following NEW packages will be installed:
  libgdbm-compat4 libgdbm6 libldap-2.5-0 libldap-common liblockfile-bin
  liblockfile1 libperl5.34 libsasl2-2 libsasl2-modules libsasl2-modules-db
  libsigsegv2 libwrap0 lockfile-progs m4 make netbase perl perl-modules-5.34
  procmail sendmail sendmail-base sendmail-bin sendmail-cf sensible-mda
0 upgraded, 24 newly installed, 0 to remove and 2 not upgraded.
Need to get 9777 kB of archives.
After this operation, 54.8 MB of additional disk space will be used.
...
Setting up sendmail-bin (8.15.2-22ubuntu3) ...
Creating /etc/mail/databases...
Creating /etc/mail/Makefile...
Creating /etc/mail/sendmail.cf...
Creating /etc/mail/submit.cf...
Informational: confCR_FILE file empty: /etc/mail/relay-domains
Warning: confCT_FILE source file not found: /etc/mail/trusted-users
 it was created
Informational: confCT_FILE file empty: /etc/mail/trusted-users
Warning: confCW_FILE source file not found: /etc/mail/local-host-names
 it was created
Warning: access_db source file not found: /etc/mail/access
 it was created
Updating /etc/mail/access...
Linking /etc/aliases to /etc/mail/aliases
Informational: ALIAS_FILE file empty: /etc/mail/aliases
Updating /etc/mail/aliases...
WARNING: local host name (mail) is not qualified; see cf/README: WHO AM I?
/etc/mail/aliases: 0 aliases, longest 0 bytes, 0 bytes total
Setting up sensible-mda (8.15.2-22ubuntu3) ...
Setting up sendmail (8.15.2-22ubuntu3) ...
Processing triggers for libc-bin (2.35-0ubuntu3.15) ...

说明:

  • sendmail-cf 带来了 m4 宏配置体系,/etc/mail/sendmail.mc 是后续所有配置修改的入口;
  • 安装脚本自动创建了 access、local-host-names、trusted-users 等空数据文件并生成 access.db、aliases.db;
  • WARNING: local host name (mail) is not qualified 说明本机短主机名 mail 没有对应的 FQDN——若前置条件中已把 /etc/hosts 写好 FQDN,此处应为规范名而不告警;出现该警告时按「八、常见问题」问题 1 处理。

安装完成后核对包清单:

dpkg -l | grep -E '^ii  (sendmail|sensible-mda)' | awk '{printf "%-20s %s\n", $2, $3}'

实测回显:

sendmail             8.15.2-22ubuntu3
sendmail-base        8.15.2-22ubuntu3
sendmail-bin         8.15.2-22ubuntu3
sendmail-cf          8.15.2-22ubuntu3
sensible-mda         8.15.2-22ubuntu3

4.4 systemd 托管与服务管理

Ubuntu 打包版自带 LSB init 脚本,systemd 通过 systemd-sysv-generator 自动生成 sendmail.service,无需手工写 unit。服务开机自启已随安装注册(systemctl is-enabled sendmail 返回 enabled):

systemctl start sendmail
systemctl status sendmail --no-pager -l | head -6

实测回显:

● sendmail.service - LSB: powerful, efficient, and scalable Mail Transport Agent
     Loaded: loaded (/etc/init.d/sendmail; generated)
     Active: active (running) since Mon 2026-10-26 14:42:46 UTC; 2min 13s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 2533 ExecStart=/etc/init.d/sendmail start (code=exited, status=0/SUCCESS)

常用服务管理命令(每次一条,逐个执行):

systemctl restart sendmail
systemctl stop sendmail
systemctl is-active sendmail

实测回显:

active

4.5 安装验证

验证一:端口监听。

ss -ltn | grep -E ':25|:587'

实测回显:

LISTEN 0      10         127.0.0.1:25         0.0.0.0:*
LISTEN 0      10         127.0.0.1:587        0.0.0.0:*

默认配置下 MTA(25)与 MSP 提交口(587)都只监听 127.0.0.1,这是 Ubuntu 出于安全的默认选择;要让外网服务器能投递进来,需修改 sendmail.mc 的 DAEMON_OPTIONS(见「七、配置说明」)。

验证二:SMTP 横幅。

exec 3<>/dev/tcp/127.0.0.1/25 && head -c 110 <&3; exec 3<&-

实测回显:

220 mail.example.com ESMTP Sendmail 8.15.2/8.15.2/Debian-22ubuntu3; Mon, 26 Oct 2026 14:42:51 GMT; (No UCE/UBE) logging access from:

横幅中的 8.15.2/8.15.2/Debian-22ubuntu3 分别是 MTA 版本/cf 版本/发行版补丁号,说明服务正常应答。

验证三:地址可解析。

sendmail -bv root

实测回显:

root... deliverable: mailer local, user root

验证四:端到端本地投递。 先创建演示接收账号 admin:

useradd -m -s /bin/bash admin && echo 'admin:q1w2e3r4' | chpasswd

用 sendmail -v 发一封测试邮件(-v 会把 SMTP 会话全程打到终端):

printf 'Subject: install test\n\nhello from sendmail 8.15.2\n' | sendmail -v admin

实测回显(节选,实测首尾):

admin... Connecting to [127.0.0.1] via relay...
220 mail.example.com ESMTP Sendmail 8.15.2/8.15.2/Debian-22ubuntu3; Mon, 26 Oct 2026 14:43:11 GMT; (No UCE/UBE) logging access from: localhost(OK)-localhost [127.0.0.1]
>>> EHLO mail.example.com
250-mail.example.com Hello localhost [127.0.0.1], pleased to meet you
...
>>> MAIL From:<root@mail.example.com> SIZE=53 AUTH=root@mail.example.com
250 2.1.0 <root@mail.example.com>... Sender ok
>>> RCPT To:<admin@mail.example.com>
>>> DATA
250 2.1.5 <admin@mail.example.com>... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
050 <admin@mail.example.com>... Connecting to local...
050 <admin@mail.example.com>... Sent
250 2.0.0 69QEhBCq002626 Message accepted for delivery
admin... Sent (69QEhBCq002626 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 mail.example.com closing connection

收件箱核对:

tail -7 /var/mail/admin

实测回显:

	for admin; Mon, 26 Oct 2026 14:43:11 GMT
Date: Mon, 26 Oct 2026 14:43:11 GMT
From: root <root@mail.example.com>
Message-Id: <202610261443.69QEhBFV002625@mail.example.com>
Subject: install test

hello from sendmail 8.15.2

验证五:队列干净。

mailq

实测回显:

MSP Queue status...
/var/spool/mqueue-client is empty
		Total requests: 0
MTA Queue status...
/var/spool/mqueue is empty
		Total requests: 0

至此方案 A 安装完成:服务 active、25/587 监听、本地投递成功、队列为空。

五、方案 B:官方源码编译安装(8.18.2)

5.1 方案说明

Ubuntu 仓库中的 8.15.2 落后官方两个大版本线,8.18 系列对 TLS 与安全默认值做了大量收紧(STARTTLS 强制策略等)。需要官方最新稳定版时走源码编译。Sendmail 的源码构建自带上游 Build 脚本(封装 make 与平台探测),构建产物覆盖 sendmail、mail.local、makemap、smrsh 等全套二进制。

5.2 前置依赖

apt-get install -y gcc make m4 wget libdb-dev

实测回显(节选):

Setting up gcc (11.4.0-1ubuntu1~22.04.3) ...
Setting up libdb-dev:amd64 (1:5.3.21~exp1ubuntu4) ...

libdb-dev 提供 Berkeley DB 头文件与库——没有它编译出的 sendmail 不含 NEWDB 特性,别名库(aliases.db)将无法重建(排障实录见「八、常见问题」问题 2)。

5.3 下载源码并校验

cd /usr/local/src
wget https://ftp.sendmail.org/sendmail.8.18.2.tar.gz
sha256sum sendmail.8.18.2.tar.gz

实测回显:

--2026-10-26 14:46:30--  https://ftp.sendmail.org/sendmail.8.18.2.tar.gz
...
sendmail.8.18.2.tar.gz saved [2372458/2372458]

1a085faa8ace52cffde2f5e9bc611bdb5f81481caaabf46f0437b719ca089d2f  sendmail.8.18.2.tar.gz

下载渠道说明:官方源 https://ftp.sendmail.org/ 实测可直接访问(433 KB/s),无需降级。

tar -xzf sendmail.8.18.2.tar.gz && cd sendmail-8.18.2 && ls

实测回显:

BUILDNOTES	Sendmail		libmilter		test
Build		INSTALL			libsm			textedit
BuildTools	KNOWNBUGS		libsmdb			vacation
CAVEATS		LICENSE			libsmutil
Files		Log			mail.local
INSTALL-help	Makefile.dist		mailstats
FAQ		PGPKEYS			makemap
RELEASE_NOTES	cf			praliases
RELEASE_NOTES-X	contrib			rmail
README		devtools		smrsh
README.tx	editable		sendmail

5.4 编写 site.config.m4 并编译

在 devtools/Site/site.config.m4(构建脚本自动加载的站点配置)中声明 Berkeley DB 支持。8.18.2 对 Berkeley DB 5.x 的文件锁有编译期检查,Linux 的 BDB 5.3 使用 fcntl 锁、不含 flock 支持,需同时声明官方提供的 ACCEPT_BROKEN_BDB_LOCKING 兼容宏(源码 sendmail/conf.c 注释明确该宏的语义:接受「map 锁定不生效、改 map 时需停 sendmail」这一限制):

cat > devtools/Site/site.config.m4 <<'EOF'
APPENDDEF(`conf_sendmail_ENVDEF', `-DNEWDB -DACCEPT_BROKEN_BDB_LOCKING')
APPENDDEF(`conf_sendmail_LIBS', `-ldb')
EOF
sh Build -c

实测回显(节选,实测尾部):

Making in /usr/local/src/sendmail-8.18.2/obj.Linux.7.0.0-38-generic.x86_64/vacation
make[1]: Entering directory '/usr/local/src/sendmail-8.18.2/obj.Linux.7.0.0-38-generic.x86_64/vacation'
cc -O2 -I. -I../../sendmail   -I../../include  -DNOT_SENDMAIL      -c -o vacation.o vacation.c
cc -o vacation   vacation.o      /usr/local/src/sendmail-8.18.2/obj.Linux.7.0.0-38-generic.x86_64/libsmdb/libsmdb.a /usr/local/src/sendmail-8.18.2/obj.Linux.7.0.0-38-generic.x86_64/libsmutil/libsmutil.a /usr/local/src/sendmail-8.18.2/obj.Linux.7.0.0-38-generic.x86_64/libsm/libsm.a  -ldl
make[1]: Leaving directory '/usr/local/src/sendmail-8.18.2/obj.Linux.7.0.0-38-generic.x86_64/vacation'

Build -c 会清理并重建全部目标(sendmail 主程序、makemap、mailstats、praliases、smrsh、rmail、vacation 等),产物落在 obj.Linux.<内核版本>.x86_64/ 目录。编译约 1–2 分钟,无报错即成功。

5.5 创建运行用户与目录

Sendmail 官方安全模型要求两个专用账号:smmsp(Sendmail Message Submission Program,运行 MSP/客户端队列)与 smmta(Mail Transfer Agent,运行 MTA),缺用户时 Build install 会直接失败:

groupadd smmsp
useradd -g smmsp -d /var/spool/clientmqueue -s /usr/sbin/nologin smmsp
groupadd smmta
useradd -g smmta -d /var/lib/sendmail -s /usr/sbin/nologin smmta
mkdir -p /var/spool/mqueue /var/spool/clientmqueue /etc/mail /var/lib/sendmail
chown smmsp:smmsp /var/spool/clientmqueue

每条命令独立执行,getent passwd smmsp smmta 确认:

smmsp:x:1000:1000::/var/spool/clientmqueue:/usr/sbin/nologin
smmta:x:1001:1001::/var/lib/sendmail:/usr/sbin/nologin

5.6 安装二进制

sh Build install

实测回显(节选,实测尾部):

install -c -o root -g smmsp -m 4555 sendmail /usr/sbin/sendmail

核对已安装二进制与特性集:

ls -la /usr/sbin/sendmail
/usr/sbin/sendmail -d0.4 -bv root </dev/null 2>&1 | head -4

实测回显:

-r-xr-sr-x 1 root smmsp 799128 Oct 26 14:55 /usr/sbin/sendmail
Version 8.18.2
 Compiled with: DNSMAP IPV6_FULL LOG MATCHGECOS MILTER MIME7TO8 MIME8TO7
		NAMED_BIND NETINET NETUNIX NEWDB=5.3 PIPELINING SCANF USERDB
		XDEBUG

NEWDB=5.3 出现在特性列表中,说明 Berkeley DB 支持已编入(别名库可用);MILTER 表示 milter 过滤接口可用。

5.7 生成并安装配置文件

源码包不含现成 sendmail.cf,需要从 cf/cf/ 下的原型 mc 生成。以 generic-linux.mc 为底:

cd /usr/local/src/sendmail-8.18.2/cf/cf
cp generic-linux.mc sendmail.mc

在 sendmail.mc 顶部(divert(-1) 之后)加入规范域名定义,避免与 apt 方案相同的「主机名不合格」问题:

define(`confDOMAIN_NAME', `mail.example.com')dnl

生成并安装 cf:

sh Build sendmail.cf
sh Build install-cf

实测回显:

Using M4=/usr/bin/m4
../../devtools/bin/install.sh -c -o root -g bin -m 0444 sendmail.cf /etc/mail/sendmail.cf
../../devtools/bin/install.sh -c -o root -g bin -m 0444 submit.cf /etc/mail/sendmail.cf

补齐两个必需文件:local-host-names(本机接收域名清单,use_cw_file 特性要求它存在)与 aliases(别名源文件):

echo mail.example.com > /etc/mail/local-host-names
touch /etc/mail/aliases
/usr/sbin/sendmail -bi

实测回显:

/etc/mail/aliases: 0 aliases, longest 0 bytes, 0 bytes total

5.8 启动守护进程与验证

源码安装不注册 systemd unit,首次验证直接用启动命令拉起 MTA(-bd 守护模式,-q30m 每 30 分钟跑一次队列):

/usr/sbin/sendmail -bd -q30m
ps -ef | grep 'sendmail:' | grep -v grep

实测回显:

root       10244       1  0 14:52 ?        00:00:00 sendmail: accepting connections

端口与横幅验证:

ss -ltn | grep :25
exec 3<>/dev/tcp/127.0.0.1/25 && head -c 90 <&3; exec 3<&-

实测回显:

LISTEN 0      10         0.0.0.0:25           0.0.0.0:*
220 mail.example.com ESMTP Sendmail 8.18.2/8.18.2; Mon, 26 Oct 2026 14:53:12 GMT; (No UCE/UBE) logging access from:

⚠️ 注意:generic-linux.mc 默认对外监听所有网卡(0.0.0.0:25),与 apt 方案的 127.0.0.1 默认相反。暴露到公网前务必评估中继策略(access 数据库默认拒绝无差别中继,但仍建议配合防火墙收紧)。

本地投递验证(需先补齐 local mailer,排障过程见「八、常见问题」问题 4、5):

useradd -m -s /bin/bash admin && echo 'admin:q1w2e3r4' | chpasswd
printf 'Subject: src-build final\n\nend-to-end from 8.18.2 source build\n' | /usr/sbin/sendmail admin
tail -4 /var/mail/admin

实测回显:

Subject: src-build final

end-to-end from 8.18.2 source build

如需 systemd 常驻托管,写一个最小 unit:

cat > /etc/systemd/system/sendmail-source.service <<'EOF'
[Unit]
Description=Sendmail MTA (source build 8.18.2)
After=network.target

[Service]
Type=forking
ExecStart=/usr/sbin/sendmail -bd -q30m
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/sendmail.pid

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now sendmail-source.service
systemctl is-active sendmail-source.service

实测回显:

active

⚠️ 注意:源码方案的 pid 文件路径以 /etc/mail/sendmail.cf 中 O PidFile 实际值为准,PIDFile= 需与其一致;$MAINPID 是 systemd 变量,写入 unit 文件即可。

六、方案对比与选择建议

维度方案 A:apt(8.15.2)方案 B:源码(8.18.2)
版本jammy universe 源 8.15.2-22ubuntu3官方 CURRENT 8.18.2
配置体系/etc/mail/sendmail.mc + sendmailconfig,Debian 宏封装上游 cf/cf/*.mc,手工 m4
监听默认127.0.0.1:25/587(保守)0.0.0.0:25(激进)
local mailerprocmail 由包依赖自动带上需自行 apt-get install procmail
服务管理systemd 自动托管手写 unit 或裸命令
升级apt upgrade重下源码重新 Build install
卸载apt-get remove --purge手工删 /usr/sbin/sendmail 等安装文件
适用人群绝大多数 Ubuntu 服务器需要官方最新版、或部署在非 Ubuntu 仓库覆盖的平台

选择建议:无特殊版本需求选方案 A——包管理器托管升级与卸载,配置体系(sendmail.mc + sendmailconfig)也更贴合 Ubuntu 生态;只有在确需 8.18 系列的新默认值(TLS 策略收紧、新的 milter 行为)时选方案 B,并接受手工维护二进制与 unit 的成本。

七、配置说明

7.1 /etc/mail 目录布局

apt 方案安装后的完整布局如下:

ls -la /etc/mail/ | grep -v '^total'

实测回显:

drwxr-sr-x 7 smmta smmsp  4096 Oct 26 14:42 .
drwxr-xr-x 1 root  root   4096 Oct 26 14:43 ..
-rwxr-xr-- 1 root  smmsp 10012 Oct 26 14:42 Makefile
-rw------- 1 root  root   4265 Oct 26 14:42 access
-rw-r----- 1 smmta smmsp 12288 Oct 26 14:42 access.db
-rw-r--r-- 1 root  root    281 Dec  9  2021 address.resolve
lrwxrwxrwx 1 root  smmsp    10 Oct 26 14:32 aliases -> ../aliases
-rw-r----- 1 smmta smmsp 12288 Oct 26 14:42 aliases.db
-rw-r--r-- 1 root  root   3219 Oct 26 14:42 databases
-rw-r--r-- 1 root  root   5659 Dec  9  2021 helpfile
-rw-r--r-- 1 root  smmsp    15 Oct 26 14:32 local-host-names
drwxr-sr-x 2 smmta smmsp  4096 Oct 26 14:31 m4
drwxr-xr-x 2 root  root   4096 Oct 26 14:31 peers
drwxr-sr-x 2 root  smmsp  4096 Dec  9  2021 sasl
-rw-r--r-- 1 root  smmsp 64121 Oct 26 14:42 sendmail.cf
-rw-r--r-- 1 root  root  12235 Oct 26 14:42 sendmail.conf
-rw-r--r-- 1 root  smmsp  4066 Oct 26 14:42 sendmail.mc
-rw-r--r-- 1 root  root    148 Dec  9  2021 service.switch
-rw-r--r-- 1 root  root    179 Dec  9  2021 service.switch-nodns
drwxr-sr-x 2 smmta smmsp  4096 Oct 26 14:31 smrsh
-rw-r--r-- 1 root  smmsp 44554 Oct 26 14:42 submit.cf
-rw-r--r-- 1 root  smmsp  2383 Oct 26 14:42 submit.mc
drwxr-xr-x 2 root  smmsp  4096 Dec  9  2021 tls
-rw-r--r-- 1 root  smmsp     0 Oct 26 14:32 trusted-users

关键文件分工:sendmail.mc → 生成 sendmail.cf(MTA 配置);submit.mc → 生成 submit.cf(MSP 本地提交配置);access → 生成 access.db(中继/黑名单策略);aliases → 生成 aliases.db(系统别名);local-host-names(本机接收域名)、relay-domains(允许中继的域名)、trusted-users(可信用户)是三个「源文件」。Makefile 把上述生成关系全部封装成 make 目标。

7.2 修改配置的标准流程

Debian/Ubuntu 体系的铁律:改 .mc,不改 .cf(.cf 是生成产物,手改会被下次构建覆盖)。流程:

  1. 编辑 /etc/mail/sendmail.mc;
  2. 运行 sendmailconfig(交互确认后重生成 .cf 并重载服务),或 make -C /etc/mail(只重新生成,需手动 systemctl reload sendmail);
  3. 用 echo $Z | sendmail -bt 或 SMTP 横幅核对生效。

实测(把默认仅监听本机改为对外监听的样例改动即基于此流程,详细参数见《Sendmail 8.15.2 配置参数详解》)。

7.3 邮件目录与运行账号

路径属主用途
/var/spool/mqueuesmmta:smmsp(apt 方案)/ root:smmsp(源码方案)MTA 投递队列
/var/spool/clientmqueuesmmsp:smmspMSP 客户端提交队列
/var/mail/<用户><用户>:mail用户 mbox 收件箱
/var/lib/sendmailsmmta主机状态等运行时数据

八、常见问题(FAQ)

Q1:安装时提示 WARNING: local host name (mail) is not qualified; see cf/README: WHO AM I?,之后 sendmail -bv、投递等操作长时间无响应?

这是 Sendmail 最经典的规范名问题。现象链:安装警告 → 命令挂起。定位:本机主机名是短名 mail,/etc/resolv.conf 的 search localdomain 使 Sendmail 的 canonification 规则把 mail 扩展成 mail.localdomain 去 DNS 查询,得到 SERVFAIL 后按 DNS 重试策略反复查询,命令表现为「卡死」。解决两步:

  1. /etc/hosts 本机行写全 FQDN:10.89.57.2 mail.example.com mail;
  2. /etc/mail/sendmail.mc 显式声明规范域名后重建配置:
define(`confDOMAIN_NAME', `mail.example.com')dnl
sendmailconfig

实测回显(节选):

Creating /etc/mail/sendmail.cf...
Creating /etc/mail/submit.cf...
...
/etc/mail/aliases: 0 aliases, longest 0 bytes, 0 bytes total
Reload the running sendmail now with the new configuration? [Y] Reloading sendmail ...

验证恢复:

sendmail -bv root
root... deliverable: mailer local, user root
exec 3<>/dev/tcp/127.0.0.1/25 && head -c 60 <&3; exec 3<&-
220 mail.example.com ESMTP Sendmail 8.15.2/8.15.2/Debian-22ubuntu3; Mon, 26 Oct 2026 14:42

Q2:源码方案 sendmail -bi 报 Cannot rebuild aliases: no database format defined?

编译时未编入 Berkeley DB 支持(Compiled with: 列表缺 NEWDB)。解决:安装 libdb-dev,在 devtools/Site/site.config.m4 加 APPENDDEF(conf_sendmail_ENVDEF', -DNEWDB') 与 APPENDDEF(conf_sendmail_LIBS', -ldb'),重新 sh Build -c && sh Build install,特性列表出现 NEWDB=5.3 即修复。

Q3:加 -DNEWDB 后编译报 #error "Berkeley DB file locking needs flock() for version 5.x (and greater?)"?

Berkeley DB 5.x 无 flock 支持触发了 sendmail 8.18 的编译期安全检查。源码 sendmail/conf.c 注释给出官方出口:编译宏 ACCEPT_BROKEN_BDB_LOCKING,语义是「接受 map 锁定不工作:使用 makemap/newaliases 改库期间需停全部 sendmail 进程」。在 site.config.m4 写成:

APPENDDEF(`conf_sendmail_ENVDEF', `-DNEWDB -DACCEPT_BROKEN_BDB_LOCKING')

生产上把「重建 aliases 前先停服务」作为操作纪律执行即可。

Q4:源码方案启动后发信报 Deferred: 421 4.3.0 collect: Cannot write ./df... (bfcommit, uid=0, gid=1000): Permission denied?

MTA 以 root:smmsp(gid 1000 即 smmsp 组)运行,但队列目录 /var/spool/mqueue 对组不可写。解决:

chown root:smmsp /var/spool/mqueue
chmod 750 /var/spool/mqueue

实测回显:

drwxr-x--- 2 root smmsp 4096 Oct 26 14:49 /var/spool/mqueue

Q5:源码方案投递报 MOperating system error,邮件滞留队列?

generic-linux.mc 生成的 local mailer 是 P=/usr/bin/procmail,源码安装不含 procmail,投递时 exec 失败即报系统错误。解决:

apt-get install -y procmail
/usr/sbin/sendmail -q

Q6:给源码方案机器 apt-get install procmail 后 sendmail 命令行为大变、版本号变成 3.6.x?

procmail 依赖 default-mta,而源码安装的 sendmail 不被 apt 感知,apt 会把 postfix 作为默认 MTA 拉进来,并用 postfix 的 sendmail 包装程序覆盖 /usr/sbin/sendmail(实测被覆盖后的文件仅 31184 字节,属 postfix 二进制)。解决:

apt-get remove --purge -y postfix
cd /usr/local/src/sendmail-8.18.2 && sh Build install

实测恢复后:

-r-xr-sr-x 1 root smmsp 799128 Oct 26 14:55 /usr/sbin/sendmail
/usr/bin/mailq -> /usr/sbin/sendmail
Version 8.18.2

预防:源码方案的服务器上先装 sendmail 生态再装其他依赖 MTA 的软件;或安装任何会拉入 default-mta 的软件前先 apt-mark hold 相关包名并核对依赖树(apt-get -s install <pkg> 可先模拟)。

Q7:源码方案启动报 /etc/mail/sendmail.cf: line 73: fileclass: cannot open '/etc/mail/local-host-names': No such file or directory?

use_cw_file 特性要求该文件存在。echo mail.example.com > /etc/mail/local-host-names 后重试。文件内容是本机作为最终收件域的域名清单,每行一个。

九、卸载与清理

方案 A(apt):

apt-get remove --purge -y sendmail sendmail-base sendmail-bin sendmail-cf sensible-mda
apt-get autoremove -y

残留核对:

dpkg -l | grep sendmail; ls /etc/mail 2>/dev/null; ls /var/spool/mqueue 2>/dev/null

实测回显(卸载后应无输出):

说明:--purge 会连带删除 /etc/mail 下的打包配置;/var/mail/ 中的用户邮箱不属 sendmail 包管理,如有留存需按需手工处理。

方案 B(源码):逐项删除安装文件(源码安装不进包数据库,只能手工清):

rm -f /usr/sbin/sendmail /usr/bin/mailq /usr/bin/newaliases /usr/bin/mailstats /usr/bin/praliases /usr/bin/makemap /usr/libexec/smrsh
rm -f /etc/mail/sendmail.cf /etc/mail/submit.cf /etc/mail/local-host-names /etc/mail/aliases /etc/mail/aliases.db
rm -f /etc/systemd/system/sendmail-source.service && systemctl daemon-reload
rm -rf /usr/local/src/sendmail-8.18.2 /usr/local/src/sendmail.8.18.2.tar.gz
userdel -r smmsp; userdel -r smmta

每条独立执行;删除前确认没有别的脚本引用这些路径。

十、参考链接

  • Sendmail 官方发布目录(CURRENT/latest):https://ftp.sendmail.org/
  • Sendmail 8.18.2 源码包:https://ftp.sendmail.org/sendmail.8.18.2.tar.gz
  • 官方 RELEASE_NOTES:https://ftp.sendmail.org/RELEASE_NOTES
  • Sendmail 官网:https://www.sendmail.org/
  • cf/README(m4 配置权威文档,sendmail-doc 包内为 /usr/share/doc/sendmail-doc/cf.README.gz):https://ftp.sendmail.org/
  • Ubuntu jammy sendmail 包页:https://packages.ubuntu.com/jammy/sendmail