这是什么
这是我用自己域名 xiejun-server.top 搭的一套私人邮箱:家里 VPS 上跑 docker-mailserver 负责收信,发信走 Brevo 免费中继。客户端用 IMAP 993、SMTP 465/587 收发,使用体验和普通邮箱没有差别。
为什么做
一是我想要一个真正属于自己的长期邮箱地址,不绑定任何厂商;二是腾讯云 VPS 的出站 25 端口被网络层封锁了,安全组放行也没用,所以发信只能借 ESP 中继。同时也借这个机会,把 SPF、DKIM、DMARC 这套域名认证彻底搞明白一遍。
现在怎么样
2026-10-18 上线,状态运行中。收信入站 25 已验证公网可达,外部能直接投递进来;发信实测能送达外部邮箱。mail-tester 检测 dmarc=pass、dkim=pass、spf=pass,评分 4.7/10,SpamAssassin 判定未达垃圾阈值。唯一消不掉的限制是 .top 后缀本身有声誉扣分,这是域名固有的,代码层面解决不了。
功能
- VPS 上用 docker-mailserver 收信,Dovecot 提供 IMAP/SSL 993
- 出站 25 被封,改由 Brevo 免费中继投递(300 封/天)
- Brevo 完成根域与 send 子域认证,由 Brevo 用自有域名重签 DKIM
- DMARC 设 p=quarantine 并留报告地址,mail-tester 三项全 pass
- Let's Encrypt 证书经 frp 隧道走 HTTP-01 自动续期
- 邮件数据放 8G loop ext4 镜像,便于备份与迁移
技术栈
docker-mailserverDocker ComposePostfixDovecotOpenDKIMBrevo SMTP 中继Let's Encryptfrp
使用 / 部署教程
部署步骤
- 准备:一个域名、一台入站 25 可达的 VPS、装好 Docker 与 Compose。注意先确认服务商是否封锁出站 25,被封就得走中继。
- 基础 DNS:
MX @ → mail.你的域名(优先级 10),A mail → VPS 公网 IP。解析生效前别急着起服务。
- 拉起 mailserver:准备
compose.yaml和mailserver.env。关键变量:OVERRIDE_HOSTNAME填邮件主机名、NETWORK_INTERFACE填宿主机网卡(用 host 网络)、SSL_TYPE=manual并指向证书路径。数据目录建议单独挂一个镜像文件,方便快照。
- 证书:Let's Encrypt 走 HTTP-01,我这里借用 frp 隧道把 80 端口暴露出去,cron 定时续期后重启容器。手动证书模式下续期不会自动重载,记得重启。
- 建账号:
docker exec mailserver setup email add <地址> <密码>;删除用setup email delete,查看用setup email list。默认不开 catch-all,未创建的地址直接拒收。
- 接入 Brevo:注册免费账号并完成手机验证,在后台做域名认证——根域和发信子域都要做,因为 Brevo 只对已认证域用你域名签 DKIM。把
brevo-code的 TXT 和brevo1/brevo2._domainkey的 CNAME 加进 DNS。然后在mailserver.env里配RELAY_HOST、RELAY_PORT=587、RELAY_USER、RELAY_PASSWORD(SMTP key),重启容器。
- DMARC:加
_dmarcTXT,起步可用p=quarantine并留rua报告地址。发信走 Brevo 的 SPF,我方域不再需要 SPF,DMARC 靠 DKIM 对齐通过。
- 客户端:IMAP 主机
mail.你的域名993 SSL/TLS;SMTP 同主机 465 或 587。
- 验证:拿 mail-tester 发一封测试信,看 spf/dkim/dmarc 三项是否 pass、SpamAssassin 是否低于阈值。再给 Gmail、QQ 各发一封确认进收件箱。
注意
- 资料中的邮箱密码、Brevo 账号与 SMTP key 属于敏感凭据,不要提交进仓库,改用环境变量或密钥管理;本文示例已隐去。
- 中继服务的免费额度(当前 300 封/天)和条款可能变化,群发前先确认,避免超限退信。
- Brevo 会改写邮件正文,导致本机 OpenDKIM 签名显示 fail;DMARC 靠 Brevo 重签的签名通过,不影响投递,想日志干净可关掉出站签名。