DragonFly MTA v0.14 介绍与选型指南

DragonFly MTA v0.14 介绍与选型指南:拆解 DragonFly Mail Agent(dma)的真实身世(m1416/DragonFly 不存在的核查记录)、无守护进程的注入-队列-转发架构、经实测验证的能力边界,以及与 Postfix/Haraka/maddy 的量化选型对比。查询日期 2026-10-25。

DragonFly MTA邮件服务器自托管2026/10/25

DragonFly MTA v0.14 介绍与选型指南

本文为认知与选型篇:先把「DragonFly MTA 到底是谁」讲清楚(这个名字至少对应三个不同的东西,其中任务情报中常见的指向并不存在),再给出一套可量化的选型对比。全部项目事实均来自 2026-10-25 的联网溯源与官方仓库核查,文中已逐条标注来源。

一、先防混淆:「DragonFly」这个名字下至少有三个东西

在动手选型之前必须先做一次名字排雷,因为「DragonFly + 邮件」的检索结果里混着三个完全不同的项目:

名称是什么语言与本系列的关系
DragonFly Mail Agent(dma)轻量邮件投递代理(MTA),DragonFly BSD 的基础系统组件,可移植到 LinuxC✅ 本文主角
DragonFly BSD一个类 Unix 操作系统(FreeBSD 分支)操作系统❌ 无关,只是 dma 的发源地
DragonFly Mail Agent 的前身 dma(8) 各发行版变体各发行版对 dma 的打包C等同于主角本身

特别说明:任务情报中的 m1416/DragonFly(Go 语言高性能 MTA)经 2026-10-25 联网核查并不存在,核查过程如下,供后续读者复现:

  1. 直接访问 https://github.com/m1416/DragonFly 返回 404;
  2. GitHub 用户页 m1416 无任何公开仓库;
  3. Wayback Machine 对该仓库地址无任何历史快照;
  4. Awesome Selfhosted 仓库的全量 git 历史检索(git log -S m1416)结果为空——该账号从未被收录过;
  5. 当前列表中名为「DragonFly」的条目指向 corecode/dma(C 语言版 DragonFly Mail Agent),描述为「a small Mail Transport Agent, designed for home and office use」。

因此本系列文档以真实存在、可安装、可实测的 corecode/dma(DragonFly Mail Agent) 为对象展开。结论:没有证据表明存在一个名为 m1416/DragonFly 的 Go 语言 MTA;若你在其他资料中看到这一指向,建议按上面的步骤复核。

二、项目溯源:corecode/dma 是谁

项目事实内容来源与查询日期
仓库https://github.com/corecode/dmaGitHub 仓库页,2026-10-25
主作者Simon Schubert(corecode),另有 Matthias Schmidt、DragonFly Project 等历史贡献者仓库 LICENSE 版权声明
语言C仓库语言统计
许可证BSD-2-Clause(版权行:Copyright (c) 2008-2014 Simon Schubert;2008 The DragonFly Project)仓库 LICENSE 文件
最新稳定版v0.14,发布于 2025-11-21(git tag 提交日期)仓库 Releases/Tags 页,查询日期 2026-10-25
维护活跃度最近提交 2025-12,2025-2026 年仍有新 tag 与提交,属低频但持续维护GitHub 仓库提交历史,2026-10-25
社区热度GitHub Star 约 115(Stars),/issues 持续有个位数开放shields.io 徽章数据,2026-10-25
生态位自 2015-03 起取代 Sendmail 成为 DragonFly BSD 基础系统默认 MTA;Debian/Ubuntu、Alpine、FreeBSD ports 均有打包DragonFly BSD 官方 wiki(commit 公告)、Debian packages 站

man 手册对它的自我定位写得非常直白(dma(8) 原文,v0.14 手册日期 2026-02-15):

dma is a small Mail Transport Agent (MTA), designed for home and office use. … dma is not intended as a replacement for real, big MTAs like sendmail or postfix. Consequently, dma does not listen on port 25 for incoming connections.

翻译成选型语言:dma 是一个「只出不进」的投递代理——它接收本机程序投递的邮件,做本地投递或转发到远端,但永远不监听 25 端口,不接收来自网络的邮件。

三、架构与工作方式

dma 的工作流可以概括为「注入 → 排队 → 投递 → 失败退回」四步,全部动作由命令触发,没有常驻服务:

 本机程序 (cron/应用脚本/printf | sendmail)
            │  注入(sendmail 兼容接口)
            ▼
      /var/spool/dma/                 ← 邮件队列(Q/M 文件对,flock 加锁)
            │
     ┌────┴─────┐
     ▼          ▼
 本地收件人   远端收件人
  mbox 投递    SMARTHOST 转发(STARTTLS + SMTP AUTH)
 (aliases 别名展开)

三个关键设计决定了对它的全部运维方式:

  1. 无守护进程。没有 systemctl start dma 这种东西;邮件在注入的当下就尝试投递,失败则落队列,靠下一次 dma -q(或发行版预置的 cron 任务)继续投。
  2. sendmail 兼容注入接口。以 sendmail、mailq 符号链接的形式存在,cron、logwatch、监控告警等老牌软件「默认给 root 发邮件」的路径可以无缝工作。
  3. 文件即队列。每封待投邮件对应 spool 目录里一对文件:Q 文件存信封与投递元信息,M 文件存完整报文,用 flock 做互斥。排障时直接 cat 就能看清状态。

本地投递细节:写收件人的 mbox(如 /var/mail/root),展开 /etc/aliases 别名(支持 *: 收件人 全局兜底),并通过一个独立的 setuid 助手程序 dma-mbox-create 安全地以收件人身份创建/打开邮箱文件——这也是唯一一处需要 setuid 权限的地方。外发细节:连接 SMARTHOST,按需协商 STARTTLS,按需用 auth.conf 中的凭据做 SMTP AUTH(PLAIN/LOGIN)。

四、核心能力清单(全部经实测验证)

以下是 v0.13/v0.14 在实验机上逐项验证过的能力边界,可作为选型时的「实测事实」基线:

  • ✅ 本地投递:sendmail root → 落 /var/mail/root,From_ 分隔行、Received 头齐全;
  • ✅ 别名系统:/etc/aliases 链式展开(postmaster → root → admin)、* 全局兜底别名、newaliases 生效(实测无需重启任何服务,因为没有服务可重启);
  • ✅ 外发转发:SMARTHOST + 任意端口(实测 8025),完整 SMTP 会话(HELO/MAIL FROM/RCPT TO/DATA)对拍确认;
  • ✅ STARTTLS + SMTP AUTH LOGIN:对端日志确认协商成功、凭据按 auth.conf 的 user|host:password 格式提供;
  • ✅ 证书校验:VERIFYCERT(CA 校验)与 FINGERPRINT(SHA-256 指纹固定)双模式;
  • ✅ 队列:mailq 查看、dma -q 手动冲刷、投递失败自动退信给本地 postmaster;
  • ✅ 反环路保护:把 SMARTHOST 指回自身 25 端口时,对端与自身同时拒绝并报 err=111,不会形成邮件风暴;
  • ✅ 兼容性:-A c、-L tag、-O、-o i 等 sendmail 兼容旗标,cron 等调用方无感。

不提供的能力(选型时必须知道):不监听 25/465/587 接收网络邮件、不做 MX 直投的路由优化之外的复杂策略、无邮件过滤/反垃圾、无 IMAP/POP、无 Web 管理界面。

五、量化选型对比:dma vs Postfix vs Haraka vs maddy

四款均为开源邮件服务端,但定位差异极大。下表按运维视角量化对比(各项目官方文档口径,查询日期 2026-10-25;dma 一列为本文实测补充):

维度dma v0.14Postfix 3.9.xHaraka 3.xmaddy v0.8.x
语言 / 许可证C / BSD-2-ClauseC / IPL-EPLJavaScript (Node.js) / MITGo / GPL-3.0
定位本机注入 + 转发/本地投递的轻量 MTA全功能互联网 MTA可编程 SMTP 服务端框架单二进制一体化邮件服务器(SMTP+IMAP)
进程模型无常驻进程(按需运行 + cron 冲刷)master + 多常驻子进程Node.js 常驻单进程单二进制常驻
监听 25 端口接收外来邮件❌ 不监听✅✅✅
收发路径完整性仅「本机→外」与「本机→本机」收发全路径(含 MX 直投)收 + 插件化外发收发全路径 + IMAP 存储
队列机制文件系统 spool,Q/M 文件对 + flock,-q 手动/定时冲刷成熟队列管理,延迟/重试/退避可精细调参插件化队列(默认内存+磁盘)内置队列,重试策略有限
TLSSTARTTLS 出站、证书 CA 校验、SHA-256 指纹固定完整(服务端+客户端)完整完整,内置 ACME 自动证书
SMTP 认证客户端侧 AUTH PLAIN/LOGIN(auth.conf)SASL 全家桶(Dovecot/Cyrus)插件(auth_* 系列)内置(含子地址等扩展)
本地投递mbox + aliases(含 * 兜底)local(8):mbox/maildir/外部命令无本地投递概念内置 IMAP 邮箱
配置载体与典型体量单文件 dma.conf,最小 3 行可用main.cf + master.cf,生产配置数十至数百行config/plugins + JS 插件代码单 toml,行数中等
资源占用极小(单个数十 KB 级二进制,无常驻内存)中(多进程常驻)大(Node.js 运行时)中
学习曲线极低(手册约 10 页)中高高(需写 JS 插件)低
典型场景主机告警外发、cron 邮件、中小站点把投递外包给中继独立邮件域、MX 直投、大规模中继高定制化 SMTP 服务(灰名单、流控、反垃圾自定义)个人/小团队自托管「一个进程收发全包」

选型结论速查:

  • 只需要「这台服务器上的程序能把邮件发出去/发进来」,且发信经由内部中继或邮件服务商 → dma 最合适,资源占用和攻击面都最小;同场景下 Postfix 是超配,Haraka/maddy 属于错位。
  • 要对外承接 25 端口邮件、做 MX、跑域名邮件流 → dma 直接排除,按运维能力和语言栈在 Postfix / maddy / Haraka 中选。
  • 想要「一条命令装好、SMTP+IMAP 全有」的个人自托管 → 看 maddy 或全家桶方案(如 Mailcow,见站内 《Mailcow 2026-09a 介绍与选型指南》);dma 不提供收件箱体系。

六、版本与安装形态

dma 的获取形态只有两种,没有官方容器镜像,也不存在官方 compose 编排——这一点与常见 Go 系新组件不同,部署规划时需要提前知道:

  1. 发行版包(推荐):Debian/Ubuntu apt install dma。实测 Ubuntu 22.04 仓库版本为 0.13-1build1,安装即自动创建 mail 组、/var/spool/dma、/etc/dma/ 并注册 /etc/cron.d/dma 队列冲刷任务。
  2. 源码构建:make && make install,安装到 /usr/local。v0.14 相比 0.13 的可见差异包括:Received 头附带主机名(DragonFly Mail Agent v0.14 on 主机名)等。两种形态并存时的覆盖关系与验收方法见安装篇。

具体安装步骤、构建参数与验收命令在下一篇:《DragonFly MTA v0.14 安装指南》。

七、给谁用,不给谁用

适合:

  • 每台都要「能发告警邮件」的批量主机(监控节点、跳板机、构建机);
  • cron/应用产出报告类邮件的集中外发;
  • 把 MX、反垃圾、投递策略全部外包给上游中继(Postfix 中继或商业 SMTP 服务)的架构;
  • 对资源占用、安全面、维护成本极度敏感的最小化系统。

不适合:

  • 需要接收互联网邮件(监听 25)的任何场景;
  • 需要 IMAP/POP/Webmail 的自托管邮箱需求;
  • 需要复杂投递策略(按域路由、速率整形、多中继负载均衡)的场景;
  • 期待容器化交付、声明式编排的云原生流水线(需自行构建镜像,官方不提供)。

一句话总结:dma 是把「本机邮件出口」这件事做到最小可行成本的方案;一旦需求越过「发出去」这条线,就该换别的工具。


参考来源(查询日期:2026-10-25)