DragonFly MTA v0.14 配置参数详解

DragonFly MTA v0.14 配置参数详解:/etc/dma 双文件配置体系全 17 项参数逐个拆解(中继/TLS/AUTH/身份/队列/退信),别名链与 * 兜底、发件人四级优先链实测、队列 Q/M 文件结构与四套场景化模板。

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

DragonFly MTA v0.14 配置参数详解

本文为配置篇:dma 的全部配置就是一个目录(/etc/dma)下的两个文本文件,加上别名文件与一个邮件名文件。本文逐个参数讲清语义、默认值与实测行为,全部依据 v0.14 手册(dma.8,手册日期 2026-02-15)并在实验机上验证,查询/实测日期 2026-10-25。

一、配置体系总览

文件/环境路径作用
主配置/etc/dma/dma.conf全部行为开关:中继、TLS、认证、队列、身份
认证配置/etc/dma/auth.confSMTP AUTH 凭据(需 AUTHPATH 指向它)
别名/etc/aliases(可被 ALIASES 改)本地收件人重写
邮件名/etc/mailname(可被 MAILNAME 指向)本机对外域名
环境变量EMAIL注入时的默认信封发件人

文件格式只有三条规则(手册原文语义):

  1. 参数一行一条,形如 name value,名称与值大小写敏感;
  2. 布尔参数靠「注释/取消注释」表达:注释掉 = NO,保留 = YES(所以把布尔项写 YES/NO 反而是错的);
  3. 空行与 # 开头的行被忽略。

一个可直接照抄的最小可用生产配置(实验机实机生效配置原文):

# cat /etc/dma/dma.conf
SMARTHOST smtp.relay.internal
PORT 8025
SECURETRANSFER
STARTTLS
AUTHPATH /etc/dma/auth.conf
MAILNAME /etc/mailname
# cat /etc/dma/auth.conf
admin|smtp.relay.internal:q1w2e3r4
# ls -la /etc/dma/
-rw-r----- 1 root mail   35 Oct 25 01:07 auth.conf
-rw-r----- 1 root mail  119 Oct 25 01:14 dma.conf

六行配置即完成「全部外发走指定中继 + STARTTLS 加密 + LOGIN 认证 + 规范发件域」。

二、dma.conf 全参数详解(17 项)

按用途分组。每项标注手册给出的类型与默认值。

2.1 投递去向

参数类型/默认语义
SMARTHOSTstring,默认空外发中继的主机名。设了它,所有远端邮件都只交给这一台中继(不再做 MX 直投)
PORTnumeric,默认 25外发投递使用的端口。手册特别提醒:它对有无所无 SMARTHOST 都生效——dma 会把远端邮件投到「这个端口」,所以改端口务必与 SMARTHOST 成对改

实测组合:SMARTHOST smtp.relay.internal + PORT 8025,中继侧日志确认连接来源与端口均符合预期(安装篇二级验收)。

2.2 TLS 加密

参数类型/默认语义
SECURETRANSFERboolean,默认注释(NO)总开关:启用 TLS/SSL 加密传输
STARTTLSboolean,默认注释(NO)使用 STARTTLS 方式升级加密(须配合 SECURETRANSFER)
VERIFYCERTboolean,默认注释(NO)对中继证书做 CA 校验。官方示例配置中它是默认注释状态,v0.14 源码 dma.conf 第 30 行即 #VERIFYCERT(实测 grep 确认)
FINGERPRINTstring,默认空证书固定:填中继证书的 SHA-256 指纹,适合私有 CA/自签场景
OPPORTUNISTIC_TLSboolean,默认注释(NO)机会式 TLS:STARTTLS 协商失败不报错,降级明文继续投。手册建议用于无 SMARTHOST、直投外部 MX 的场景
CERTFILEstring,默认空本端 SSL 证书路径(客户端场景很少用到)

实测:SECURETRANSFER + STARTTLS 开启后,中继侧抓到 TLSv1.3 会话(cipher: TLS_AES_256_GCM_SHA384),同时 dma 日志输出 Server supports STARTTLS → SSL initialization successful。

选型建议:公网中继用 VERIFYCERT;内网自建中继/自签证书用 FINGERPRINT 固定指纹;不要在未经评估时打开 OPPORTUNISTIC_TLS——它意味着降级明文是可接受的。

2.3 SMTP 认证

参数类型/默认语义
AUTHPATHstring,默认未设置指向 auth.conf 的路径。不设置则完全不认证
SECUREboolean,默认注释(NO)手册原文:把它手动改名为 INSECURE 才允许「明文连接上的明文认证」。改名这个动作本身就是防止你无意间把密码裸奔的保险丝

auth.conf 格式(手册规定):每行 user|smarthost:password。实测样例:

admin|smtp.relay.internal:q1w2e3r4

要点:

  • smarthost 字段要与 dma.conf 里的 SMARTHOST 值一致,dma 按「用户+主机」精确匹配取凭据;
  • 中继侧验证:AUTH accepted: mechanism=LOGIN login=b'admin'(实测回显),dma 自动选择了服务器提供的 LOGIN 机制;
  • 文件权限实测用 640 root:mail;默认安装给的是 600 语义,放权给组内排障前先想清楚。

2.4 身份与域名

参数类型/默认语义
MAILNAMEstring,默认空本机对外主机名。为空时用 gethostname();若填的是绝对路径,则取该文件第一行——这正是与 /etc/mailname 联动的机制(实测:MAILNAME /etc/mailname,文件内容 mail.example.net,出站信封与头域均为该域)
MASQUERADEstring,默认空改写信封发件人。规则:含 @ 则整串作为发件人(如 john@ → john@主机名);不含 @ 则当作域名(percolator → 用户名@percolator)。优先级最高:覆盖 -f 旗标与 EMAIL 变量

2.5 队列与本地投递

参数类型/默认语义
SPOOLDIRstring,默认 /var/spool/dma队列目录。手册明说「just stick with the default」,不建议改
ALIASESstring,默认 /etc/aliases别名文件路径,同样建议保持默认
DEFERboolean,默认注释(NO)提交后只入队不投递,等 dma -q 手动冲刷。手册场景:拨号/按需联网的机器
NULLCLIENTboolean,默认注释(NO)绕过别名与本地投递,把一切邮件(包括发给本地用户的)直接推向 SMARTHOST。必须与 SMARTHOST 同时设置,否则配置无效

DEFER 实测语义:开启后注入即入队;冲刷仍靠 -q。与 -bq 的区别是:DEFER 是主机级策略(影响所有注入者),-bq 是单次命令级行为。

NULLCLIENT 适用面:专做「无本地邮箱的纯转发器」——例如告警汇出节点,本机不落任何邮件,全部丢给中心中继。

2.6 退信

参数类型/默认语义
FULLBOUNCEboolean,默认注释(NO)退信附完整原文(含正文),否则只带头部

退信默认走本地 postmaster 别名链,实测样例(admin 邮箱收到):

From MAILER-DAEMON Sun Oct 25 01:16:33 2026
Received: from MAILER-DAEMON
	id 4a6c4c
	by mail.example.net (DragonFly Mail Agent v0.13);
	...
X-Original-To: <ops@example.com>
From: MAILER-DAEMON <>
To: root@mail.example.net
Subject: Mail delivery failed

This is the DragonFly Mail Agent v0.13 at mail.example.net.

There was an error delivering your mail to <ops@example.com>.

SMTP login to smtp.relay.internal failed

审计邮件内容的需求开启 FULLBOUNCE;介意正文外泄(比如发到外部审计邮箱)就保持关闭。

三、别名文件 /etc/aliases

格式(手册原文):名字: 目标1 目标2 ...,目标还可以再是别名,形成链条;特殊名 * 为全局兜底。实测配置与行为:

root: admin
postmaster: root
  • 给 postmaster 发信 → 展开 root → 再展开 admin → 落到 /var/mail/admin,链式展开实测通过;
  • * 兜底别名实测通过:配置 *: admin 后向任意不存在的本地名发信,均落入 admin 邮箱。手册同时提醒:兜底别名开启后,「本地不存在用户」的退信行为被覆盖——邮件会投给兜底人而不是退回,只想收告警的机器这反而是想要的;
  • 生效方式:改完执行 newaliases(exit 0、无输出),无需重启任何服务——dma 没有常驻进程,每次投递现读配置。

四、发件人身份的优先级链

一个邮件的信封发件人(MAIL FROM)由谁决定?手册定义了明确的覆盖关系,实验机上实测了两端:

优先级来源实测值
1(最高)MASQUERADE手册语义:覆盖下述一切(未实测改写,见下)
2dma -f 地址 / -r 地址手册语义:覆盖 EMAIL
3环境变量 EMAIL✅ 实测:EMAIL=alerts@example.net 注入后中继侧收到 MAIL FROM: alerts@example.net
4(默认)用户名@MAILNAME 域✅ 实测:root 注入 → MAIL FROM: root@mail.example.net

给 MASQUERADE 做验收的最简方法:配置后发一封测试信,在中继侧看 MAIL FROM 是否变成改写值——它不该再随注入者变化。

五、队列文件结构(排障时直接读)

队列是「每封邮件一对文件」的纯文本结构,实测一次滞留队列的完整原文:

# ls -la /var/spool/dma/
-rw-rw---- 1 mail mail  342 Oct 25 01:23 M4a496d.58a74b63d200
-rw-rw---- 1 mail mail   81 Oct 25 01:23 Q4a496d.58a74b63d200
-rw-r----- 1 mail mail    0 Oct 25 01:23 flush
# cat /var/spool/dma/Q4a496d.58a74b63d200
ID: 4a496d.58a74b63d200
Sender: root@mail.example.net
Recipient: ops@example.com
# head -8 /var/spool/dma/M4a496d.58a74b63d200
Received: from root (uid 0)
	(envelope-from root@mail.example.net)
	id 4a496d
	by mail.example.net (DragonFly Mail Agent v0.14 on mail01);
	...
Subject: queue-demo-22
  • Q 文件:信封元信息(ID/发件人/收件人),flock 加锁的对象就是它;
  • M 文件:完整报文(含 dma 生成的时间戳头、Message-Id);
  • flush:冲刷协调用的空标记文件;
  • 文件属主 mail:mail、权限 660——排障时 root 直接 cat 即可,别手改。

六、场景化配置模板

模板 A:告警外发节点(最常见,6 行)

SMARTHOST smtp.relay.internal
PORT 587
SECURETRANSFER
STARTTLS
VERIFYCERT
AUTHPATH /etc/dma/auth.conf
MAILNAME /etc/mailname

模板 B:纯转发器(本机不留任何邮件)

SMARTHOST smtp.relay.internal
PORT 587
SECURETRANSFER
STARTTLS
VERIFYCERT
AUTHPATH /etc/dma/auth.conf
MAILNAME /etc/mailname
NULLCLIENT

模板 C:内网自签中继(指纹固定替代 CA 校验)

SMARTHOST smtp.relay.internal
PORT 465
SECURETRANSFER
FINGERPRINT AA:BB:CC:...:99
AUTHPATH /etc/dma/auth.conf
MAILNAME /etc/mailname

(FINGERPRINT 取值方法:在中继主机上对证书计算 SHA-256,手册未规定分隔符格式,实践中以仓库文档/示例为准逐字符核对。)

模板 D:离线笔记本(攒着一起发)

SMARTHOST smtp.relay.internal
MAILNAME /etc/mailname
DEFER

七、配置速查卡

想做什么改哪里
全部外发给中继SMARTHOST(+PORT 非标端口)
加密外发SECURETRANSFER + STARTTLS
校验中继证书VERIFYCERT(公网 CA)或 FINGERPRINT(自签)
中继要账号密码AUTHPATH + auth.conf 三段式
统一发件域MAILNAME /etc/mailname
强制改写信封发件人MASQUERADE
本机不留邮件NULLCLIENT
离线攒批DEFER(配 cron -q)
退信带全文FULLBOUNCE
任意名字都收aliases 里 *: 目标
换收件人映射aliases + newaliases

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