从 0 搭建 Mailu 邮件服务器:Docker Compose 部署 + DNS 记录 + 证书/反向代理要点
Mailu 是一个“全家桶”式的邮件服务器方案:SMTP/IMAP、反垃圾、Webmail、管理后台都给你打包好了。本文用 Docker Compose 从 0 在一台 VPS 上搭建可用的 Mailu,并把 DNS 记录、证书、端口/反向代理冲突、投递成功率(PTR/反向解析) 这些容易踩坑的点一次讲清。
0. 前置准备(别跳过)
- 一台干净的 VPS(建议 Debian 12/13 / Ubuntu 22.04+)。
- 一个域名:*你的主域名*(示例:
example.com)。 - 一个邮件主机名(MX 指向它):*你的邮件主机名*(示例:
mx.example.com)。 - 服务器公网 IP:*你的服务器公网IP*。
- 重要:最好能设置 PTR(反向解析)把 IP 指回 *你的邮件主机名*,否则很多收件方会降权甚至拒收。
1. 规划:端口、主机名、证书模式
1.1 邮件常用端口(建议全部开放)
25/tcp:SMTP(服务器间投递)465/tcp:SMTPS(客户端提交,隐式 TLS)587/tcp:SMTP Submission(客户端提交,STARTTLS)143/tcp:IMAP(STARTTLS)993/tcp:IMAPS(隐式 TLS)4190/tcp:Sieve(邮件过滤规则)80/443:Web 管理后台 / Webmail(以及 Let's Encrypt 校验)
如果你只想给自己用,理论上可以不开放 110/995(POP3),一般也不建议开。
1.2 证书(TLS)怎么选
- 推荐:让 Mailu 自己申请 Let's Encrypt(简单直接)。要求:
80/443能从公网直连到 Mailu 前端容器。 - 如果你的服务器上已经有 Nginx/Apache 占用 80/443:要么把网站迁到反代到 Mailu(或改端口),要么改用“外置证书”模式(见后文“端口冲突/反向代理”)。
2. 安装 Docker 与 Docker Compose
下面以 Debian 为例,其他发行版按官方文档调整即可。
# 更新系统
sudo apt update
sudo apt -y upgrade
# 安装 Docker
sudo apt -y install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(. /etc/os-release && echo $VERSION_CODENAME) stable" |
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 验证
docker --version
docker compose version3. 用 Mailu 向导生成配置
Mailu 官方提供配置向导,会输出 docker-compose.yml 和 mailu.env。你可以在浏览器里用向导生成,也可以参考本文直接写。
3.1 目录结构(建议)
sudo mkdir -p /mailu
cd /mailu3.2 核心配置(mailu.env 示例,关键项解释)
下面是常用关键项(示例值都请替换为你自己的)。
# /mailu/mailu.env
DOMAIN=*你的主域名* # 例如 example.com
HOSTNAMES=*你的邮件主机名* # 例如 mx.example.com(也可逗号分隔多个)
POSTMASTER=*你的postmaster用户名* # 例如 postmaster 或 admin
# 让 Mailu 自己申请 Let's Encrypt
TLS_FLAVOR=letsencrypt
# Web 路径(默认就挺好)
WEB_ADMIN=/admin
WEB_WEBMAIL=/webmail
WEBROOT_REDIRECT=/webmail
# 时区
TZ=Asia/Shanghai
# 初始化管理员(首次启动时生效)
INITIAL_ADMIN_DOMAIN=*你的主域名*
INITIAL_ADMIN_ACCOUNT=*你的管理员用户名*
INITIAL_ADMIN_PW=*请设置一个强密码*提示:HOSTNAMES 里最重要的是放你的邮件主机名(MX 指向它)。如果你把博客/其他站点也放在同一台机子上,不要随意把无关域名加进来,避免证书/路由变复杂。
3.3 docker-compose.yml(简化示例)
Mailu 的 compose 会包含前端(nginx)、admin、postfix、dovecot、rspamd、redis 等。最关键的是 front 服务的端口映射。
services:
front:
image: ghcr.io/mailu/nginx:2024.06
restart: always
env_file: mailu.env
ports:
- "0.0.0.0:80:80"
- "0.0.0.0:443:443"
- "0.0.0.0:25:25"
- "0.0.0.0:465:465"
- "0.0.0.0:587:587"
- "0.0.0.0:143:143"
- "0.0.0.0:993:993"
- "0.0.0.0:4190:4190"
volumes:
- "/mailu/certs:/certs"
- "/mailu/overrides/nginx:/overrides:ro"
admin:
image: ghcr.io/mailu/admin:2024.06
restart: always
env_file: mailu.env
volumes:
- "/mailu/data:/data"
- "/mailu/dkim:/dkim"
imap:
image: ghcr.io/mailu/dovecot:2024.06
restart: always
env_file: mailu.env
volumes:
- "/mailu/mail:/mail"
smtp:
image: ghcr.io/mailu/postfix:2024.06
restart: always
env_file: mailu.env
volumes:
- "/mailu/mailqueue:/queue"
antispam:
image: ghcr.io/mailu/rspamd:2024.06
restart: always
env_file: mailu.env
volumes:
- "/mailu/filter:/var/lib/rspamd"4. 防火墙与系统参数
如果你用的是 ufw:
sudo apt -y install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSH
sudo ufw allow 22/tcp
# Web + Mail
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 25/tcp
sudo ufw allow 465/tcp
sudo ufw allow 587/tcp
sudo ufw allow 143/tcp
sudo ufw allow 993/tcp
sudo ufw allow 4190/tcp
sudo ufw enable
sudo ufw status注意:有些云厂商会在“安全组”层面也挡端口,记得双端都开。
5. DNS 记录(决定你能不能稳定收发)
5.1 A / AAAA
mx IN A *你的服务器公网IP*
; 可选:如果有 IPv6
mx IN AAAA *你的服务器公网IPv6*5.2 MX
@ IN MX 10 mx.*你的主域名*.5.3 SPF(TXT)
@ IN TXT "v=spf1 mx ~all"5.4 DKIM(TXT)
Mailu 启动后会生成 DKIM 密钥,你需要把公钥写进 DNS。一般记录长这样:
dkim._domainkey IN TXT "v=DKIM1; k=rsa; p=*这里粘贴Mailu生成的公钥*"5.5 DMARC(TXT)
_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:*你的汇总报告邮箱*; ruf=mailto:*你的取证报告邮箱*; fo=1"5.6 PTR(反向解析,强烈建议)
到你的 VPS/云厂商控制台把 *你的服务器公网IP* 的 PTR 设置为 *你的邮件主机名*(例如 mx.example.com)。这是提升投递成功率最划算的一步。
6. 启动 Mailu
cd /mailu
# 启动
docker compose up -d
# 看状态
docker compose ps
# 查看日志(前端)
docker logs -n 200 mailu-front-1第一次启动时会自动初始化管理员。稍等 1~2 分钟后访问:
- 管理后台:
https://*你的邮件主机名*/admin - Webmail:
https://*你的邮件主机名*/webmail
7. 从后台创建邮箱与别名
- 登录管理后台。
- 创建一个用户:
user@*你的主域名*,设置密码。 - 如需转发/别名,创建 alias(比如
hi@*你的主域名*指向你的主邮箱)。
8. 客户端配置(IMAP/SMTP)
以常见邮箱客户端为例:
- IMAP 服务器:
*你的邮件主机名*,端口993(SSL/TLS) - SMTP 服务器:
*你的邮件主机名*,端口587(STARTTLS)或465(SSL/TLS) - 用户名:完整邮箱地址(如
user@*你的主域名*) - 密码:你在后台设置的密码
9. 常见坑与排查思路
9.1 25 端口被封
- 很多云厂商默认封 25(出站/入站)。如果入站 25 被封,别人无法投递到你;如果出站 25 被封,你发信会失败。
- 解决:申请解封、换 provider,或用中继(SMTP relay)。
9.2 80/443 端口冲突(同机部署网站/博客)
Mailu 的 front 默认要占用 80/443(申请证书 + 提供 web)。如果你的服务器上已经有 Nginx/Apache:你有三种典型方案:
- 方案 A:把网站迁移到另外的反向代理里,让 Mailu front 继续直占 80/443(最省事)。
- 方案 B:Mailu front 只监听本地端口(如 127.0.0.1:8080/8443),由你自己的 Nginx 统一对外反代;同时证书也由你自己的 Nginx/ACME 来管理(Mailu 改用外置证书模式)。
- 方案 C:给邮件系统单独一张公网 IP,让 Mailu 独占 80/443(如果你有多 IP)。
9.3 SPF/DKIM/DMARC 没配好,进垃圾箱
- SPF:至少要包含
mx或ip4。 - DKIM:确保 DNS 里那条 TXT 没断行/没漏引号。
- DMARC:先用
p=none观察报告,再逐步收紧到quarantine/reject。
9.4 反向解析(PTR)不匹配
PTR 最好指向你的邮件主机名,并且该主机名正向解析回同一个 IP(即正反一致)。否则一些大厂会直接给你“高风险”标签。
10. 升级与备份建议
- 升级:
docker compose pull && docker compose up -d,升级前建议先备份卷目录。 - 备份:至少备份
/mailu/data、/mailu/mail、/mailu/dkim、/mailu/certs(如果你自己管理证书)。 - 监控:关注磁盘(邮件很吃盘),以及
mailu-front/postfix/dovecot日志。
如果你准备把 Mailu 和你现有的网站(例如博客)放在同一台机器上,建议一开始就把“端口占用”和“证书归属”规划清楚,后面会省很多折腾。