自建邮箱服务器:docker-mailserver 完整部署指南
不想再用 xx 邮箱尾巴发信,想拥有自己的 xxx@你的域名 邮箱?docker-mailserver 是最省事的自建方案——一个容器打包了 Postfix(发信)+ Dovecot(收信)+ Rspamd(反垃圾)+ ClamAV(查毒)+ Fail2ban 一整套邮件栈。
本文记录我在 Debian VPS 上用 Docker 部署 docker-mailserver 的完整过程,包括证书、账号、域名解析等关键配置。敏感信息已脱敏。
一、自建邮件服务器,先说清楚难点
邮件是互联网上门槛最高的自建服务,做好心理预期:
- 发信信誉:新域名/新 IP 没有信誉,容易被 Gmail/Outlook 丢进垃圾箱,需要时间养。
- SPF/DKIM/DMARC:三件套一个都不能少,否则邮件大概率被拒收。
- 端口:25 端口很多云厂商默认封禁,可能要申请解封。
但这些用 docker-mailserver 都能优雅解决,下面一步步来。
二、前置准备
- 一台 Linux VPS + Docker / Docker Compose
- 一个域名,并拥有它的 DNS 控制权
- 能开放 25/465/587/993 等端口(25 可能需向云厂商申请解封)
- 一个反向代理或证书源(我用 Nginx Proxy Manager 统一管证书)
三、Docker Compose 部署
核心 docker-compose.yml:
services:
mailserver:
image: mailserver/docker-mailserver:latest
container_name: mailserver
hostname: mail.example.top
restart: always
stop_grace_period: 1m
environment:
- LOG_LEVEL=info
- ACCOUNT_PROVISIONER=FILE
# 证书:复用 NPM 签发的 Let's Encrypt 证书
- SSL_TYPE=manual
- SSL_CERT_PATH=/etc/letsencrypt/live/npm-12/fullchain.pem
- SSL_KEY_PATH=/etc/letsencrypt/live/npm-12/privkey.pem
- OVERRIDE_HOSTNAME=mail.example.top
- SPOOF_PROTECTION=1
ports:
- "25:25" # SMTP
- "143:143" # IMAP
- "465:465" # SMTPS
- "587:587" # 提交(Submission)
- "993:993" # IMAPS
- "110:110" # POP3
- "995:995" # POP3S
- "4190:4190" # Sieve
volumes:
- ./dms/mail-data:/var/mail/
- ./dms/mail-state:/var/mail-state/
- ./dms/mail-logs:/var/log/mail/
- ./dms/config:/tmp/docker-mailserver/
- /path/to/npm/ssl:/etc/letsencrypt
几次关键的取值说明:
- ACCOUNT_PROVISIONER=FILE:用文件管理邮箱账号,简单直观。
- SSL_TYPE=manual + 证书路径:直接复用 NPM 已经签好的证书,省得邮箱容器再走一遍 ACME。
- 证书目录整个挂载:因为 Let's Encrypt 目录有软链接和归档,得把 NPM 的
ssl目录整体挂进来,而不仅是单个文件。
启动:
docker compose up -d
首次启动会生成 config/ 目录,之后 docker compose restart 才会加载部分配置。
四、创建邮箱账号
因为用 ACCOUNT_PROVISIONER=FILE,账号写在 config/postfix-accounts.cf 里。用容器内置的 setup 脚本创建:
docker compose exec mailserver setup email add 用户名@example.top 密码
或直接编辑文件,格式(密码用 doveadm pw 生成的哈希):
# config/postfix-accounts.cf
user@example.top|{SHA512-CRYPT}$6$...
五、配置 DNS(关键,别跳过)
邮件能不能发出去、会不会进垃圾箱,全看这几条 DNS 记录。
1. MX 记录
example.top MX 10 mail.example.top
2. A 记录 + PTR
mail.example.top A 服务器IP
还要让云厂商把服务器 IP 的反向解析(PTR)指回 mail.example.top。
3. SPF
example.top TXT "v=spf1 mx ~all"
4. DKIM
用容器生成密钥:
docker compose exec mailserver setup config dkim
把生成在 config/opendkim/keys/ 的 mail.txt 内容配成 TXT 记录:
mail._domainkey.example.top TXT "v=DKIM1; h=sha256; k=rsa; p=..."
5. DMARC
_dmarc.example.top TXT "v=DMARC1; p=none; rua=mailto:postmaster@example.top"
刚开始 p=none 观察一段时间,确认没问题再收紧到 quarantine 或 reject。
六、客户端接入
配好之后,用任意邮件客户端接入:
- 收信(IMAP):
mail.example.top:993,SSL/TLS - 发信(SMTP):
mail.example.top:587,STARTTLS - 账号:
user@example.top+ 密码
七、反垃圾与查毒(自带)
docker-mailserver 开箱自带:
- Rspamd:内容级反垃圾评分,支持学习(训练)
- ClamAV:病毒查杀
- Fail2ban:防暴力破解
一般无需额外配置即可用,进阶可调 RSPAMD_* 环境变量或改 rspamd 配置。
八、踩坑与注意事项
- 25 端口被封:很多云厂商默认封 25,先提交工单解封,否则收不了外部来信。
- SPF/DKIM/DMARC 缺一不可:缺了大概率被 Gmail 拒收或丢垃圾箱,务必三件套配齐并测试。
- 证书软链接:挂载 NPM 证书时必须挂整个
ssl目录,只挂单个fullchain.pem会因为符号链接断掉而失败。 - 改配置要重启:不少配置(尤其 SMTP 相关)要
stop_grace_period内的优雅重启才生效。 - 信誉养起来慢:初期发信可能进垃圾箱,正常使用 + 三件套配好会逐步改善。
测试是否配好,可以用 mail-tester.com 发一封测试信,看评分。
九、总结
docker-mailserver 把「自建邮箱」这个原本极其繁琐的工程,收敛成一个容器 + 三条 DNS 记录的事。核心就三块:证书(复用 NPM)、账号(FILE 方式)、DNS 三件套(SPF/DKIM/DMARC)。把这三块啃下来,你就拥有了一套完全自主的邮箱。
自建邮箱是自托管里成就感最高、也最需要耐心的一项。如果你也在折腾,欢迎交流。