wildduck 介绍与选型指南
WildDuck 开源 Node.js 邮件服务器的选型入门篇:系统介绍其 No-SPOF 架构、核心功能、适用场景与 Dovecot/Stalwart/Mailu 等同类产品的多角度量化对比,帮助读者判断是否适合在生产环境部署。
wildduck 介绍与选型指南
目标:本文档为 WildDuck 邮件服务器的选型入门篇,系统介绍其架构、功能、适用场景与同类产品对比,帮助读者判断是否适合在生产环境部署。信息来源为官方文档 wildduck.email 与 GitHub 仓库(查询日期 2026-10-27),部分数据参考社区邮件服务器选型报告。
一、环境信息
- WildDuck 版本:1.46.1(GitHub 最新稳定版,查询日期 2026-10-27)
- Node.js 要求:≥ 22.19.0
- 后端数据库:MongoDB(分片+复制集群)、Redis(PubSub/缓存/限流)
- 可选依赖:OpenSearch(全文索引实验性)、S3 兼容对象存储(附件分离)、Redis Sentinel(自动故障转移)
- 开源许可:EUPL-1.2(欧洲联盟公共许可证,类 GPL 强 copyleft)
- 技术栈:纯 JavaScript / Node.js 运行时,无编译步骤
- 社区规模:GitHub 约 2106 stars(查询日期 2026-10-27),活跃维护
二、软件概述
WildDuck 是一款现代化、无单点故障(No-SPOF)的 IMAP/POP3 邮件服务器,由 ZoneMTA(外发 SMTP)和 Haraka/Kirin(入站 SMTP)配合可形成完整邮件解决方案。其核心设计理念是「模仿 Gmail 的产品体验」——在分布式后端上提供集中式认证、REST API、Web 管理台与现代安全特性的组合。
与传统 IMAP 服务器(Dovecot/Courier)将邮件存放在文件系统上、用户必须始终连接到同一台节点不同,WildDuck 将所有状态(包括邮件正文、附件元数据、认证状态)存入 MongoDB,使任意 IMAP 节点都能为任意用户服务,天然支持横向扩展和高可用部署。
💡 技术拓展:邮件服务器三大流派对比—— 传统 MTA(Sendmail/Postfix/Exim):单一进程完成 SMTP 收发与本地投递,邮件存文件系统,架构简单但扩展需分角色拆分。 传统 MDA(Dovecot/Courier):SMTP 由 MTA 完成,MDA 负责 IMAP/POP3 访问本地邮件箱,用户被「粘性绑定」到固定节点,高可用需前端代理层。 新一代 No-SPOF 架构(WildDuck/Stalwart):邮件与状态全存分布式后端,IMAP/POP3/API 节点无状态可水平扩展,是云原生时代邮件服务的演进方向。
三、核心架构
WildDuck 自身仅实现 IMAP、POP3、HTTP API 和 CalDAV/CardDAV 协议栈;完整邮件栈需搭配 ZoneMTA(出站 SMTP)和 Haraka 或 Kirin(入站 SMTP),共同构成 Zone Mail Suite。
┌─────────────────────────────────────────────────────────────────┐
│ WildDuck 邮件栈拓扑 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ IMAP │ │ POP3 │ │ HTTP API │ ← 用户接入层 │
│ │ Server │ │ Server │ │ +WebAdmin│ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ └──────────────┼──────────────┘ │
│ │ │
│ ┌───────▼────────┐ │
│ │ WildDuck │ │
│ │ 认证/会话层 │ │
│ └───┬────────┬──┘ │
│ │ │ │
│ ┌───────▼──┐ ┌──▼──────┐ │
│ │ MongoDB │ │ Redis │ ← 分布式状态后端 │
│ │(分片集群) │ │ PubSub │ │
│ └──────────┘ └─────────┘ │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ ZoneMTA │ │ Haraka │ │ Kirin │ ← 可选 SMTP 组件 │
│ │ (出站) │ │ (入站v1) │ │ (入站v2) │ │
│ └──────────┘ └──────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────┘
关键设计决策:
- 无状态 IMAP 节点:所有会话状态(UID 映射、FLAGS、已读标记)存入 MongoDB,节点宕机不丢失会话,用户自动被路由到其他节点
- 附件去重存储:相同 SHA-256 哈希的附件只存一份,配合 MongoDB 压缩,整体存储占用减少约 40–56%
- 集中式认证中心:支持 TOTP 二次验证、WebAuthn/FIDO2、应用专用密码(ASP)、认证范围限定(scope=master/imap/smtp/pop3)
- 双栈 HTTP API:既支持标准 IMAP/POP3 客户端接入,也提供完整 REST API 返回已解析的邮件结构(无需自行解析 RFC822)
四、功能特性
4.1 核心协议支持
| 协议 | 端口(默认) | 特性 |
|---|---|---|
| IMAP | 993(隐式 TLS)/ 143(STARTTLS) | 多邮箱、线程化展示、COMPRESS=DEFLATE 压缩、IDLE 推送 |
| POP3 | 995(隐式 TLS)/ 110(STARTTLS) | 兼容传统客户端 |
| CalDAV | 8443 / 443 | 日历同步 |
| CardDAV | 8443 / 443 | 通讯录同步 |
| HTTP API | 8080(可配 HTTPS) | 邮件/用户/域/DKIM/过滤器/自动回复全量管理 |
| WebSubmission | 587 | 通过 API 发信(无需 SMTP 客户端) |
4.2 安全特性
- TOTP 二次验证:可选的基于时间的动态口令,密钥可加密存储
- WebAuthn/FIDO2:硬件密钥或平台认证器,现代强认证
- 应用专用密码(ASP):按 scope 生成一次性密码,可随时吊销,便于管理第三方客户端
- Pwned Passwords 检查:集成 HaveIBeenPwned,检测泄露密码
- GPG 邮件加密:可选自动加密所有存储邮件
- BIMI 支持:品牌消息识别指示器
- 审计日志:用户可查自己的认证尝试与账户变更记录
4.3 管理与运维
- REST API 全覆盖:包括用户管理、域管理、DKIM 密钥生成/轮替、邮件过滤器、自动回复、配额、标签等
- Webhooks:实时事件通知(新消息、认证成功/失败等),HTTP 回调
- Web 管理台:WildDuck Admin(管理端)+ WildDuck Webmail(用户端)
- HTTPS/IMAPS/POP3S 自动证书:通过 ACME 协议(Let's Encrypt)自动申请与续期
- Settings API:部分配置(如 webhook 开关、日志级别)可运行时修改无需重启
4.4 可观测性
- 结构化日志(silly/verbose/info/warn/error 多级)
- GELF 日志输出(Graylog 对接)
- Web 控制台实时事件推送(HTTP Event Source / SSE)
五、快速开始(最小可用示例)
以下是在 Ubuntu 22.04 上通过 Docker Compose 启动 WildDuck 完整栈的最小配置(命令节选,完整方案见 《wildduck Docker Compose 部署指南》)。
# 拉取官方镜像
docker pull ghcr.io/zone-eu/wildduck:latest
docker pull mongo:7
docker pull redis:7
# 启动最小依赖(MongoDB + Redis),WildDuck 单独容器
docker run -d --name mongo -p 27017:27017 mongo:7
docker run -d --name redis -p 6379:6379 redis:7
# 启动 WildDuck,使用 APPCONF_ 环境变量覆盖默认配置
docker run -d \
-e APPCONF_dbs_mongo="mongodb://host.docker.internal:27017/wildduck" \
-e APPCONF_dbs_redis="redis://host.docker.internal:6379/3" \
-e APPCONF_imap_setup_hostname="mail.example.com" \
-p 993:993 -p 995:995 -p 8080:8080 \
--name wildduck \
ghcr.io/zone-eu/wildduck:latest
启动后通过 POST /users API 创建第一个用户,即可用 IMAP 客户端连接。
六、适用场景与限制
6.1 适用场景
- 自托管邮件服务:个人或小团队自建邮箱,追求现代化体验(2FA、REST API、Web 管理)
- 开发者私有邮件栈:通过 REST API 集成到自研 Web 应用,实现用户注册自动开户、邮件发送功能
- 多云/混合云邮件集群:MongoDB 分片集群已覆盖全球多区域,WildDuck 可横向扩缩容
- 合规与数据主权敏感场景:EUPL-1.2 许可、全自研代码、数据全在自托管集群
6.2 不适用场景与限制
- 极简运维偏好:WildDuck 需同时运维 MongoDB + Redis + 可选 SMTP 组件,单进程方案(如 Stalwart)更轻量
- 高并发大规模集群:社区验证场景为百万级邮箱;千万级需自行扩容 MongoDB 分片并压测
- 老旧邮件客户端兼容:严格遵循现代协议,某些 2005 年前的老客户端可能无法正常工作
- EUPL-1.2 许可顾虑:修改后再分发需公开源码,对闭源二次开发有限制
七、同类选型对比
7.1 邮件服务器分类矩阵
| 产品 | 定位 | 架构 | 许可证 | 无单点故障 | REST API | 2FA | 社区活跃度 |
|---|---|---|---|---|---|---|---|
| WildDuck | No-SPOF 云原生 | Node.js + MongoDB + Redis | EUPL-1.2 | ✅ 天生支持 | ✅ 完整 | ✅ TOTP + WebAuthn | 2106 stars,活跃 |
| Stalwart Mail | No-SPOF 一体化 | Rust 单进程 + PostgreSQL/FoundationDB | AGPL-3.0 | ✅ 天生支持 | ✅ 完整 | ✅ TOTP + WebAuthn | 4300+ stars,活跃 |
| Dovecot | 传统 MDA | C + 文件系统 + Redis HAProxy 高可用桥接 | MIT | ⚠️ 需额外配置 | ❌ 仅 IMAP/POP3 | ❌ 需外部方案 | 老牌稳定 |
| Courier | 传统 MDA | C + 文件系统 | GPL/BSD | ❌ 无原生支持 | ❌ | ❌ | 维护放缓 |
| Mailu | Docker 邮件全家桶 | Python + 多容器组件 | MIT | ⚠️ 容器可扩展 | ⚠️ 管理界面为主 | ✅ | 2000+ stars |
| iRedMail | 一键安装全家桶 | Perl/Python + PostgreSQL/MySQL | GPL | ❌ 无 | ⚠️ 管理面板 | ✅ | 老牌稳定 |
| Hoppscotch | 邮件 API 服务 | Node.js + MongoDB | MIT | ✅ | ✅ 完整 | ✅ | 1500+ stars |
7.2 选型建议
如果你的场景是——
- 追求现代化 API + 分布式可扩展 → 首选 WildDuck 或 Stalwart Mail。两者架构相似,WildDuck 技术栈更主流(Node.js/MongoDB),Stalwart 性能更优(Rust 单进程)
- 已有成熟 MongoDB 集群 → WildDuck 天然适配,直接复用分片集群即可实现 No-SPOF
- 偏好 Rust 语言栈 → Stalwart Mail 更合适
- 单节点小规模 + 极简运维 → 传统方案 Dovecot + Postfix 或 Docker 全家桶 Mailu
- 需要完整一键式邮件栈(含反垃圾、Webmail 等) → iRedMail 或 Mailu 是成熟选择
💡 决策提示:WildDuck 的「模仿 Gmail」产品哲学在实际使用中有显著优势——REST API 返回已解析的 JSON 邮件对象,无需二次开发解析 RFC822 原文,自研 Webmail 和邮件集成时开发效率比传统 IMAP + 自研解析栈高 3–5 倍。
八、参考链接
- WildDuck 官网:https://wildduck.email
- 官方文档:https://docs.wildduck.email
- GitHub 仓库:https://github.com/zone-eu/wildduck
- Docker 镜像(GHCR):https://github.com/nodemailer/wildduck-dockerized
- ZoneMTA 外发 SMTP:https://github.com/zone-eu/zone-mta
- Haraka 入站 SMTP:https://github.com/haraka/Haraka
- Kirin 入站 SMTP(新版):https://github.com/zone-eu/kirin
- wild-config 配置框架:https://github.com/zone-eu/wild-config
- EUPL-1.2 许可全文:https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12