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。

EmailRelayEmailRelaySMTP邮件中继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
dnsblDNSBL 状态操作
notify触发通知钩子
smtpSMTP 会话级操作
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 子目录分信,实现「一个守护、多队列收取」。

九、注意事项

  1. 三个二进制无子命令体系,全部走单字符/长选项;-q/-y/-d 是 --as-client/--as-proxy/--as-server 的短写。
  2. 所有超时参数单位均为秒,默认值:connection-timeout 40、idle-timeout 60、response-timeout 60、filter-timeout 60、prompt-timeout 20。
  3. 队列即文件系统:紧急清理可直接删 /var/spool/emailrelay/emailrelay.* 文件对(先停守护);不要只删 content 或 envelope 单边,会造成孤儿文件。
  4. --log-file 路径里的 %d 会被替换为日期,天然按日切分日志。
  5. 管理口 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 行)与防火墙。

十一、参考链接