Sendmail 8.18.2 常用 CLI 命令与工具详解
Sendmail 命令行工具族全景:sendmail 模式开关与身份自检、-bv/-bt 地址解析实测追踪、mailq 双队列管理、newaliases/makemap 标准流程与空输入重建事故、mailstats 路径差异、praliases 异常规避、smrsh 机制,8.18.2 与 8.15.2 双环境实测照抄。
Sendmail 8.18.2 常用 CLI 命令与工具详解
目标:掌握 Sendmail 日常运维的全部命令行工具——sendmail 主命令(-bp/-bi/-bv/-bt/-q 模式族)、mailq 队列管理、newaliases 别名维护、makemap 映射库编译、mailstats 收发统计、praliases/hoststat/purgestat/editmap 辅助工具与 smrsh 限制壳。全文以《Sendmail 8.18.2 Docker Compose 部署指南》搭建的 8.18.2 环境与《Ubuntu 22.04 安装 Sendmail 8.15.2 指南》搭建的 Ubuntu 22.04(8.15.2)环境为双基准实测(2026-10-27 取证),所有命令与回显现场照抄,两版差异如实标注。
一、工具全景与二进制布局
Sendmail 的命令行工具族有个独特设计:mailq、newaliases、hoststat、purgestat 全都是 sendmail 同一二进制的符号链接——sendmail 按被调用的名字(argv[0])切换行为。实测 8.18.2 环境的符号链接关系(ls -la 现场照抄):
lrwxrwxrwx 1 root root 18 Oct 27 03:40 /usr/bin/hoststat -> /usr/sbin/sendmail
lrwxrwxrwx 1 root root 18 Oct 27 03:40 /usr/bin/mailq -> /usr/sbin/sendmail
lrwxrwxrwx 1 root root 18 Oct 27 03:40 /usr/bin/newaliases -> /usr/sbin/sendmail
lrwxrwxrwx 1 root root 18 Oct 27 03:40 /usr/bin/purgestat -> /usr/sbin/sendmail
-r-xr-xr-x 1 bin bin 94920 Oct 27 02:59 /usr/sbin/mailstats
-r-xr-xr-x 1 bin bin 113856 Oct 27 02:59 /usr/sbin/makemap
-r-xr-xr-x 1 bin bin 109464 Oct 27 02:59 /usr/sbin/praliases
-r-xr-sr-x 1 root smmsp 799128 Oct 27 02:59 /usr/sbin/sendmail
-r-xr-xr-x 1 bin bin 90232 Oct 27 02:59 /usr/sbin/smrsh
注意主二进制的权限位 -r-xr-sr-x root smmsp——setgid smmsp(组位是 s),这正是普通用户能把信件投进 MSP 队列(/var/spool/clientmqueue)的权限机制。
Ubuntu 22.04(8.15.2)的工具布局完全不同:真实二进制集中在 /usr/libexec/sendmail/,经 Debian alternatives 机制软链进 PATH。实测全目录(ls -la /usr/libexec/sendmail/ 现场照抄):
total 1540
drwxr-xr-x 2 root root 4096 Oct 26 17:22 .
drwxr-xr-x 1 root root 4096 Oct 26 17:22 ..
-rwxr-xr-x 1 root root 95512 Dec 9 2021 editmap
lrwxrwxrwx 1 root root 8 Dec 9 2021 hoststat -> sendmail
-rwxr-xr-x 1 root root 107992 Dec 9 2021 mail.local
lrwxrwxrwx 1 root root 8 Dec 9 2021 mailq -> sendmail
-rwxr-sr-x 1 root smmsp 83160 Dec 9 2021 mailstats
-rwxr-xr-x 1 root root 99608 Dec 9 2021 makemap
lrwxrwxrwx 1 root root 8 Dec 9 2021 newaliases -> sendmail
-rwxr-xr-x 1 root root 99608 Dec 9 2021 praliases
lrwxrwxrwx 1 root root 8 Dec 9 2021 purgestat -> sendmail
-rwxr-sr-x 1 root smmsp 856888 Dec 9 2021 sendmail
-rwxr-xr-x 1 root root 79064 Dec 9 2021 smrsh
lrwxrwxrwx 1 root root 8 Dec 9 2021 smtpd -> sendmail
-rwxr-xr-x 1 root root 124600 Dec 9 2021 vacation.sendmail
实测 PATH 内的入口与链接链:
| 命令 | Ubuntu 22.04 实测链接链 | 8.18.2 环境 |
|---|---|---|
| sendmail | /usr/sbin/sendmail -> /etc/alternatives/sendmail -> /usr/libexec/sendmail/sendmail | /usr/sbin/sendmail(真身) |
| mailq | /usr/bin/mailq -> /etc/alternatives/mailq -> /usr/share/sendmail/mailq(包装脚本) | /usr/bin/mailq -> /usr/sbin/sendmail |
| newaliases | PATH 内不存在(仅 /usr/libexec/sendmail/newaliases -> sendmail) | /usr/bin/newaliases -> /usr/sbin/sendmail |
| mailstats | /usr/sbin/mailstats -> ../share/sendmail/mailstats | /usr/sbin/mailstats |
| praliases | /usr/sbin/praliases -> ../libexec/sendmail/praliases | /usr/sbin/praliases |
| makemap | /usr/sbin/makemap -> ../libexec/sendmail/makemap | /usr/sbin/makemap |
| smrsh | 仅 /usr/libexec/sendmail/smrsh | /usr/sbin/smrsh |
| editmap | 仅 /usr/libexec/sendmail/editmap | 未收录 |
| mail.local | /usr/libexec/sendmail/mail.local | 未收录(本地投递走 procmail) |
两个高频踩坑由此而来:
- Ubuntu 上敲
newaliases报 command not found——不是别名机制坏了,是 PATH 里没这个入口。等价命令:/usr/libexec/sendmail/newaliases、/usr/sbin/sendmail -bi,或make -C /etc/mail(顺带重编全部库); - Ubuntu 的 mailq 经
/usr/share/sendmail/mailq包装脚本,行为与sendmail -bp等价但输出格式可能带 Debian 附加提示,脚本化解析时以sendmail -bp为准。
二、sendmail 主命令详解
2.1 模式开关(-b 系列)
sendmail 的行为由 -b<mode> 决定,一次只能选一个模式:
| 模式 | 含义 | 等价命令 | 典型场景 |
|---|---|---|---|
-bd | 守护模式监听 25(后台 fork) | — | 服务自启脚本 |
-bD | 守护模式但前台运行(PID 1 场景) | — | 部署篇 CMD 所用 |
-bm | 默认:投递邮件后退出 | — | 命令行发信 |
-bp | 打印队列(只读) | mailq | 队列巡检 |
-bi | 初始化/重编译别名库 | newaliases | 改别名后 |
-bv | 仅验证地址可达性,不投递 | — | 别名/路由排查 |
-bt | 地址解析测试模式(交互) | — | 规则集调试 |
-bh | 输出主机状态缓存 | hoststat | 对端健康排查 |
-bH | 清除主机状态缓存 | purgestat | 状态缓存纠错 |
2.2 身份与配置选择(-Ac / -Am)
-Ac:使用 submit.cf 体系(MSP 角色,操作/var/spool/clientmqueue);-Am:使用 sendmail.cf 体系(MTA 角色,操作/var/spool/mqueue,root 守护默认)。
部署篇的入口脚本就是双体系并跑的实例:MTA 前台 -bD + MSP 队列跑动 sendmail -Ac -q20m &。实测进程表(ps aux 节选):
root 1 0.0 0.0 6204 4032 ? Ss 03:40 0:00 sendmail: accepting connections
smmsp 12 0.0 0.0 6048 2592 ? Ss 03:40 0:00 sendmail: Queue runner@00:20:00 for /var/spool/clientmqueue
队列跑动进程的显示名 Queue runner@00:20:00 for /var/spool/clientmqueue 直接给出跑动间隔(20 分钟)与队列路径——巡检时一眼核对配置是否生效。
2.3 版本与身份自检(-d0.4)
sendmail -d0.4 -bt < /dev/null 输出版本、编译特性与身份四元组,是任何排障的第一步。实测(8.18.2,输出首尾照抄):
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
Canonical name: mail.example.com
UUCP nodename: mail.example.com
a.k.a.: mail
a.k.a.: [10.89.58.20]
a.k.a.: [127.0.0.1]
============ SYSTEM IDENTITY (after readcf) ============
(short domain name) $w = mail
(canonical domain name) $j = mail.example.com
(subdomain name) $m = example.com
(node name) $k = mail.example.com
========================================================
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
>
读法:Compiled with 一行核对关键特性是否编入(NEWDB=5.3 哈希库支持、MILTER 过滤器协议、PIPELINING 流水线);IDENTITY 块的 $w(短主机名)、$j(规范域名)、$m(子域)、$k(节点名)决定 SMTP 横幅与 Message-Id——与配置篇 confDOMAIN_NAME 的呼应关系一目了然。Ubuntu 22.04 侧同命令实测为 Version 8.15.2、特性行多出 SASLv2 STARTTLS TCPWRAPPERS(apt 包编译特性更全),身份四元组同样正确($j = mail.example.com)。
2.4 地址验证(-bv)
-bv 只做地址解析不投递。实测 8.18.2 环境:
sendmail -bv admin
回显:
admin... deliverable: mailer local, user admin
deliverable: mailer local, user admin = 解析成功、经 local 投递代理落到本地用户 admin。换一个不存在用户:
sendmail -bv nosuchuser
回显(实测):
nosuchuser... User unknown
两版差异现象(实测在案):-bv postmaster 在 8.18.2 环境返回 postmaster... deliverable: mailer local, user root(别名已展开),而在 Ubuntu 22.04(8.15.2)环境返回 postmaster... User unknown——后者 -bv 走的链路不展开 MTA 侧别名库(Debian 提交体系特性)。判定别名是否生效不能只依赖 -bv,应结合实际投递与日志(排障实录见「十、」问题 3)。
2.5 地址解析追踪(-bt 与 /try)
-bt 进入交互测试模式,配合 /tryflags 与 /try 可以单步追踪规则集改写过程。实测追踪外发地址 admin@example.com 以 esmtp 代理处理(8.18.2,完整回显照抄):
$ printf '/tryflags HS\n/try esmtp admin@example.com\n/quit\n' | sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> > Trying header sender address admin@example.com for mailer esmtp
canonify input: admin @ example . com
Canonify2 input: admin < @ example . com >
Canonify2 returns: admin < @ example . com . >
canonify returns: admin < @ example . com . >
1 input: admin < @ example . com . >
1 returns: admin < @ example . com . >
HdrFromSMTP input: admin < @ example . com . >
PseudoToReal input: admin < @ example . com . >
PseudoToReal returns: admin < @ example . com . >
MasqSMTP input: admin < @ example . com . >
MasqSMTP returns: admin < @ example . com . >
MasqHdr input: admin < @ example . com . >
MasqHdr returns: admin < @ example . com . >
HdrFromSMTP returns: admin < @ example . com . >
final input: admin < @ example . com . >
final returns: admin @ example . com
Rcode = 0, addr = admin@example.com
>
逐行读法:canonify 规范化地址(补尾点)、HdrFromSMTP/HdrFromL 头发件人处理、MasqSMTP/MasqHdr 伪装改写(genericstable 生效层)、final 输出最终形态;Rcode = 0 表示可投递。本地地址实测(/try local admin):走 HdrFromL 分支,final returns: admin,Rcode = 0——本地用户解析路径正确。/tryflags 取值:H(头地址)/E(信封地址)/S(发件人)/R(收件人),组合使用如 HS。
2.6 其他常用选项
| 选项 | 语义 | 备注 |
|---|---|---|
-f <发件人> | 指定信封发件人 | 测试投递路径必备 |
-t | 从邮件头(To/Cc/Bcc)提取收件人 | 命令行发信便利写法 |
-v | 详细模式,投递过程打到标准错误 | 与 -bm 组合看每次投递尝试 |
-q<间隔> | 以守护身份每<间隔>跑一次队列 | 如 -q30m |
-O <选项>=<值> | 命令行覆盖 conf 参数 | 如 -O DeliveryMode=b |
-X <文件> | 全量调试日志(记录一切收发动作) | 输出量巨大,仅短时排障用 |
sendmail 的退出码遵循 sysexits.h 约定,脚本化调用时按码分支处理:
| 码 | 符号 | 含义 |
|---|---|---|
| 0 | EX_OK | 成功 |
| 64 | EX_USAGE | 命令行用法错误 |
| 65 | EX_DATAERR | 数据格式错误 |
| 67 | EX_NOUSER | 收件用户不存在 |
| 68 | EX_NOHOST | 主机名无法解析 |
| 69 | EX_UNAVAILABLE | 服务不可用(如映射库缺失) |
| 75 | EX_TEMPFAIL | 暂时失败(应稍后重试) |
| 77 | EX_NOPERM | 权限不足 |
| 78 | EX_CONFIG | 配置错误 |
三、mailq 与队列管理
3.1 查看队列
mailq(≡ sendmail -bp)查看 MTA 队列。实测(投递闭环完成后的健康态,8.18.2):
mailq
回显:
/var/spool/mqueue is empty
Total requests: 0
MSP 客户端队列用 -Ac 切换体系查看:
mailq -Ac
回显:
/var/spool/clientmqueue is empty
Total requests: 0
两条队列都空是「投递链路无滞留」的健康信号。任何邮件管理操作前先看这两条队列——队列里有信时重启/改配置都可能造成重复投递或滞留。
队列非空时的输出格式(标准格式,供识读):每个队列项一个块——首行 队列号、大小、入队时间、发件人,续行 (延迟原因) 与收件人列表;磁盘上对应两个文件:qf<队列号>(信封+控制信息)与 df<队列号>(信体),另有 tf(重建中的临时件)与 Qf(损坏隔离件)。队列号形如 69R3fEMY000014:日期字符+主机标识+进程内序号,可直接用于日志 grep。
3.2 队列跑动(-q)
| 命令 | 语义 | 实测情况 |
|---|---|---|
sendmail -q | 立即跑一遍队列后退出 | 手工触发投递 |
sendmail -q30m | 守护方式每 30 分钟跑队列 | 部署篇 CMD 在用 |
sendmail -qR<字符串> | 只跑收件人含<字符串>的队列项 | 精准重试 |
sendmail -Ac -q20m | MSP 体系队列跑动 | 入口脚本在用 |
实测 -qR 的日志印证(Ubuntu 22.04 侧,改 access 规则后定向重跑,日志行照抄):
Oct 27 02:10:26 mail sm-mta[5978]: running queue: /var/spool/mqueue
-qR<域或地址片段> 与 -qI<队列号>(按队列号)是「改完 access/网络后只重试失败项」的精准工具,避免全队列重跑放大副作用。
四、newaliases 与别名维护
newaliases(≡ sendmail -bi)重编译 /etc/mail/aliases → aliases.db。实测(8.18.2,构建期自检回显,语义同手工执行):
/etc/mail/aliases: 3 aliases, longest 10 bytes, 52 bytes total
回显三段式即健康核对单:别名总数(3)、最长目标字节数(10)、库总字节数(52)。有语法错误(目标为空、格式残缺)时 newaliases 报错退出并保留旧库——生产环境改别名不怕手滑,旧映射继续生效。
标准改别名流程:
vi /etc/aliases # 1) 编辑文本源(/etc/mail/aliases 是它的符号链接)
newaliases # 2) 重编译库(Ubuntu: /usr/sbin/sendmail -bi)
sendmail -bv <本地用户> # 3) 抽查非别名目标的解析(注意 2.4 节的版本差异)
实测权限印证:重编译产物 aliases.db 属主 smmta:smmsp、权限 640(stat 照抄)——运行中的 MTA 以 smmta 身份读库,root 执行 newaliases 重写后属主自动归位,无需手工 chown。
五、makemap 与映射库工具
5.1 映射类型与基本语法
makemap 把文本源编译成 sendmail 运行时查询的哈希库。先看本机支持哪些类型(makemap -l 实测,Ubuntu 22.04 侧):
hash
btree
实测支持 hash 与 btree 两种(dbm 未编入)。日常全部用 hash。生成语法:
makemap hash <输出名> < <文本源>
四类映射库的标准生成命令(文本源与库文件同目录,库自动加 .db 后缀):
makemap hash /etc/mail/access < /etc/mail/access
makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
makemap hash /etc/mail/genericstable < /etc/mail/genericstable
makemap hash /etc/mail/mailertable < /etc/mail/mailertable
常用选项:
| 选项 | 语义 |
|---|---|
-l | 列出可用映射类型 |
-o | 追加模式(保留库中已有条目) |
-r | 允许重复键时替换旧值(默认报错) |
-s | 跳过对键中危险字符的安全检查 |
-t <字符> | 自定义键值分隔符(默认空白) |
-N | 键以 NUL 结尾(与某些库配合) |
-v | 详细模式 |
5.2 真实事故:makemap 空输入重建(实测在案)
执行 makemap -d hash /etc/mail/access 时忘接输入重定向,stdin 立即 EOF——makemap 把「空输入」当作合法数据源,直接以空库覆盖了 access.db(时间戳实测更新为事故时刻,原 317 字节文本源对应的规则全部消失)。修复:从文本源重新编译即可完整还原:
makemap hash /etc/mail/access < /etc/mail/access # 修复命令,实测 EXIT=0
修复后 .db 时间戳恢复更新且规则全部回位。教训:makemap 是「 stdin → 库」的单向编译器,交互敲命令时必须显式带上 < 文本源;顺带说明 -d 是「允许重复键」而不是很多人以为的 dump 模式——makemap 本身不提供库→文本的反向导出。
5.3 editmap 与库内容检视
makemap 只进不出,检视库内容的手段:
- editmap(Ubuntu 侧
/usr/libexec/sendmail/editmap):交互式查询/编辑映射库,逐键查询命中值(8.18.2 环境未收录该工具); - praliases:别名库专用检视工具(异常现象见「十、」问题 2);
sendmail -bv/-bt:行为级验证——库改对了,解析结果立刻变化,比看库本身更可靠;- 时间戳核对:
ls -l /etc/mail/*.db与文本源对照,「.db 早于源」即漏编译(配置篇排障实录问题 3 的判定法)。
六、mailstats 收发统计
mailstats 读取统计文件输出各投递代理的收发计数。两版默认路径不同且都会踩空(排障实录问题 1),实测以 -f 显式指定最稳。
8.18.2 环境实测(统计文件在 /etc/mail/statistics):
mailstats -f /etc/mail/statistics
回显(新环境无累计,各列为 0):
Statistics from Tue Oct 27 04:08:52 2026
M msgsfr bytes_from msgsto bytes_to msgsrej msgsdis msgsqur Mailer
=====================================================================
T 0 0K 0 0K 0 0 0
C 0 0 0
列语义:M 投递代理编号、msgsfr 经此代理发出的信数、bytes_from 发出字节(K 单位)、msgsto/bytes_to 收件方向同义、msgsrej 拒收数、msgsdis 丢弃数、msgsqur 清空数;T 行全代理合计、C 行连接计数。跑量后该表即为容量与滥用监控的现成数据源。
Ubuntu 22.04 侧实测(默认路径检索失败的现象):
MSP statistics...
mailstats: /var/lib/sendmail/sm-client.st: No such file or directory
MTA statistics...
mailstats: /var/lib/sendmail/sendmail.st: No such file or directory
Debian 包默认统计文件位于 /var/lib/sendmail/(MSP 用 sm-client.st、MTA 用 sendmail.st),新装环境两者都不存在——先创建空文件(touch /var/lib/sendmail/sendmail.st /var/lib/sendmail/sm-client.st 并给运行身份写权限)后 mailstats 才开始累计;或以 /var/log/mail.log 的 stat= 行统计替代。
七、praliases、editmap 与别名检视
praliases 设计用途是导出别名库内容。实测两套环境均异常(细节与规避见「十、」问题 2):
8.18.2 环境:
$ praliases
praliases: /etc/mail/aliases: open: Unknown database type
$ praliases -f /etc/mail/aliases.db
praliases: /etc/mail/aliases.db: open: Unknown database type
Ubuntu 22.04 侧默认执行则报 praliases: /etc/mail/aliases: open: Permission denied。
可用的替代检视路径(实测有效):直接读文本源 cat /etc/mail/aliases;行为验证用 sendmail -bv <本地用户> 与实际投递;库完整性用 newaliases 的重编译回显核对。
八、smrsh 与主机状态工具
8.1 smrsh——受限投递壳
别名目标写 |命令 时,命令由本地投递代理拉起执行——历史上这曾是命令注入的经典入口。smrsh(Sendmail Restricted Shell)只允许执行白名单目录内的程序:别名里写 |procmail 实际执行的是白名单目录下指向 procmail 的链接。
实测布局:8.18.2 环境内置 /usr/sbin/smrsh(-r-xr-xr-x bin bin);Ubuntu 侧二进制在 /usr/libexec/sendmail/smrsh。是否启用由 mc 的 FEATURE(smrsh) 决定:实测两套环境的默认配置都未启用(Ubuntu 的 sendmail.cf 中无 smrsh 字样,本地投递由 procmail 承担;8.18.2 的 generic-linux 模板同样未启用)。启用方法与白名单维护:
FEATURE(`smrsh')dnl # 写入 sendmail.mc,make -C /etc/mail 重生成
ln -s /usr/bin/procmail /etc/mail/smrsh/procmail # 白名单目录内建软链(目录以 FEATURE 参数指定)
启用后别名管道命令超出白名单即拒投,日志可见 Service unavailable 类记录。
8.2 hoststat / purgestat
hoststat(≡ sendmail -bh)输出对端主机的历史投递状态缓存(成功率/最近失败原因,供队列跑动做退避决策);purgestat(≡ sendmail -bH)清空该缓存。实测 8.18.2 环境 hoststat 输出为空——未启用主机状态目录(confHOST_STATUS_DIRECTORY 未定义)时无数据可列,属正常现象而非故障。需要该功能时在 mc 中启用 hoststatus 相关参数并重生成 cf。
8.3 SMTP 协议层自检(HELP)
排障利器其实是协议本身。实测 8.18.2 横幅与 HELP 响应(/dev/tcp 直连本机 25 端口,回显照抄):
220 mail.example.com ESMTP Sendmail 8.18.2/8.18.2; Tue, 27 Oct 2026 04:30:49 GMT
214-2.0.0 This is sendmail version 8.18.2
214-2.0.0 Topics:
214-2.0.0 HELO EHLO MAIL RCPT DATA
214-2.0.0 RSET NOOP QUIT HELP VRFY
214-2.0.0 EXPN VERB ETRN DSN AUTH
214-2.0.0 STARTTLS
214-2.0.0 For more info use "HELP <topic>".
214-2.0.0 To report bugs in the implementation see
214-2.0.0 http://www.sendmail.org/email-addresses.html
214-2.0.0 For local information send email to Postmaster at your site.
214 2.0.0 End of HELP info
横幅核对三要素:域名(confDOMAIN_NAME 生效)、版本(8.18.2/8.18.2)、时间;HELP 的 Topics 列表即本机支持的 SMTP 动词集,HELP 文案来自 /etc/mail/helpfile。
九、运维实战手册
9.1 每日巡检命令链
mailq && mailq -Ac # 双队列滞留检查(健康态应双双为空)
mailstats -f /etc/mail/statistics # 收发与拒收计数(8.15.2: -f /var/lib/sendmail/sendmail.st)
tail -50 /var/log/mail.log # 最近投递审计(grep 'stat=' 看成败)
ss -ltn | grep ':25 ' # 端口监听健在
sendmail -d0.4 -bt < /dev/null # 版本/身份/编译特性自检(< /dev/null 防交互挂起)
日志行读法(现场样例):mailer=local ... stat=Sent 为本地落箱成功;stat=Deferred: ... 为暂时失败将自动重试;ruleset=check_rcpt ... reject=550 为规则拦截(中继拒绝/黑名单命中)。
9.2 队列卡信处理五步
mailq看滞留项的(原因)行——DNS 失败/对端拒收/超时各不同;sendmail -qR<域>定向重试单项(改完网络/DNS 后先试一发);sendmail -v -bm -f 测试发件人 <地址>实投一封测试信,-v打出逐跳过程;- 确认死信(对端永久拒收):
sendmail -qI<队列号> -v单项处理,或将qf/df文件移出队列目录隔离(移出即放弃投递); - 检查
df有qf无的孤儿数据件——直接清理磁盘,无投递意义。
9.3 别名与映射库变更 SOP
vi /etc/aliases && newaliases # 别名链
vi /etc/mail/access && makemap hash /etc/mail/access < /etc/mail/access # 访问控制链
vi /etc/mail/virtusertable && makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
ls -l /etc/mail/*.db # 时间戳核对(必须晚于文本源)
映射库变更不需要重启——规则集每次查询都读库;mc/FEATURE/define 变更才需要重生成 cf 并重载服务(配置篇「生效流程与验证」)。
9.4 长输出防断管纪律
编译/批量诊断类命令(sh Build、全量日志检索)输出动辄数千行,直连管道传输时一旦读端提前关闭即触发 SIGPIPE 使命令中断(部署篇排障实录问题 3 的构建事故同源)。纪律:长输出一律先全量重定向到文件,再 tail/grep 取回显——本文所有实测回显均按此纪律采集。
十、排障实录
以下五则均为本次实测过程中的真实现象,按「现象 → 已知规避」如实记录:
问题 1:mailstats: no statistics file located(8.18.2)与默认路径 No such file(8.15.2)。
8.18.2 环境裸执行 mailstats 报 mailstats: no statistics file located——默认搜索路径不含 /etc/mail/statistics;Ubuntu 22.04 侧默认检索 /var/lib/sendmail/sm-client.st 与 /var/lib/sendmail/sendmail.st,新装环境两者均不存在(实测回显见「六、」)。已知规避:统一用 -f 显式指定——8.18.2 用 -f /etc/mail/statistics(实测可用);8.15.2 先 touch 创建默认路径文件再统计,或以日志 stat= 行统计替代。
问题 2:praliases 两套环境均无法导出。
现象:8.18.2 环境裸执行与 -f /etc/mail/aliases.db 显式路径均报 Unknown database type;Ubuntu 22.04 侧报 Permission denied(回显见「七、」)。已知规避:改用文本源直接检视(cat /etc/aliases)、行为验证(sendmail -bv)与 newaliases 重编译回显核对库完整性。该工具在本两套环境判定为不可用,未继续深挖(不影响别名机制本身——newaliases 写库、MTA 读库链路实测正常)。
问题 3:-bv postmaster 两版行为相反。
8.18.2 环境返回 postmaster... deliverable: mailer local, user root(别名展开);Ubuntu 22.04(8.15.2)返回 postmaster... User unknown(别名未展开,Debian 提交链路特性,回显见「2.4」)。已知规避:判定别名生效与否以实际投递与 /var/log/mail.log 为准,-bv 仅用于非别名本地用户的可达性抽查。
问题 4:makemap 空输入静默重建空库。
现象与修复全记录见「5.2」——stdin 立即 EOF 时 makemap 不报错、直接以空数据覆盖 .db。已知规避:命令必须显式带 < 文本源;变更后立即 ls -l 核对 .db 时间戳与 newaliases 式回显核对。
问题 5:hoststat 无输出。
现象:8.18.2 环境执行 hoststat 零输出。已知规避:属正常现象(confHOST_STATUS_DIRECTORY 未定义即无主机状态缓存);确需主机状态功能时在 mc 中启用该参数并重生成 cf,再观察 hoststat 输出。
十一、参考链接
- 本系列认知篇:《Sendmail 8.18.2 介绍与选型指南》(版本谱系、许可证与 MTA 选型对比)
- 本系列安装篇:《Ubuntu 22.04 安装 Sendmail 8.15.2 指南》(apt 与源码编译双方案、ACCEPT_BROKEN_BDB_LOCKING 排障实录)
- 本系列部署篇:《Sendmail 8.18.2 Docker Compose 部署指南》(自建镜像与双节点编排,含 SIGPIPE 构建教训)
- 本系列配置篇:《Sendmail 8.15.2 配置参数详解》(m4 宏体系、FEATURE/MAILER/映射库与生效流程)
- sendmail(8)/mailq(8)/makemap(8)/mailstats(8) 手册页(本机路径):
/usr/share/man/man8/ - sysexits 退出码权威定义:BSD sysexits.h(
/usr/include/sysexits.h或 man 3 sysexits) - Sendmail 官方发布与 RELEASE_NOTES(查询日期 2026-10-27):
https://ftp.sendmail.org/