使用Docker搭建Mox Mail 邮局
介绍
Mox Mail 是一个开源的邮件服务器解决方案,用于收发电子邮件。支持 IMAP4、SMTP、SPF、DKIM、DMARC、MTA-STS、DANE 和 DNSSEC,基于信誉和基于内容的垃圾邮件过滤,国际化(EIA/IDNA),使用 ACME 和 Let’s Encrypt 自动 TLS,帐户自动配置,网页邮件。
其次就是,资源占用低,使得低配置VPS也能流畅运行。

部署条件
- Linux 服务器
- Docker 和 Docker Compose 已安装
- 能开放25端口(SMTP)、80端口(HTTP)、443端口(HTTPS)、143端口(IMAP)、465端口(SMTPS)、587端口(SMTP Submission)、993端口(IMAPS)。
- 可以在设置 rDNS(反向解析)的服务器,
- 域名(推荐使用独立域名)
在本文使用的是 Netcup 的 1o小鸡。
部署步骤
设置rDNS
rDNS(反向解析)是指通过IP地址查询对应的域名。设置rDNS有助于提高邮件的送达率,防止邮件被标记为垃圾邮件。
登录到你的VPS提供商的控制面板,找到DNS管理或类似的选项,设置rDNS记录,将你的服务器IP地址指向你的域名。例如,如果你的域名是 mail.example.com,那么你需要将rDNS记录设置为 mail.example.com。

开启DNSSEC
DNSSEC(Domain Name System Security Extensions)是一种用于保护DNS数据完整性和真实性的安全协议。开启DNSSEC可以防止DNS欺骗和缓存投毒等攻击,提高域名解析的安全性。
登录到你的域名注册商的控制面板,找到DNSSEC管理或类似的选项,启用DNSSEC功能。具体步骤可能因注册商而异,请参考注册商的帮助文档。
解析域名
在你的域名注册商的DNS管理面板中,添加以下DNS记录:
- A记录:将你的域名(如 mail.example.com)指向你的服务器IP地址。
关于其他DNS记录(如MX、SPF、DKIM等),是稍后设置。
设置主机名
在服务器上设置主机名为你的域名(如 mail.example.com):
sudo hostnamectl set-hostname mail.example.com
sudo systemctl restart systemd-hostnamed
核实 /etc/hosts 文件中有正确的主机名映射:
# 1.本地环回地址映射
127.0.0.1 localhost
# 2.主机名映射服务器公网 IP 地址
<182.68.1.90> mail.example.com
下载 Mox Mail Docker Compose 文件
创建一个目录来存放 Mox Mail 的 Docker Compose 文件:
mkdir -p ~/mox-mail
cd ~/mox-mail
wget https://github.com/mjl-/mox/raw/refs/heads/main/docker-compose.yml
docker-compose.yml 内的 image 版本,建议设置固定的, 官方版本记录: https://r.xmox.nl/r/mox/
创建用户
在启动 mox 之前,运行快速入门程序以创建配置文件,以便以mox 用户身份运行。
useradd -d $PWD mox
初始化配置文件
mkdir config data web
docker-compose run mox mox quickstart you@yourdomain.example $(id -u mox)
ps:
you@yourdomain.example是你的邮箱地址,需要替换为你自己的邮箱地址。$(id -u mox)是获取用户 ID 的命令,用于指定以哪个用户身份运行。
运行时,mox 会进行本服务器的外网 IP 进行 rDNS 检查,然后在配置文件中将Hostname初始化为你的 rDNS域名。
运行后, 屏幕会输出一些初始化信息, 包括生成的密码等, 请妥善保存, 其中的
Admin password,you@yourdomain.example账户密码 需要记录下来初始化中信息中的解析信息(DKIM、spf等)暂时不用理会,如果有配置错的地方,会有输出提示,虽然后续可以手动修改配置文件,但建议一次性设置好后,再次初始化,方便后续添加解析记录。
运行后,mox 会在 config data web 目录中生成相应的配置文件。
启动 Mox Mail
docker-compose up -d
管理Mox Mail
在这里,我们使用SSH隧道来访问 Mox Mail 的 Web 界面。
ssh -L 8080:localhost:80 your_user@your_server_ip
更简单的是使用Xshell的SSH隧道功能,设置本地端口8080映射到服务器的80端口。

然后在浏览器中访问 http://localhost:8080/admin,使用你在初始化时的Admin passwor登录。

查看域名:

后续的图片就懒得打码了,也不是什么隐私信息~
查看DNS设置:

将 Required DNS records 中的内容保存复制到本地txt文件.

如果是使用 Cloudflare 解析域名, 那么则可以直接上传 txt 文件,否则需要自行手动添加。


注意: 我看大佬说, Mox 为兼容部分垃圾 DNS 服务商,将 2 条 DKIM 长记录拆分为多段,Cloudflare 支持标准长记录。请务必手动将 DKIM 字段拼接为完整的记录,确保邮件签名校验正常。, 但我测试,我没拆分倒是也可以用,此处我借鉴大佬的经验, 直接写在此处备份:
如原DKIM
2026a._domainkey.example.com. TXT (
"v=DKIM1;h=sha256;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqAFl2HmyX1IgKDMbk+p4aCRtpt+jBzKFIq8Sr"
"9JzeqNfFH8EKyGmR+snt1JAR5xZX87j3uYxaYSaxXV8HlBu4SWKgQM2pSZRGQciNjaHIjGIhgdx8KrBDR6Ds+t9xISUrP7ScapZU"
"t69GMIDciDwcZWWTSrAE81vUt7c3K9bk5yiZo5Cbx2ecjE/9x+YVglXi9Qn48mAibdA0fNpyDvhuCEidMMaBnDYvkcpM9QGHmDkZ"
"4Ib1UCsVDWWWB+5A+gxyX5dw9WGTSiN68P2zgOchffvuYScm+XK3T8HY1C1xECkdMs21e+gAhIsCu/Zs6WcH9ziRpeF1J+ZY4jbf"
"8oKdwIDAQAB"
)
2026b._domainkey.example.com. TXT (
"v=DKIM1;h=sha256;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXEtTjp3eSw4IVA842RPSnBNqd1xFfTbGfeJO"
"NnxdwnEutxVaPs2LCV2fM1YnvAymcHqNP6Z88mhKSyAoqf/33rCeJAupBvda1BiW5ms2PT8ssc8L8RUNyzcGMMv1Z7A+uW6XqrbB"
"jyaRPWl1kKZde54LWaCqVZOhGnWRANpdSqz12Ix14L6Sqih+ngFej8xZpgS4I3GVaGSplLXIVZ8BP3C7ZdMOVjvZuMXkveHCVR9h"
"lQzQGuWFvmm9OBf3vqLwKhICfdPI2eCUbRX6zhQpEeEg3CUECqWgKpFKTbud8IGAJMi+dDbXwXhwD09BxGk4L0Kg8hWtkzda2lsy"
"1Yz8QIDAQAB"
)
那么则是删除双引号和换行, 拼接为一行:
2026a._domainkey.example.com. TXT (
"v=DKIM1;h=sha256;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqAFl2HmyX1IgKDMbk+p4aCRtpt+jBzKFIq8Sr9JzeqNfFH8EKyGmR+snt1JAR5xZX87j3uYxaYSaxXV8HlBu4SWKgQM2pSZRGQciNjaHIjGIhgdx8KrBDR6Ds+t9xISUrP7ScapZUt69GMIDciDwcZWWTSrAE81vUt7c3K9bk5yiZo5Cbx2ecjE/9x+YVglXi9Qn48mAibdA0fNpyDvhuCEidMMaBnDYvkcpM9QGHmDkZ4Ib1UCsVDWWWB+5A+gxyX5dw9WGTSiN68P2zgOchffvuYScm+XK3T8HY1C1xECkdMs21e+gAhIsCu/Zs6WcH9ziRpeF1J+ZY4jbf8oKdwIDAQAB"
)
2026b._domainkey.example.com. TXT (
"v=DKIM1;h=sha256;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvXEtTjp3eSw4IVA842RPSnBNqd1xFfTbGfeJONnxdwnEutxVaPs2LCV2fM1YnvAymcHqNP6Z88mhKSyAoqf/33rCeJAupBvda1BiW5ms2PT8ssc8L8RUNyzcGMMv1Z7A+uW6XqrbBjyaRPWl1kKZde54LWaCqVZOhGnWRANpdSqz12Ix14L6Sqih+ngFej8xZpgS4I3GVaGSplLXIVZ8BP3C7ZdMOVjvZuMXkveHCVR9hlQzQGuWFvmm9OBf3vqLwKhICfdPI2eCUbRX6zhQpEeEg3CUECqWgKpFKTbud8IGAJMi+dDbXwXhwD09BxGk4L0Kg8hWtkzda2lsy1Yz8QIDAQAB"
)
到此为止,就算搭建完成了,接下来就是测试收发邮件。
测试收发邮件
在浏览器中访问 http://localhost:8080/webmail,有一个比较简单的网页邮件客户端,可以用来测试收发邮件。
用户名可以用初始化时创建的邮箱地址,密码是初始化时生成的密码。
或者是在 admin 控制台 中创建新的邮箱账户,http://localhost:8084/admin/#accounts。

打开 https://www.mail-tester.com ,获取一个测试邮箱地址,然后从 Mox Mail 发送一封邮件到这个测试邮箱地址。
发送以后查看测试结果,看看是否有问题。如果有问题,可以根据提示进行调整。

尽量达到10分再进行发邮件, 但难的不是搭建服务,是邮箱域名怎么被大厂支持不拉黑,所以,自己搭建玩玩就好,或者当作自己的私人邮件服务器使用。别说后续还有反垃圾、反病毒等等。
https://internet.nl/test-mail/?invalid 也是一个不错的测试网站, 可以测试邮件服务器的各项指标。

一些查邮箱是否被拉黑的网站:
https://multirbl.valli.org/lookup/
注意
- 在本文档中默认生成的配置文件中,Mox Mail 会尝试自动获取和续订 TLS 证书。
- https://internet.nl/test-mail/?invalid 检测可以看出,启用不完善,例如 没有开启IPv6、DANE,会导致不是全绿,我个人使用倒是觉得没什么影响。但是,如果你的服务器有IPv6,那么还需要配置 ipv6的 PTR / rDNS,发信主机名的 AAAA 记录、SPF。这是很重要的一点,如果有IPv6而没有配置,那么会导致优先使用IPv6进行发件,从而导致对方邮局 rtp、spf 校验失败从而进垃圾箱或者拒收!!!,所以,要么配置,要么禁用IPv6发件
- 如果要开启 DANE,那么前提是你的域名注册商支持 DNSSEC, 并且你已经开启 DNSSEC。Linux自带的
systemd-resolved不支持本地 DNSSEC 解析, 可以安装使用unbound作为本地 DNS 解析器, 并开启 DNSSEC 支持。 (同时需要在dns服务商添加 TLSA 记录,记录值在 mox admin面板的 DNS 设置中可以看到_25._tcp.mail.xxx开头的)
配置IPv6(如果有)
- 配置 IPv6 的 PTR / rDNS
在 云厂商 / VPS 面板 设置 IPv6 的 PTR / rDNS,指向你的邮件服务器域名(如 mail.example.com)。 - 添加 AAAA 记录
在你的域名注册商的 DNS 管理面板中,添加 AAAA 记录,将你的域名(如 mail.example.com)指向你的服务器 IPv6 地址。 - 更新 SPF 记录
在你的域名注册商的 DNS 管理面板中,更新 SPF 记录,添加你的 IPv6 地址。例如,如果你的 IPv6 地址是 2a00:0000:00:0001::/64,那么 SPF 记录应该类似于:
example.com. TXT "v=spf1 ip4:xxx.xxx.xxx.xxx ip6:2a00:0000:00:0001::/64 mx ~all"
Mox如何禁用 IPv6 发件
如果你的服务器有 IPv6 地址,但你不想配置 IPv6,可以通过以下方式禁用 IPv6 发件:
编辑 Mox Mail 的配置文件 config/mox.conf,添加以下行:
Transports:
ipv4only:
Direct:
DisableIPv6: true
domains.conf 文件中顶部新增 ipv4only 传输:
Routes:
-
Transport: ipv4only
总结
个人感觉Mox Mail 还是挺不错的, 一步到位直接生成 ssl\tls 证书、dns记录,后台管理面板虽然简单没有css样式装饰,但基本功能还是有。
其次是 MTA-STS policies、DMARC evaluations、TLS connection results、DNSBL、DMARC aggregate reports 这些功能。
参考
https://blog.dejavu.moe/posts/hosting-mox-mail-server-on-debian-13/
附录(基础知识)
系统 DNS 解析器无 DNSSEC 验证有什么影响?
-
不验证 DNSSEC(比如用的是公共 DNS 但没开启验证,或本地链路被劫持/不可信),或
-
不在“可信路径”(mox 的判断里,如果不是 loopback 例如 127.0.0.1,或者没有 trust-ad,会认为不够可信)。
影响什么:
出站投递:对方的 MX 记录你是“未受保护”地查到的(理论上有 DNS 投毒风险)。
DANE(TLSA)验证无法用:即使对方发布了 TLSA,你这边也无法基于 DNSSEC 去验证 TLS 公钥,只能退化到:
MTA-STS(如果对方部署了)
或“opportunistic TLS”(加密但不验证证书,容易被中间人降级/替换)
但注意:这不是“发不出去邮件”,只是“安全能力下降”。
没有启用 DNSSEC 签名有什么影响?
即使本机 DNS 解析器能验证 DNSSEC,但如果 你的域名 mail.example.com 的 zone 本身没做 DNSSEC 签名,那别人收你的邮件/给你发邮件时:
也无法验证你在 DNS 里发布的 MX/SPF/DKIM/DMARC/MTA-STS 是否“不可篡改”
你也没法让 mox 自动配置 DANE (TLSA)(因为 TLSA 依赖 DNSSEC)
因此 mox 在 TLSA 记录(_25._tcp.mail.example.com TLSA …)注释掉了,提醒:启用 DNSSEC 后再加回来。
影响什么:
投递率:基本没影响(主流大厂不因没 DNSSEC 拒收)。
安全性:少了 DANE 这条“强认证”的路,只能依赖 CA 证书 + MTA-STS 或机会性 TLS。
MX 记录
「别人怎么把邮件投递给你」
example.com. MX 10 mail.example.com.
- 告诉全世界: “给 @example.com 的邮件,请投递到 mail.example.com 这台服务器”
没有会怎样
- 别人给你发邮件 → 直接失败
A / AAAA 记录
mail.example.com. A 1.2.3.4
- 把邮件服务器主机名解析成 IP
- MX 指向的目标必须能解析到 IP
没有会怎样
- MX 存在但投递失败(找不到服务器)
SPF 记录
「这封信是不是你授权的服务器发的」
example.com. TXT "v=spf1 ip4:1.2.3.4 mx ~all"
mail.example.com. TXT "v=spf1 a -all"
做什么
-
告诉收件服务器:
“只有这些 IP / MX,才允许代表 example.com 发信”
没有会怎样
- SPF fail / neutral
- 很容易进垃圾箱
- DMARC 无法通过
能解决什么
- 防止别人伪造
@example.com发垃圾邮件 - 提高投递评分
DKIM 记录
2026a._domainkey.example.com TXT "v=DKIM1; p=MIIBI..."
2026b._domainkey.example.com TXT "v=DKIM1; p=MIIBI..."
做什么
- 邮件发出时,mox 用私钥给邮件签名
- 收件方用 DNS 里的公钥验证签名
没有会怎样
- DMARC 只能靠 SPF(不稳定)
- 很多大厂(Gmail 等)评分降低
能解决什么
- 防篡改
- 明确“这是你域名真实发的邮件”
现代邮件系统核心组件
DMARC
_dmarc.example.com TXT "v=DMARC1;p=reject;rua=mailto:dmarcreports@example.com!10m"
做什么
-
定义 最终裁决规则
-
告诉对方:
- SPF / DKIM 都不通过 → 直接拒收
- 并给我发报告
没有会怎样
- 别人可以“半伪造”你的域名
- 你也拿不到失败报告
能解决什么
- 真正阻止域名被滥用
- 控制你域名的“邮件声誉”
MTA-STS
mta-sts.example.com CNAME mail.example.com.
_mta-sts.example.com TXT "v=STSv1; id=20260128T174441"
做什么
-
告诉对方:
“给我投递邮件时,必须用 TLS,并验证证书”
没有会怎样
- 回退到 opportunistic TLS(可被中间人降级)
能解决什么
- 防止 STARTTLS 降级攻击
- 提高传输安全性
TLSRPT
「TLS 出问题时告诉我」
_smtp._tls.example.com TXT "v=TLSRPTv1; rua=mailto:tlsreports@example.com"
_smtp._tls.mail.example.com TXT "v=TLSRPTv1; rua=mailto:tlsreports@mail.example.com"
做什么
- 当 TLS / MTA-STS / DANE 验证失败时
- 对方给你发 机器可读报告
能解决什么
-
你能知道:
- 哪些服务器连不上你
- 是证书问题 / DNS 问题 / 配置问题
诊断工具
DANE(TLSA)
「不用 CA,直接用 DNS 认证证书」
_25._tcp.mail.example.com TLSA 3 1 1 ...
做什么
- 用 DNSSEC 保护的 DNS
- 告诉对方:你的 SMTP 证书公钥长这样
没有会怎样
- 只能依赖 CA + MTA-STS
关键前提
❗ 必须启用 DNSSEC 所以现在 mox 把它注释掉了
高安全、低普及度(进阶玩法)
Autoconfig / Autodiscover / SRV
autoconfig.example.com CNAME mail.example.com.
_autodiscover._tcp.example.com SRV 0 1 443 mail.example.com.
_imaps._tcp.example.com SRV 0 1 993 mail.example.com.
_submissions._tcp.example.com SRV 0 1 465 mail.example.com.
做什么
- Thunderbird / Outlook 自动识别服务器
- 用户只填邮箱地址和密码
没有会怎样
- 只能手动填服务器地址/端口
体验优化,不影响投递
“禁用明文端口”的 SRV
_imap._tcp.example.com SRV 0 0 0 .
_submission._tcp.example.com SRV 0 0 0 .
做什么
-
明确告诉客户端:
“别用不加密端口”
安全姿态声明
CAA
「谁可以给我签 TLS 证书」
example.com CAA 0 issue "letsencrypt.org"
做什么
- 限制只有 Let’s Encrypt 能给你发证书
能解决什么
- 防止 CA 被滥用签发证书