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 MTACourier MTA邮件服务器Linux2026/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 / mailqmailq(-bp 会报 511)
冲刷队列sendmail -qcourier flush
重建别名newaliasesmakealiases
注入信件sendmail -t / 管道相同(完全兼容)
删队列单条postsuper -dcancelmsg "<完整QueueID>"

注入路径完全兼容,所以应用代码里的 sendmail -t 不用改;差异集中在队列管理。

九、参考来源