EmailRelay 2.6.1 配置参数详解

EmailRelay 2.6.1 配置参数详解:--verbose --help 全量九组参数逐组精解(含 as-server/as-proxy/as-client 宏展开式、超时/端口真实默认值)、CRAM-MD5 凭据排障实录、TLS 自签实测、本机出口/弱网网关/前置过滤三套生产配置模板。实测日期 2026-10-25。

EmailRelayEmailRelaySMTP邮件中继2026/10/25

EmailRelay 2.6.1 配置参数详解

目标:系统讲清 EmailRelay 2.6.1 全部配置参数的分组、默认值、用法与实测行为,给出三套生产配置模板。参数清单来自 emailrelay --verbose --help 全量输出与 /usr/local/etc/emailrelay.conf 668 行官方样例,实测环境 Ubuntu 22.04,实测日期 2026-10-25。

一、环境信息

  • 软件版本:EmailRelay 2.6.1(源码编译安装,/usr/local 前缀)
  • 操作系统:Ubuntu 22.04 LTS(x86_64)
  • 配置样例:/usr/local/etc/emailrelay.conf(668 行,全注释形态)
  • 演示账号:admin / q1w2e3r4

二、前置条件

已按《EmailRelay 2.6.1 Ubuntu 22.04 安装指南》完成编译安装,emailrelay --version 输出 E-MailRelay V2.6.1。

三、参数查看与修改方式

查看:emailrelay --verbose --help 输出全量 80+ 选项(232 行),按 Basic / SMTP client / SMTP server / POP / Admin / Authentication / TLS / Process / Logging 九组排列;--help 不带 --verbose 时只显示常用子集。

修改:三种等价方式,优先级从高到低——

  1. 命令行:emailrelay --port 10025 --as-proxy 127.0.0.1:10026;
  2. 配置文件:每个长选项去掉前导 -- 即配置键,如 port=10025、forward-to=127.0.0.1:10026、无值开关写成裸行 remote-clients;
  3. 宏选项:--as-server / --as-proxy / --as-client 是官方预置的参数组合(展开式见下表)。

加载顺序:先读位置参数指定的配置文件(emailrelay /usr/local/etc/emailrelay.conf),再应用命令行,命令行覆盖配置文件。

四、参数总览(九组)

组代表参数管什么
Basicas-server / as-proxy / as-client / spool-dir运行形态与队列目录
SMTP clientforward-to / forward / forward-on-disconnect / poll / connection-timeout / client-filter往外转发的一切
SMTP serverport / remote-clients / interface / filter / dnsbl / size / domain收信监听的一切
POPpop / pop-port / pop-by-name / pop-no-delete / pop-auth内置 POP3 取信口
Adminadmin / admin-terminate文本管理口
Authenticationserver-auth / client-auth / pop-auth + *-configSMTP AUTH 与凭据文件
TLSserver-tls / client-tls + 证书/校验族STARTTLS 与 SMTPS
Processuser / no-daemon / pid-file / dont-serve / no-smtp进程行为
Logginglog / verbose / log-file / log-time / no-syslog / close-stderr / syslog日志去向与粒度

三个宏选项的精确展开(--verbose --help 原文):

宏等价于
--as-server--log --close-stderr
--as-proxy <h:p>--log --close-stderr --forward-on-disconnect --forward-to
--as-client <h:p>--log --no-syslog --no-daemon --dont-serve --forward --forward-to

⚠️ 注意 --close-stderr:as-server 与 as-proxy 都会「启动后不久关闭 stderr」。若环境里没有可用 syslog(最小化系统常见),之后的日志会凭空消失——表现为日志文件只剩启动头几行。解法:把宏展开为显式参数、去掉 --close-stderr 并按需加 --no-syslog 或 --log-file。

五、核心参数分类详解

5.1 Basic:运行形态与队列

  • --as-server:存储守护,只收存不主动发。
  • --as-proxy <host:port>:存储转发,收信后(客户端断开时)立即尝试转发到指定下游,失败留队列。
  • --as-client <host:port>:一次性客户端,启动即把队列全部转往指定下游,转空即退出,不监听端口——配合 cron 做定时外发。
  • -s, --spool-dir=<dir>:队列目录,默认随安装(通常 /var/spool/emailrelay)。队列文件为 emailrelay.<pid>.<seq>.1.content + 同名 .envelope 文件对;转发中信封临时改名 .envelope.busy,成功即删。

5.2 SMTP client:转发行为

参数默认说明
-o, --forward-to=<host:port>—下游 SMTP 地址,--forward/--forward-on-disconnect/--immediate 的前置依赖
-f, --forward关启动时立即转发存量队列
-1, --forward-on-disconnect关每个 SMTP 客户端断开后触发一次转发(as-proxy 的核心)
-O, --poll=<period>关按周期轮询队列并转发,如 --poll 60
-m, --immediate关收信过程中即转发(先转后回执),延迟最低但失败语义不同
-U, --connection-timeout=<s>40连下游超时
-T, --response-timeout=<s>60等下游响应超时
--idle-timeout=<s>60连接空闲超时
-Y, --client-filter=<program>—转发时经外部程序处理邮件
-6, --client-interface=<ip>—指定出站连接的本机地址(多网卡选路)
--forward-to-all / --forward-to-someall多收件人时要求全部被下游接受 / 允许部分接受

5.3 SMTP server:收信监听

参数默认说明
-p, --port=<port>25SMTP 监听端口
-r, --remote-clients关允许远程客户端连接;不加则只接受本机回环,做网关必加
-I, --interface=<ip列表>全部绑定监听地址,逗号分隔,可带 smtp=/pop=/admin= 限定
-z, --filter=<program>—收信落盘时调外部过滤程序,退出码 1–99 拒收(SMTP 回 452 rejected);支持 net:<addr> 网络过滤器与 spam:<addr>/spam-edit:<addr> 直连 SpamAssassin spamd
-W, --filter-timeout=<s>60过滤器超时
-D, --domain=<fqdn>本机覆盖 SMTP 横幅里的主机名
-M, --size=<bytes>不限单封邮件大小上限
-w, --prompt-timeout=<s>20等客户端初始响应超时
-A, --anonymous[=<scope>]关禁 VRFY、精简 SMTP 应答
--dnsbl=<config>—DNSBL 黑名单拦截客户端地址
--address-verifier=<program>—外部地址校验程序
-s, --delivery-dir=<dir>—本地投递目录(与 spool 分工的另一形态)

5.4 POP 服务(内置取信口)

  • -B, --pop:启用 POP3 服务,把队列邮件提供给 MUA 收取;
  • -E, --pop-port=<port>:默认 110;
  • -J, --pop-by-name:按 POP 用户名从 spool 子目录取信,实现多用户分队列;
  • -G, --pop-no-delete:收取后不删队列副本;
  • -F, --pop-auth=<file>:POP 凭据文件(格式同 server-auth,可用 plain 明文)。

实测会话(10110 端口):连接回 +OK POP3 server ready,USER/PASS 认证 OK,STAT 回 +OK 7 2679(7 封 2679 字节),LIST 1 回 +OK 1 465。

5.5 Admin 管理口

  • -a, --admin=<port>:开启文本管理口(裸 TCP,nc/telnet 直连);
  • -Q, --admin-terminate:允许管理口 terminate 命令停守护(默认禁用)。

命令清单(help 实测回显):dnsbl, failures, flush, forward, help, info, list, notify, pid, quit, smtp, status, terminate, unfail-all。常用:status 看监听与收发计数,forward 触发队列转发,failures 看失败记录,flush 转空队列。详见《EmailRelay 2.6.1 常用 CLI 命令详解》。

⚠️ 管理口没有任何认证,只能绑回环地址或受信管理网段:--interface admin=127.0.0.1,或防火墙限制来源。

5.6 Authentication:SMTP AUTH

  • -S, --server-auth=<file>:作为服务端校验客户端 AUTH;
  • -C, --client-auth=<file>:作为客户端向下游出示凭据;
  • --server-auth-config / --client-auth-config:微调认证模块。

凭据文件每行四字段:<server|client> <机制> <用户名> <密钥>。生成 CRAM-MD5 摘要:

$ echo q1w2e3r4 | emailrelay-passwd
24B8rH5KOs8vhwihaFPfqBQGzb5xRdtUN+5NqapD1lM=

写入 /usr/local/etc/emailrelay.auth:

server md5 admin 24B8rH5KOs8vhwihaFPfqBQGzb5xRdtUN+5NqapD1lM=

⚠️ 排障实录:字段 2 必须写 md5。写 plain 会在启动时报 invalid authorisation secret: line 1: invalid xtext encoding of secret——plain 形态只用于 POP 凭据文件。生效后 EHLO 广告 250-AUTH CRAM-MD5,swaks 认证成功回 235 authentication successful。下行(向下游)认证把首字段写 client。

5.7 TLS

服务端:

参数说明
-K, --server-tls开 STARTTLS(需配合证书)
--server-tls-certificate=<pem>私钥+证书合并的 PEM 文件
--server-tls-connection隐式 TLS(SMTPS 形态)
--server-tls-required认证/投递前必须已 TLS
--server-tls-verify=<ca>校验客户端证书

客户端(向下游):-j, --client-tls(STARTTLS)、-b, --client-tls-connection(SMTPS)、--client-tls-required、--client-tls-verify=<ca>、--client-tls-server-name=<hostname>(SNI)、--client-tls-verify-name=<cname>。底层用 -9, --tls-config=tlsv1.2 这类选项约束协议版本。

自签演示(实测 TLSv1.3 握手成功):

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=ubuntu-server"
cat key.pem cert.pem | sudo tee /usr/local/etc/ssl/emailrelay/emailrelay.pem >/dev/null

启动加 --server-tls --server-tls-certificate /usr/local/etc/ssl/emailrelay/emailrelay.pem,验证:

$ openssl s_client -connect 127.0.0.1:10025 -starttls smtp
...
subject=CN = ubuntu-server
...
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384

5.8 Process 与 Logging

  • -u, --user=<username>:以 root 启动后切换的运行身份,默认 daemon;
  • -t, --no-daemon:前台运行(调试与 systemd/前台托管场景用);
  • -i, --pid-file=<path>:PID 文件;
  • -x, --dont-serve:不监听任何服务口(as-client 含);
  • -X, --no-smtp:只关 SMTP 监听(留 admin/pop 口)。

Logging 组:-l, --log(stderr+syslog 双写)、-n, --no-syslog、-N, --log-file=<file>(%d 按日切分,如 /var/log/emailrelay-%d.log)、-L, --log-time、-v, --verbose(info 级收发记录)、-g, --debug(需编译进 debug)、-k, --syslog[=<facility>]、--log-address(日志附带客户端地址)、-e, --close-stderr。

六、生产配置模板

6.1 本机应用出口(最常用)

场景:应用服务器把邮件交给本机中继,统一 TLS+认证走向公网网关。8GB 内存、普通云盘即可(EmailRelay 资源占用极小)。

# /usr/local/etc/emailrelay.conf —— as-proxy 展开形态,保留 stderr 日志
port=25
spool-dir=/var/spool/emailrelay
forward-to=smtp-relay.example.com:25
forward-on-disconnect
client-tls
client-tls-required
client-tls-verify=/etc/ssl/certs
client-auth=/usr/local/etc/emailrelay.auth
admin=10027
interface=admin=127.0.0.1
user=daemon
log
log-time
verbose
no-syslog
log-file=/var/log/emailrelay-%d.log

6.2 弱网网关(存储 + 定时外发)

场景:站点间歇联网,平时收存,cron 每 10 分钟批量外发。磁盘按积压量预估(每封信 content+envelope 约 1KB 起)。

# 常驻存储守护
port=25
remote-clients
spool-dir=/var/spool/emailrelay
user=daemon
log
log-time
log-file=/var/log/emailrelay-%d.log
# /etc/cron.d/emailrelay —— 每 10 分钟尝试外发
*/10 * * * * root /usr/local/sbin/emailrelay --as-client smtp.isp.net:25 --spool-dir /var/spool/emailrelay >> /var/log/emailrelay-cron.log 2>&1

6.3 MTA 前置过滤层

场景:在 Postfix/Exchange 前做 DNSBL 与脚本过滤。16GB 内存、NVMe、日百万级收件量场景建议把 spool 放独立盘。

port=25
remote-clients
spool-dir=/var/spool/emailrelay
forward-to=127.0.0.1:10026
forward-on-disconnect
dnsbl=zen.spamhaus.org:127.0.0.2,127.0.0.3:554
filter=/usr/local/sbin/emailrelay-filter-demo
filter-timeout=60
size=26214400
user=daemon
log
log-time
verbose
log-file=/var/log/emailrelay-%d.log

七、常见问题

Q1:配置文件和命令行能混用吗? 能。位置参数给配置文件,命令行随后覆盖同名键。推荐「配置文件存基线、命令行做覆盖」。

Q2:改了配置不生效? EmailRelay 无热加载,改后必须重启进程。管理口 terminate(需 --admin-terminate)或 systemctl restart。

Q3:队列里信越来越多不转发? 检查下游连通(日志里 warning: smtp client error: connect failure);恢复后管理口 forward 或等下次触发。failures 命令可查失败记录,unfail-all 重置失败态。

Q4:怎么确认某选项是否编译进当前二进制? emailrelay --verbose --help 列出的就是当前二进制支持的全集;TLS 相关选项缺失说明编译期没装 libssl-dev,需重新编译。

Q5:DKIM/SPF/DMARC 怎么配? 2.6.1 无原生支持。可行路径是 --filter 外挂脚本(如调 opendkim 的验证接口或自写 SPF 查询),签名类需求建议前置专职网关。

八、参考链接