EmailRelay 2.6.1 常用 CLI 命令详解
EmailRelay 2.6.1 常用 CLI 命令详解:emailrelay / emailrelay-passwd / emailrelay-submit 三工具与文本管理接口全命令精解,as-server/as-proxy/as-client 三形态、CRAM-MD5 凭据排障实录、队列直投、内置 POP 会话与队列积压恢复,全部命令回显来自实测。实测日期 2026-10-25。
EmailRelay 2.6.1 常用 CLI 命令详解
目标:讲透 EmailRelay 2.6.1 自带的三个命令行工具(emailrelay / emailrelay-passwd / emailrelay-submit)与文本管理接口的全部命令,所有示例均为 Ubuntu 22.04 + 2.6.1 实测回显,实测日期 2026-10-25。
一、环境信息
- 软件版本:EmailRelay 2.6.1(
/usr/local/sbin/下) - 操作系统:Ubuntu 22.04 LTS(x86_64)
- 演示账号:
admin/q1w2e3r4 - 演示拓扑:10025 转发代理 → 10026 存储守护,管理口 10027
二、工具概览
| 工具 | 一句话用途 |
|---|---|
emailrelay | 主守护进程:收信、存队列、转发、POP、管理口,全部功能都在这一个二进制 |
emailrelay-passwd | 生成 CRAM-MD5 认证摘要,写入凭据文件 |
emailrelay-submit | 不走 SMTP 会话,直接向队列投递一封邮件(脚本投信利器) |
管理接口(--admin 端口) | 裸 TCP 文本命令:查状态、触发转发、看失败、停服务 |
三、前置条件
已安装 2.6.1(见《EmailRelay 2.6.1 Ubuntu 22.04 安装指南》);本文演示目录 /var/spool/emailrelay、/var/spool/emailrelay-sink。
四、emailrelay 主命令
4.1 版本与帮助
$ emailrelay --version
E-MailRelay V2.6.1
Copyright (C) 2026 Graeme Walker
This product includes software developed by the OpenSSL Project
for use in the OpenSSL Toolkit (http://www.openssl.org/)
...
emailrelay --help 显示常用选项;emailrelay --verbose --help 输出全量选项(80+ 个,九组)与三条官方用法示例,是排障时确认「当前二进制支持哪些参数」的权威来源。
4.2 形态一:--as-server 存储守护
sudo emailrelay --as-server --port 10026 --spool-dir /var/spool/emailrelay-sink \
--log --log-time --log-file /var/log/emailrelay-sink.log \
--pid-file /run/emailrelay-sink.pid --user root
只收存不转发,收到的邮件以 emailrelay.<pid>.<seq>.1.content + .envelope 文件对落盘。适合作为演示用「上游接收池」,或弱网场景的纯存储端。
4.3 形态二:--as-proxy 存储转发
sudo emailrelay --as-proxy 127.0.0.1:10026 --port 10025 --spool-dir /var/spool/emailrelay \
--log --log-time --log-file /var/log/emailrelay.log \
--pid-file /run/emailrelay.pid --user root
swaks 实测(关键行):
<- 220 ubuntu-server -- E-MailRelay V2.6.1 -- Service ready
<- 250-VRFY
<- 250-PIPELINING
<- 250 8BITMIME
<- 250 message processed
日志(--log --log-time 下):
emailrelay: 20261025.053203.351: info: smtp connection from 127.0.0.1:42570
emailrelay: 20261025.053203.352: info: smtp connection to 127.0.0.1:10026
⚠️ 注意:以上 info 级日志需要
--verbose;且--as-proxy/--as-server隐含--close-stderr,无 syslog 的环境下建议展开为显式参数(见《EmailRelay 2.6.1 配置参数详解》§三)。
4.4 形态三:--as-client 一次性外发
$ sudo emailrelay --as-client 127.0.0.1:10026 --spool-dir /var/spool/emailrelay
emailrelay: info: smtp connection to 127.0.0.1:10026
...
$ echo $?
0
转空队列即退出(exit 0),不监听端口。典型用法是 cron 定时外发:
*/10 * * * * root /usr/local/sbin/emailrelay --as-client smtp.isp.net:25 --spool-dir /var/spool/emailrelay >> /var/log/emailrelay-cron.log 2>&1
4.5 队列积压与恢复(实测)
把 10026 上游停掉再发信:发送方仍收到 250 message processed(已安全落盘),日志出现:
emailrelay: warning: smtp client error: connect failure: cannot connect to 127.0.0.1:10026
emailrelay: error: forwarding: connect failure
上游恢复后,经管理口 forward 命令(回显 OK)触发补投,队列清空。这是存储转发区别于直通代理的核心行为:对发送方屏蔽下游故障。
五、emailrelay-passwd:认证摘要生成
从 stdin 读明文密码,stdout 输出 MD5 摘要(base64):
$ echo q1w2e3r4 | emailrelay-passwd
24B8rH5KOs8vhwihaFPfqBQGzb5xRdtUN+5NqapD1lM=
写入凭据文件 /usr/local/etc/emailrelay.auth:
server md5 admin 24B8rH5KOs8vhwihaFPfqBQGzb5xRdtUN+5NqapD1lM=
服务端启用:emailrelay ... --server-auth /usr/local/etc/emailrelay.auth。生效后 EHLO 广告 250-AUTH CRAM-MD5,swaks 认证实测:
$ swaks --server 127.0.0.1:10025 --from alice@example.org --to bob@example.com \
--auth CRAM-MD5 --auth-user admin --auth-password q1w2e3r4
...
<- 235 authentication successful
⚠️ 排障实录:凭据行第二字段写
plain会在启动时报错invalid authorisation secret: line 1: invalid xtext encoding of secret——SMTP AUTH 凭据必须用emailrelay-passwd生成的md5摘要;plain形态仅用于 POP 凭据文件(--pop-auth)。
向下游认证时凭据行首字段写 client,配合 --client-auth <file>。
六、emailrelay-submit:脚本直投队列
不走 SMTP 会话,直接把一封 RFC822 邮件文件写进 spool 队列,由守护进程择机外发:
用法:emailrelay-submit [-f from] [-s spool-dir] [-x file] [-v] to...
实测:
$ sudo emailrelay-submit --spool-dir /var/spool/emailrelay \
--from cron@localhost -v --input-file /root/cron.eml ops@example.net
/var/spool/emailrelay/emailrelay.10375.1792906643.1.content
$ echo $?
0
-v 打印落盘的 content 文件路径;退出码 0 即投递成功。典型场景:备份脚本、定时任务报告,无需在脚本里实现 SMTP 协议。
七、管理接口命令详解
启动时加 --admin 10027(需要停服能力再加 --admin-terminate),用 nc/telnet 裸连。
7.1 命令清单
$ printf 'help\nquit\n' | nc 127.0.0.1 10027
commands: dnsbl, failures, flush, forward, help, info, list, notify, pid, quit, smtp, status, terminate, unfail-all
7.2 status:运行状态
$ printf 'status\nquit\n' | nc 127.0.0.1 10027
LISTEN: 0.0.0.0:10025
LISTEN: ::.10025
LISTEN: 0.0.0.0:10027
LISTEN: ::.10027
OUT started: 1
OUT finished: 1
IN started: 3
IN finished: 2
IN: 127.0.0.1:10027 <- 127.0.0.1:54050
LISTEN 行是全部监听口;OUT started/finished 是外发计数;IN started/finished 是入站会话计数(差值=进行中连接);末尾行列出活动连接。
7.3 forward / flush / failures / unfail-all
forward:触发一次队列转发,回显OK——下游故障恢复后的标准补投动作;flush:转空队列;队列已空时实测回error: no messages to send;failures:列出处于失败态的邮件,无失败时回<none>;unfail-all:把失败态邮件重置为可重试。
7.4 其余命令
| 命令 | 用途 |
|---|---|
list | 列出队列邮件 |
info | `usage: info {copyright |
pid | 打印守护进程 PID |
dnsbl | DNSBL 状态操作 |
notify | 触发通知钩子 |
smtp | SMTP 会话级操作 |
terminate | 停守护(需 --admin-terminate 才可用) |
quit | 断开管理会话 |
⚠️ 管理口无认证,生产必须绑回环或受信网段(
--interface admin=127.0.0.1)。
八、POP 服务会话(附)
--pop --pop-port 10110 --pop-auth <file> 启用内置 POP3,凭据文件可用 plain 明文。nc 实测:
+OK POP3 server ready
USER admin
+OK
PASS q1w2e3r4
+OK
STAT
+OK 7 2679
LIST 1
+OK 1 465
--pop-by-name 可按用户名从 spool 子目录分信,实现「一个守护、多队列收取」。
九、注意事项
- 三个二进制无子命令体系,全部走单字符/长选项;
-q/-y/-d是--as-client/--as-proxy/--as-server的短写。 - 所有超时参数单位均为秒,默认值:connection-timeout 40、idle-timeout 60、response-timeout 60、filter-timeout 60、prompt-timeout 20。
- 队列即文件系统:紧急清理可直接删
/var/spool/emailrelay/emailrelay.*文件对(先停守护);不要只删 content 或 envelope 单边,会造成孤儿文件。 --log-file路径里的%d会被替换为日期,天然按日切分日志。- 管理口
forward/flush都是异步触发,回显OK不代表已投递成功,以status的 OUT 计数与队列目录为准。
十、常见问题
Q1:emailrelay-passwd 从命令行参数传密码可以吗?
不可以,它只从 stdin 读。脚本里用 echo '密码' | emailrelay-passwd,注意历史记录泄露风险,生产用 read -s 采集。
Q2:emailrelay-submit 投的信不发出?
submit 只负责落盘;外发靠 as-proxy 的触发、as-client 定时跑或管理口 forward。检查守护是否在跑、队列目录是否与 submit 的 --spool-dir 一致。
Q3:管理口 flush 报 error: no messages to send?
队列本来就是空的,属正常回显,不是故障。
Q4:nc 连管理口没有回显?
管理口是行协议,输入命令后回车才有响应;确认 --admin 端口监听(status 里的 LISTEN 行)与防火墙。