目录

使用Docker搭建Mox Mail 邮局

介绍

Mox Mail 是一个开源的邮件服务器解决方案,用于收发电子邮件。支持 IMAP4、SMTP、SPF、DKIM、DMARC、MTA-STS、DANE 和 DNSSEC,基于信誉和基于内容的垃圾邮件过滤,国际化(EIA/IDNA),使用 ACME 和 Let’s Encrypt 自动 TLS,帐户自动配置,网页邮件。

xmox 官网

其次就是,资源占用低,使得低配置VPS也能流畅运行。

https://s3.aixfan.com/img/screenshot/2026/01/29/1769685002_134b.png

部署条件

  1. Linux 服务器
  2. Docker 和 Docker Compose 已安装
  3. 能开放25端口(SMTP)、80端口(HTTP)、443端口(HTTPS)、143端口(IMAP)、465端口(SMTPS)、587端口(SMTP Submission)、993端口(IMAPS)。
  4. 可以在设置 rDNS(反向解析)的服务器,
  5. 域名(推荐使用独立域名)

在本文使用的是 Netcup 的 1o小鸡。

部署步骤

设置rDNS

rDNS(反向解析)是指通过IP地址查询对应的域名。设置rDNS有助于提高邮件的送达率,防止邮件被标记为垃圾邮件。
登录到你的VPS提供商的控制面板,找到DNS管理或类似的选项,设置rDNS记录,将你的服务器IP地址指向你的域名。例如,如果你的域名是 mail.example.com,那么你需要将rDNS记录设置为 mail.example.com。

https://s3.aixfan.com/img/screenshot/2026/01/29/1769685900_136b.png

开启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端口。

https://s3.aixfan.com/img/screenshot/2026/01/29/1769687892_138b.png

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

https://s3.aixfan.com/img/screenshot/2026/01/29/1769687966_139b.png

查看域名: https://s3.aixfan.com/img/screenshot/2026/01/29/1769688059_141b.png

后续的图片就懒得打码了,也不是什么隐私信息~

查看DNS设置: https://s3.aixfan.com/img/screenshot/2026/01/29/1769688272_146b.png

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

https://s3.aixfan.com/img/screenshot/2026/01/29/1769688405_148b.png

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

https://s3.aixfan.com/img/screenshot/2026/01/29/1769688593_150b.png

https://s3.aixfan.com/img/screenshot/2026/01/29/1769692060_152b.png

注意: 我看大佬说, 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://s3.aixfan.com/img/screenshot/2026/01/29/1769692616_153b.png

打开 https://www.mail-tester.com ,获取一个测试邮箱地址,然后从 Mox Mail 发送一封邮件到这个测试邮箱地址。

发送以后查看测试结果,看看是否有问题。如果有问题,可以根据提示进行调整。 https://s3.aixfan.com/img/screenshot/2026/01/29/1769692700_154b.png

尽量达到10分再进行发邮件, 但难的不是搭建服务,是邮箱域名怎么被大厂支持不拉黑,所以,自己搭建玩玩就好,或者当作自己的私人邮件服务器使用。别说后续还有反垃圾、反病毒等等。

https://internet.nl/test-mail/?invalid 也是一个不错的测试网站, 可以测试邮件服务器的各项指标。

https://s3.aixfan.com/img/screenshot/2026/01/29/1769696193_157b.png

一些查邮箱是否被拉黑的网站:

https://multirbl.valli.org/lookup/

注意

  1. 在本文档中默认生成的配置文件中,Mox Mail 会尝试自动获取和续订 TLS 证书。
  2. https://internet.nl/test-mail/?invalid 检测可以看出,启用不完善,例如 没有开启IPv6、DANE,会导致不是全绿,我个人使用倒是觉得没什么影响。但是,如果你的服务器有IPv6,那么还需要配置 ipv6的 PTR / rDNS,发信主机名的 AAAA 记录、SPF。这是很重要的一点,如果有IPv6而没有配置,那么会导致优先使用IPv6进行发件,从而导致对方邮局 rtp、spf 校验失败从而进垃圾箱或者拒收!!!,所以,要么配置,要么禁用IPv6发件
  3. 如果要开启 DANE,那么前提是你的域名注册商支持 DNSSEC, 并且你已经开启 DNSSEC。Linux自带的systemd-resolved 不支持本地 DNSSEC 解析, 可以安装使用 unbound 作为本地 DNS 解析器, 并开启 DNSSEC 支持。 (同时需要在dns服务商添加 TLSA 记录,记录值在 mox admin面板的 DNS 设置中可以看到_25._tcp.mail.xxx开头的)

配置IPv6(如果有)

  1. 配置 IPv6 的 PTR / rDNS
    在 云厂商 / VPS 面板 设置 IPv6 的 PTR / rDNS,指向你的邮件服务器域名(如 mail.example.com)。
  2. 添加 AAAA 记录
    在你的域名注册商的 DNS 管理面板中,添加 AAAA 记录,将你的域名(如 mail.example.com)指向你的服务器 IPv6 地址。
  3. 更新 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/

mox mail API、Webhook文档

附录(基础知识)

系统 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 被滥用签发证书