Courier MTA 1.0.16 常用 CLI 命令详解
Courier MTA 1.0.16 常用 CLI 命令详解:mailq 三列解读与 deferred 构造、courier flush/cancelmsg(完整 Queue ID 实测)、sendmail -bp 511 差异、makealiases/makeuserdb 四编译命令、userdb 虚拟用户三件套、maildirmake -f/deliverquota、testmxlookup 与 courier-config 构建参数实证。实测日期 2026-10-25。
Courier MTA 1.0.16 常用 CLI 命令详解
实测环境:Ubuntu 22.04 + courier-mta 1.0.16-3build3,实测日期 2026-10-25。示例域
quzuo-test.cn,示例账号admin/q1w2e3r4。以下命令与回显均逐行实测照抄。
一、命令地图
| 类别 | 命令 |
|---|---|
| 队列 | mailq、courier flush、cancelmsg |
| 服务控制 | courier start/stop/restart、esmtpd、esmtpd-msa、courierfilter、filterctl |
| 别名/路由数据库 | makealiases、makehosteddomains、makesmtpaccess、makeuserdb |
| 虚拟用户 | userdb、userdbpw |
| 邮箱与配额 | maildirmake、deliverquota |
| 诊断 | testmxlookup、courier-config、courier show |
| 兼容层 | sendmail(courier 版,语义有差异) |
二、队列:mailq / courier flush / cancelmsg
2.1 mailq 查队列
正常空队列:
$ mailq
Size Queue ID Date
User From
Status Recipient
---------------- ---------------------------------------------------------
0 messages.
构造一条滞留件(把 bademo.test 静态路由到不可达 IP [10.89.73.99],见配置篇 §8)再发信,mailq 立即可见:
$ mailq
Size Queue ID Date
User From
Status Recipient
---------------- ---------------------------------------------------------
380 000000000110000E.000000006ADD918F.00002150 Oct 25 05:20
courier root@mail.quzuo-test.cn
user@bademo.test
1 messages.
列含义:Size(字节)、Queue ID(三段式内部标识)、User(提交来源)、From/Recipient(信封)。
2.2 courier flush 立即重试
courier flush # 冲刷所有域,无输出即成功
courier flush bademo.test # 只冲刷指定域
2.3 cancelmsg 取消队列中的信(实测有讲究)
必须传 mailq 输出的完整三段 Queue ID,短格式和 -all 都实测失败:
$ cancelmsg 110000E.0.2150
Message not found.
$ cancelmsg -all
Message not found.
$ cancelmsg "000000000110000E.000000006ADD918F.00002150"
Message scheduled for cancellation.
看到 Message scheduled for cancellation. 才是真的安排上了。
2.4 sendmail -bp 的坑
习惯了 Postfix/Sendmail 的人会用 sendmail -bp 查队列,Courier 的兼容层不支持:
$ sendmail -bp
511 Headers specify no receipients.
sendmail: Unable to submit message.
它把 -bp 当成了一封没收件人的信。查队列就用 mailq。
三、服务控制
courier start | stop | restart # 队列核心 courierd
esmtpd start | stop # 25 端口(Debian 下也可 systemctl 管)
esmtpd-msa start | stop # 587 提交端口
courierfilter stop && courierfilter start # 过滤器框架
两个实测要点:
courier restart只重启 courierd,不影响 esmtpd/imapd——改了locals、defaultdomain这类被 esmtpd 缓存的配置,要esmtpd stop && esmtpd start(或systemctl restart courier-mta)。courierfilter restart不重启 perl 子进程,改 courier-filter-perl 配置必须 stop + start。
filterctl 管单个过滤器的启用(本质是操作 /etc/courier/filters/active/ 的符号链接):
$ filterctl
Usage: /usr/sbin/filterctl (start | stop) [ filter ]
只有 start/stop 两个子命令,没有 list。
四、别名与数据库类命令
Courier 的多数文本配置都要「编译」成 .dat 才生效:
| 命令 | 输入文件 | 何时跑 |
|---|---|---|
makealiases | /etc/courier/aliases/system | 改别名后 |
makehosteddomains | /etc/courier/hosteddomains | 改托管域后 |
makesmtpaccess | /etc/courier/smtpaccess/default | 改 IP 访问控制后 |
makeuserdb | /etc/courier/userdb | 改虚拟用户后 |
四个命令成功时均无输出(Unix 沉默即成功),忘记执行是「改了配置不生效」的最常见原因。
五、虚拟用户:userdb 三件套
默认认证后端是 authpam(authdaemonrc 里 authmodulelist="authpam")。要脱离系统账号做虚拟用户,改用 userdb:
# 建用户(uid/gid 指向真实系统属主)
userdb demo@quzuo-test.cn set uid=1001 gid=1001 home=/home/demo mail=/home/demo/Maildir
# 设密码(MD5-crypt,从管道读明文)
echo "q1w2e3r4" | userdbpw -md5 | userdb demo@quzuo-test.cn set systempw
# 编译数据库
makeuserdb
# 查看
userdb -show /etc/courier/userdb demo@quzuo-test.cn
以上四条在 1.0.16 上实测 rc=0。同时把 authmodulelist 改为 "authuserdb authpam" 让两种账号并存,重启 courier-authdaemon 生效。
六、邮箱与配额
6.1 maildirmake
su - admin -c "maildirmake ~/Maildir" # 建主 Maildir
su - admin -c "maildirmake -f Archive ~/Maildir" # 建 IMAP 可见的文件夹 Archive
-f 建出的文件夹实体是 ~/Maildir/.Archive/(IMAP 客户端里显示为 Archive)。重复建报 maildirmake: ... File exists,幂等脚本里忽略即可。
6.2 deliverquota
投递代理按配额投递的底层命令,日常运维主要用于查配额占用:
deliverquota -c /home/admin/Maildir # 无输出=未超配
七、诊断命令
7.1 testmxlookup
模拟 courieresmtp 的 MX 解析:
$ testmxlookup quzuo-test.cn
/var/lib/courier/sts/quzuo-test.cn: No such file or directory
quzuo-test.cn: hard error.
(实验域没有 MX 记录,故 hard error;第一行是 MTA-STS 缓存查找,无此文件属正常。)公网域会列出 MX 优先级与 IP,用来判断「信为什么往那儿发」。
7.2 courier-config
打印构建参数,排查「这个 deb 到底编译进了什么」:
$ courier-config --version
prefix=/usr
exec_prefix=/usr
...
mailuser=courier
mailgroup=courier
configure_args="... '--with-gnutls' ... '--enable-authlib' '--enable-userdb' ..."
实锤价值:configure_args 里有 --with-gnutls 但没有 libspf2 相关选项——这就是 bofh 的 BOFHSPF* 设置在 jammy deb 下不生效的编译层证据(详见配置篇 §4)。
7.3 courier show
courier show all / courier show <域> 查看 courierd 内部路由表快照;空输出表示当前无缓存路由。
八、sendmail 兼容层对照表
| 你想干的 | Postfix 习惯 | Courier 正确姿势 |
|---|---|---|
| 查队列 | sendmail -bp / mailq | mailq(-bp 会报 511) |
| 冲刷队列 | sendmail -q | courier flush |
| 重建别名 | newaliases | makealiases |
| 注入信件 | sendmail -t / 管道 | 相同(完全兼容) |
| 删队列单条 | postsuper -d | cancelmsg "<完整QueueID>" |
注入路径完全兼容,所以应用代码里的 sendmail -t 不用改;差异集中在队列管理。