EmailRelay 2.6.1 介绍与选型指南
EmailRelay 2.6.1 介绍与选型指南:C++ GPLv3 单进程 SMTP 存储转发中继,as-server/as-proxy/as-client 三形态、文件队列、filter 钩子与内置 POP,实查无原生 DKIM/DMARC、Ubuntu/Debian 无包、官方无镜像,与 Postfix/Courier/OpenSMTPD/msmtp/nullmailer 量化对比。查询日期 2026-10-25。
EmailRelay 2.6.1 介绍与选型指南
目标:说清 EmailRelay 是什么、解决什么问题、与常见邮件组件如何取舍。本文信息实查自官方站点与 SourceForge 项目页,查询日期 2026-10-25。
一、环境信息
- 查询日期:2026-10-25
- 版本口径:上游最新稳定版 2.6.1(2026-02-02 发布)
- 官方站点:https://emailrelay.sourceforge.net/
- 项目主页:https://sourceforge.net/projects/emailrelay/
二、软件概述
EmailRelay(常写作 E-MailRelay)是 Graeme Walker 用 C++ 编写、以 GPLv3 发布的轻量级 SMTP 存储转发中继(store-and-forward relay)。它不是一个功能完整的邮件服务器(没有 IMAP 邮箱、没有 Web 界面、没有虚拟用户体系),而是一个专注于「收下邮件、存进队列、择机转发」的单一守护进程:
- 收下:以 SMTP 服务端身份监听端口,接受本机或远程客户端提交的邮件;
- 存进队列:把每封信以「content + envelope」文件对的形式落盘到 spool 目录,SMTP 会话一结束就确认收讫,发送方无需等待下游;
- 择机转发:按配置立即转发、定时轮询转发,或由外部事件(cron、管理接口命令)触发,把队列里的邮件转给下一跳 SMTP 服务器。
这种「先把邮件安全落盘,再异步送达」的模型,让 EmailRelay 在网络不可靠、下游不稳定、需要削峰解耦的场景里特别好用:发送方把邮件交给本机的 EmailRelay 就能立即返回,真正的投递由 EmailRelay 在后台重试完成。
EmailRelay 同时提供 Windows 版本(emailrelay-2.6.1-w64.zip),Linux/Unix 侧以源码包 emailrelay-2.6.1-src.tar.gz 交付(1.6MB,SHA256 a0bcd88179a6545817b670b1ed6d6aac7c4dae90fabd220ef08d3f6743b69e9c)。
三、核心架构
EmailRelay 的架构是「一个二进制、三种运行形态」,由 --as-server / --as-proxy / --as-client 三个宏选项切换:
| 形态 | 等价展开(来自 --verbose --help) | 用途 |
|---|---|---|
--as-server | --log --close-stderr | 存储守护:收下邮件只存队列,不主动外发,等外部触发 |
--as-proxy <host:port> | --log --close-stderr --forward-on-disconnect --forward-to | 存储转发代理:边收边转,下游失败则留队列重试 |
--as-client <host:port> | --log --no-syslog --no-daemon --dont-serve --forward --forward-to | 一次性转发器:转空队列即退出,适合 cron 周期触发 |
架构要点:
- 文件队列即存储:spool 目录下
emailrelay.<pid>.<seq>.1.content存邮件正文,同名.envelope存收发件人等信封信息(X-MailRelay-From/To等头部字段),转发中的信封临时改名.envelope.busy,成功即删。没有数据库、没有索引,队列状态就是文件系统状态。 - 过滤器钩子:
--filter <program>在收信落盘时调用外部程序(退出码 1–99 拒收),--client-filter在转发时调用;内置spam:/spam-edit:前缀可直接对接 SpamAssassin 的 spamd。 - 管理接口:
--admin <port>开一个纯文本 TCP 管理口,用status/forward/flush/failures等命令查看状态、触发转发。 - TLS 与认证:编译时链接 OpenSSL 后支持 STARTTLS 与 SMTPS,支持服务端/客户端双向证书校验;SMTP AUTH 以 CRAM-MD5 为主,凭据文件由自带的
emailrelay-passwd生成摘要。
四、功能特性
- 存储转发 SMTP 中继:收信即落盘,转发失败自动积压、恢复后可手动或自动重发;
- 三种运行形态覆盖「常驻存储 / 实时转发 / 定时批量外发」三类拓扑;
- 内置 POP3 服务端(
--pop),可把队列里的邮件以 POP3 方式提供给 MUA 收取,支持按用户名分目录(--pop-by-name); - 外部过滤器钩子 + SpamAssassin 对接,用于内容扫描与拒收;
- STARTTLS / SMTPS、客户端证书校验、CRAM-MD5 认证;
- DNSBL 黑名单(
--dnsbl)、地址校验钩子(--address-verifier)、限速与尺寸限制(--size); - 附带
emailrelay-submit(命令行直接向队列投信)与emailrelay-passwd(生成认证摘要)两个辅助工具; - 单进程、无第三方服务依赖,编译产物仅三个二进制 + 一份配置样例。
五、快速开始(最小可用示例)
以「本机 10025 端口收信、实时转发到上游 10026」的代理形态为例(完整安装步骤见《EmailRelay 2.6.1 Ubuntu 22.04 安装指南》):
# 终端 1:起存储守护,模拟上游(仅演示拓扑,生产换成真实下游 MTA)
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
# 终端 2:起转发代理,监听 10025
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
用任意 SMTP 客户端向 10025 发信,会立即收到 250 message processed,邮件随即被转发到 10026 并落盘。若把上游 10026 停掉再发信,发送方依然收到 250,邮件留在队列;上游恢复后经管理接口 forward 命令触发即可补投——这正是存储转发的价值所在。
六、适用场景与限制
适合:
- 应用服务器/脚本的本机 SMTP 出口:应用只认
localhost:25发信,由 EmailRelay 负责 TLS、认证与重试,替应用挡住下游抖动; - 离线/弱网环境的邮件网关:间歇联网场景下先收后转,联网窗口用 cron 触发
--as-client批量外发; - 自动化与告警链路:
emailrelay-submit让 shell 脚本不依赖 SMTP 客户端库即可投信; - SMTP 协议适配与预处理:在真实 MTA 前加一层做过滤、限速、DNSBL。
限制(实查官方文档确认):
- 无原生 DKIM/DMARC/SPF:官方文档没有 DKIM/DMARC 章节,SPF 也只能经
--filter钩子外挂脚本实现;要求完整反垃圾签名体系时需前置其他网关; - 无 IMAP/邮箱体系:只有面向队列的 POP3 取信口,不能当邮箱服务器用;
- 认证机制有限:服务端 AUTH 实测仅 CRAM-MD5(secrets 文件字段必须写
md5,写plain会报invalid authorisation secret),不支持 PLAIN/LOGIN 裸口令直存; - 分发渠道窄:Ubuntu 22.04 / Debian 官方仓库均无 emailrelay 包(已从 Debian 移除),官方也不发布容器镜像,生产部署以源码编译或自建镜像为主;
- 社区规模小:SourceForge 单作者项目,更新频率低(2.x 系列以年为单位的维护性发版),胜在代码成熟稳定。
七、同类选型对比
查询日期 2026-10-25。「中继」定位与完整 MTA 不直接同级,下表按「能否承担存储转发出口」这一能力对齐比较。
| 维度 | EmailRelay | Postfix | Courier MTA | OpenSMTPD | msmtp | nullmailer |
|---|---|---|---|---|---|---|
| 定位 | 存储转发中继 | 完整 MTA 事实标准 | 一体化邮件套件 | 安全极简 MTA | 纯 SMTP 客户端 | 最小中继(仅外发) |
| 最新版本 | 2.6.1(2026-02) | 3.11.x | 上游 2.0.x 月度发版 | 7.x | 1.8.x | 2.2 |
| 语言 | C++ | C | C/C++ | C | C | C++ |
| 许可 | GPLv3 | IPL | GPLv3 | ISC | GPLv3 | GPLv2 |
| 收信监听 | 是 | 是 | 是 | 是 | 否 | 是(仅本机队列外发) |
| 队列存储 | 文件对(content+envelope) | 自有队列 | 自有队列 + Maildir | 自有队列 | 无队列 | 文件队列 |
| 过滤器钩子 | 外部程序 + spamd | milter/前置 | courierfilter | filter 语法 | 无 | 无 |
| TLS/认证 | STARTTLS/SMTPS、CRAM-MD5 | 全面 | 全面 | 全面 | 客户端侧全面 | 基础 |
| DKIM/DMARC | 无原生 | 外挂 opendkim | 无原生 | 外挂 | 不适用 | 无 |
| Ubuntu 22.04 仓库 | 无包,需源码编译 | 3.6.4 | 1.0.16-3build3 | 6.8.0p2 | 1.8.16 | 2.2-3 |
| 典型用法 | 弱网网关/本机出口/预处理层 | 生产 MTA | 小团队全家桶 | 轻量 MTA | 脚本发信 | 无人值守外发 |
一句话选型:要完整邮件系统选 Postfix/Courier,要脚本发信选 msmtp,要「收得下、存得住、择机发」的缓冲层选 EmailRelay。三者也可以叠加——EmailRelay 常作为 Postfix/Exchange 前端或本机出口存在。
八、参考链接
- 官方文档站(User Guide 全文):https://emailrelay.sourceforge.net/
- SourceForge 项目与下载页:https://sourceforge.net/projects/emailrelay/files/
- 源码包 2.6.1:https://downloads.sourceforge.net/project/emailrelay/emailrelay/2.6.1/emailrelay-2.6.1-src.tar.gz
- 本专栏部署与配置:《EmailRelay 2.6.1 Ubuntu 22.04 安装指南》《EmailRelay 2.6.1 Docker Compose 部署指南》《EmailRelay 2.6.1 配置参数详解》《EmailRelay 2.6.1 常用 CLI 命令详解》