DragonFly MTA v0.14 配置参数详解
DragonFly MTA v0.14 配置参数详解:/etc/dma 双文件配置体系全 17 项参数逐个拆解(中继/TLS/AUTH/身份/队列/退信),别名链与 * 兜底、发件人四级优先链实测、队列 Q/M 文件结构与四套场景化模板。
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.conf | SMTP AUTH 凭据(需 AUTHPATH 指向它) |
| 别名 | /etc/aliases(可被 ALIASES 改) | 本地收件人重写 |
| 邮件名 | /etc/mailname(可被 MAILNAME 指向) | 本机对外域名 |
| 环境变量 | EMAIL | 注入时的默认信封发件人 |
文件格式只有三条规则(手册原文语义):
- 参数一行一条,形如
name value,名称与值大小写敏感; - 布尔参数靠「注释/取消注释」表达:注释掉 = NO,保留 = YES(所以把布尔项写
YES/NO反而是错的); - 空行与
#开头的行被忽略。
一个可直接照抄的最小可用生产配置(实验机实机生效配置原文):
# 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 投递去向
| 参数 | 类型/默认 | 语义 |
|---|---|---|
SMARTHOST | string,默认空 | 外发中继的主机名。设了它,所有远端邮件都只交给这一台中继(不再做 MX 直投) |
PORT | numeric,默认 25 | 外发投递使用的端口。手册特别提醒:它对有无所无 SMARTHOST 都生效——dma 会把远端邮件投到「这个端口」,所以改端口务必与 SMARTHOST 成对改 |
实测组合:SMARTHOST smtp.relay.internal + PORT 8025,中继侧日志确认连接来源与端口均符合预期(安装篇二级验收)。
2.2 TLS 加密
| 参数 | 类型/默认 | 语义 |
|---|---|---|
SECURETRANSFER | boolean,默认注释(NO) | 总开关:启用 TLS/SSL 加密传输 |
STARTTLS | boolean,默认注释(NO) | 使用 STARTTLS 方式升级加密(须配合 SECURETRANSFER) |
VERIFYCERT | boolean,默认注释(NO) | 对中继证书做 CA 校验。官方示例配置中它是默认注释状态,v0.14 源码 dma.conf 第 30 行即 #VERIFYCERT(实测 grep 确认) |
FINGERPRINT | string,默认空 | 证书固定:填中继证书的 SHA-256 指纹,适合私有 CA/自签场景 |
OPPORTUNISTIC_TLS | boolean,默认注释(NO) | 机会式 TLS:STARTTLS 协商失败不报错,降级明文继续投。手册建议用于无 SMARTHOST、直投外部 MX 的场景 |
CERTFILE | string,默认空 | 本端 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 认证
| 参数 | 类型/默认 | 语义 |
|---|---|---|
AUTHPATH | string,默认未设置 | 指向 auth.conf 的路径。不设置则完全不认证 |
SECURE | boolean,默认注释(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 身份与域名
| 参数 | 类型/默认 | 语义 |
|---|---|---|
MAILNAME | string,默认空 | 本机对外主机名。为空时用 gethostname();若填的是绝对路径,则取该文件第一行——这正是与 /etc/mailname 联动的机制(实测:MAILNAME /etc/mailname,文件内容 mail.example.net,出站信封与头域均为该域) |
MASQUERADE | string,默认空 | 改写信封发件人。规则:含 @ 则整串作为发件人(如 john@ → john@主机名);不含 @ 则当作域名(percolator → 用户名@percolator)。优先级最高:覆盖 -f 旗标与 EMAIL 变量 |
2.5 队列与本地投递
| 参数 | 类型/默认 | 语义 |
|---|---|---|
SPOOLDIR | string,默认 /var/spool/dma | 队列目录。手册明说「just stick with the default」,不建议改 |
ALIASES | string,默认 /etc/aliases | 别名文件路径,同样建议保持默认 |
DEFER | boolean,默认注释(NO) | 提交后只入队不投递,等 dma -q 手动冲刷。手册场景:拨号/按需联网的机器 |
NULLCLIENT | boolean,默认注释(NO) | 绕过别名与本地投递,把一切邮件(包括发给本地用户的)直接推向 SMARTHOST。必须与 SMARTHOST 同时设置,否则配置无效 |
DEFER 实测语义:开启后注入即入队;冲刷仍靠 -q。与 -bq 的区别是:DEFER 是主机级策略(影响所有注入者),-bq 是单次命令级行为。
NULLCLIENT 适用面:专做「无本地邮箱的纯转发器」——例如告警汇出节点,本机不落任何邮件,全部丢给中心中继。
2.6 退信
| 参数 | 类型/默认 | 语义 |
|---|---|---|
FULLBOUNCE | boolean,默认注释(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 | 手册语义:覆盖下述一切(未实测改写,见下) |
| 2 | dma -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)
- dma(8) 手册 CONFIGURATION/PARAMETERS 全节(仓库
dma.8,.Dd February 15, 2026):https://raw.githubusercontent.com/corecode/dma/master/dma.8 - 官方示例 dma.conf(
#VERIFYCERT等注释行实测核对):https://raw.githubusercontent.com/corecode/dma/master/dma.conf - 站内相关:《DragonFly MTA v0.14 安装指南》、《DragonFly MTA v0.14 介绍与选型指南》