VPSKnow

自建企业邮箱与发信服务完全指南

高级
50分钟

自建域名邮箱能带来账号与数据控制权,也意味着要长期承担安全更新、备份恢复、滥用处置和发信信誉。SPF、DKIM、DMARC 与 PTR 是必要条件,但不能保证进入收件箱;如果团队更看重稳定送达和低维护成本,应优先评估托管邮箱或合规 SMTP 中转。

⚠️ 生死准入:自建邮局三大硬前提

在投入时间搭建之前,先确认网络出口、正反向 DNS 和 IP 历史。任一项不满足都可能造成连接失败、限流、退信或进入垃圾邮件,但通过检查也不等于获得收件箱保证。

25 端口未被封锁

不少云厂商会限制出站 25 端口,需要按当前政策申请解除或改用合规 SMTP 中转;不要仅凭一次连接成功判断长期可用。

验证:telnet smtp.gmail.com 25 → 看到 Connected 才是通的

支持自定义 rDNS

反向 DNS(rDNS)即 PTR 记录,证明您的 IP 归属于您的邮件域名。需要在 VPS 控制面板里设置,部分廉价商家不支持自定义 PTR。

验证:VPS 控制面板 → Network → Reverse DNS 有编辑选项

IP 未在黑名单

复用 IP 可能带有历史投诉或黑名单记录。先核对具体名单、退信码和解除条件;换 IP 也会重新进入信誉冷启动,并非自动解决。

验证:访问 mxtoolbox.com/blacklists.aspx 检查 IP

前提检查命令

25 端口 + IP 信誉检查
# ── 在 VPS 内测试 25 端口是否对外开放(以 Gmail SMTP 为例)────────────────
telnet smtp.gmail.com 25

# 成功:Connected to smtp.gmail.com.
# 失败(被封):一直显示 Trying 1.2.3.4... 然后 Connection timed out

# 也可以用 nc 测试(更简洁)
nc -zv smtp.gmail.com 25 -w 5
# 成功:Connection to smtp.gmail.com 25 port [tcp/smtp] succeeded!
# 检查 IP 是否在黑名单(将 a.b.c.d 替换为您的 VPS IP)
# 方法一:在线工具(推荐)
# 访问 https://mxtoolbox.com/blacklists.aspx 输入 IP

# 方法二:命令行查询 Spamhaus 黑名单
# Spamhaus SBL/XBL/PBL 查询(IP 需要反转,如 1.2.3.4 → 4.3.2.1)
host 4.3.2.1.zen.spamhaus.org
# 如果返回 NXDOMAIN = 不在黑名单(✅ 好)
# 如果返回 127.0.0.x  = 在黑名单(❌ 需处理)

# 查看 PTR 记录(rDNS)是否已配置
host 您的服务器IP
# 期望返回类似:x.x.x.x.in-addr.arpa domain name pointer mail.yourdomain.com.

⚖️ 方案选型:Mailcow / Maddy / 第三方中转

方案 内存需求 功能完整性 适合场景
Mailcow ⭐ 2GB+(推荐 4GB) 完整:收/发/WebUI/反垃圾/日历/联系人 生产级企业邮局,功能齐全
poste.io 512MB+ 较完整,有免费版和付费版 轻量级,家庭/小团队邮局
Maddy 128MB 起 基础收发(无 WebUI) 极简需求,只需要发信
SendGrid(中转) 宿主机资源 仅发信,不负责收信 25 端口被封,借道第三方发信
Resend(中转) 宿主机资源 仅发信,开发者友好 应用发信(注册邮件/通知)
💡 选择建议: 大多数人应该选 Mailcow。如果 25 端口被封且无法解封,选"第三方中转"方案(Mailcow + SendGrid/Resend 的组合,收信用 Mailcow,发信走中转)。低配 VPS(512MB 内存)考虑 poste.io。

🐄 实战:Mailcow 完整部署

Mailcow 将 Postfix(发信)、Dovecot(收信)、Rspamd(垃圾邮件过滤)、SoGo(Web 界面)等 15+ 个组件打包进 Docker,是目前最先进的"开箱即用"邮件服务器套件。

📋 部署前 DNS 配置(需提前设置,等待生效)

A mail 你的服务器IP 邮件服务器 A 记录
MX @ mail.yourdomain.com 接收邮件的服务器(优先级 10)
TXT @ v=spf1 ip4:IP -all SPF 记录(部署后填写)
TXT _dmarc v=DMARC1; p=none;... DMARC(部署后从 Mailcow 后台获取)

Mailcow 安装步骤

Mailcow Docker 部署
# ── 前提:服务器已安装 Docker 和 Git ────────────────────────────────────────
# Mailcow 当前要求 Docker >= 24、Docker Compose >= 2,并依赖 jq 等系统工具
# Docker 按第 15 篇使用官方软件仓库安装;不要无审阅执行远程安装脚本
apt update
apt install -y git openssl curl gawk coreutils grep jq
docker --version
docker compose version

# ── 第一步:克隆 Mailcow 官方仓库 ─────────────────────────────────────────
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized

# ── 第二步:生成配置文件 ───────────────────────────────────────────────────
./generate_config.sh
# 提示输入 FQDN(完全合格域名),填入:mail.yourdomain.com(不是 yourdomain.com)
# 提示输入时区:Asia/Shanghai 或 UTC

# ── 第三步:(可选)修改 mailcow.conf 调整端口 ─────────────────────────────
# 若 80/443 已被 Nginx 占用,可修改 Mailcow 使用非标准端口
# HTTP_PORT=8080
# HTTPS_PORT=8443
# 然后用外部 Nginx 做反代(见后文)

# ── 第四步:拉取镜像并启动(首次较慢,约 10-20 分钟)──────────────────────
docker compose pull
docker compose up -d

# ── 验证所有服务都在运行 ──────────────────────────────────────────────────
docker compose ps
# 应该看到 ~15 个服务全部 running(包括 postfix、dovecot、rspamd 等)

💡 首次访问后台: 浏览器打开 https://mail.yourdomain.com(或 IP:8443),默认账号 admin,默认密码 moohoo登录后第一件事:立即修改密码!

Nginx 反代配置(80/443 端口被占用时)

/etc/nginx/conf.d/mailcow.conf
# 文件路径:/etc/nginx/conf.d/mailcow.conf
# 当 Nginx 已占用 80/443 时,用反代将 Mailcow 暴露出来

# Mailcow Web 管理界面
server {
    listen 443 ssl;
    http2 on;
    server_name mail.yourdomain.com;

    ssl_certificate     /etc/letsencrypt/live/mail.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mail.yourdomain.com/privkey.pem;

    location / {
        proxy_pass https://127.0.0.1:8443;  # Mailcow HTTPS 端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        # 关键:禁用 SSL 验证(Mailcow 使用自签名证书在内部)
        proxy_ssl_verify off;
    }
}

server {
    listen 80;
    server_name mail.yourdomain.com;
    return 301 https://$host$request_uri;
}

🔑 核心:SPF / DKIM / DMARC 身份验证

SPF、DKIM 和 DMARC 用于授权发信源、验证签名并声明域名对齐失败时的处置策略。它们是主流收件方的重要要求,但实际送达还取决于 PTR、TLS、投诉率、发送行为、内容和 IP/域名信誉。

TXT

① SPF — 证明发信授权

告诉全世界:只有 IP 为 你的服务器IP 的机器才被授权代表 yourdomain.com 发送邮件,其他 IP 发出的都是冒充。
主机名:@(根域名)  类型:TXT

# ── SPF 记录(TXT 类型,主机名填 @)────────────────────────────────────────
# 含义:只有 IP 地址为 你的服务器IP 的机器才有权代表 yourdomain.com 发送邮件
# -all = 其他所有来源都是伪造的,直接拒绝

v=spf1 ip4:你的服务器IP -all

# 如果有多个 IP(如使用了第三方发信服务):
# v=spf1 ip4:服务器IP include:sendgrid.net ~all
TXT

② DKIM — 邮件防篡改数字签名

Mailcow 后台会自动生成一对 RSA 密钥。每封邮件发出时用私钥签名,收件方用公钥验证,确保邮件在传输途中未被第三方篡改。
获取方式:Mailcow 后台 → Configuration → Domains → 选择域名 → DNS 标签页,复制显示的 DKIM TXT 记录。
主机名:dkim._domainkey   类型:TXT   值:v=DKIM1; k=rsa; p=(一长串 Base64 字符串)

TXT

③ DMARC — 验证失败处置策略

告知收件方:如果 SPF 或 DKIM 验证失败(可能有人在冒充您的域名发信),该怎么处理。同时可以接收每日汇总报告,了解哪些 IP 在冒充您。
主机名:_dmarc   类型:TXT

# ── DMARC 记录(TXT 类型,主机名填 _dmarc)──────────────────────────────
# 初始用 p=none 收集报告,不改变收件方处置
# rua=          = 每日汇总报告发到这个邮箱(了解哪些 IP 在冒充您的域名发信)
# 报告邮箱必须真实存在,并注意 XML 报告可能包含业务元数据

v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com

# 确认所有合法发信源通过且域名对齐后,再按小比例 quarantine 逐步提高 pct
# 最后才评估 p=reject;每一步继续观察 DMARC 报告和真实退信

📋 完整 DNS 记录检查清单

A 记录:mail.yourdomain.com → 服务器IP
MX 记录:@ → mail.yourdomain.com(优先级 10)
TXT(SPF):@ → v=spf1 ip4:IP -all
TXT(DKIM):dkim._domainkey → v=DKIM1;k=rsa;p=...
TXT(DMARC):_dmarc → v=DMARC1;p=none;rua=mailto:...
PTR(rDNS):服务器IP → mail.yourdomain.com(在 VPS 面板设置)

🔄 关键:设置反向解析(rDNS / PTR)

普通 DNS 是"域名→IP"的正向解析,而 rDNS(反向 DNS)是"IP→域名"的反向解析。这是邮件服务器的核心信誉指标之一——几乎所有大型收件方(Gmail、Outlook、腾讯邮箱)在接收邮件时都会检查发件 IP 是否有 PTR 记录,且 PTR 记录的域名是否与 HELO 主机名一致。

Vultr

服务器详情页 → IPv4 → Reverse DNS → 点击编辑图标

Hetzner

项目 → 服务器 → 网络 → IPv4 → 铅笔图标 → 修改 PTR

BandwagonHost

KiwiVM 面板 → 主菜单 → rDNS Management

DigitalOcean

Networking → Domains → PTR Records(需域名在 DO 托管)

rDNS 验证命令
# 设置 rDNS 后验证是否生效(通常 24-48 小时内生效)
host 你的服务器IP
# 期望输出:x.x.x.x.in-addr.arpa domain name pointer mail.yourdomain.com.

# 也可以用 dig 查询
dig -x 你的服务器IP
# 期望在 ANSWER SECTION 看到:x.x.x.x.in-addr.arpa. PTR mail.yourdomain.com.

# 常见 VPS 商家 rDNS 设置路径:
# Vultr:   服务器设置 → 详情页 → IPv4 → Reverse DNS
# Hetzner:  项目 → 服务器 → 网络 → IPv4 → 铅笔图标编辑 PTR
# BandwagonHost: KiwiVM 面板 → 主菜单 → rDNS Management
# DigitalOcean: Droplet → 网络 → PTR Records

📡 备选:25 端口被封时的第三方中转方案

如果您的 VPS 商家永久封禁 25 端口(如 AWS EC2 默认状态),或者您不想自己维护 IP 信誉,可以使用第三方 SMTP 中转服务。这种方案保留 Mailcow 的收件和管理功能,只把发信这一块外包出去。

📧 SendGrid(老牌,稳定)

  • 免费:每月 100 封(基本够个人使用)
  • 付费:每月约 $15 起,几万封/月
  • 需要完成域名验证才能发信

Resend(新兴,开发者友好)

  • 免费:每天 100 封,每月 3000 封
  • API 设计优雅,支持 React Email 模板
  • 适合应用发信(注册邮件/通知)

SendGrid 中转配置

Mailcow + SendGrid SMTP 中转
# ── 方案:使用 SendGrid 作为智能中转(SMTP Relay)────────────────────────
# 适用场景:VPS 25 端口被封,无法直接发信,但可以通过 587 端口发给 SendGrid
# 套餐、额度和允许用途会变化,部署前查看服务商当前政策

# 在 Mailcow 管理后台配置 SMTP 中继:
# Configuration → Routing → Outgoing mails → Smart Host
#    hostname: smtp.sendgrid.net
#    port: 587
#    username: apikey
#    password: 你的SendGrid API Key(在 SendGrid 后台创建)

# 配置后同时更新该发信域的 SPF/DKIM,并验证 From 域对齐
# API Key 只授予发信所需权限,放入受限密钥配置,不写入截图或仓库

Resend 中转配置

Mailcow + Resend SMTP 中转
# ── 方案二:使用 Resend(新兴发信服务,对开发者友好)────────────────────
# 套餐、额度、SMTP 参数和允许用途以当前官方文档为准

# 1. 在 resend.com 注册账号并添加您的发信域名
# 2. 按照 Resend 的指引在 DNS 添加验证记录(类似 DKIM)
# 3. 在 Mailcow 或 Postfix 中配置中继:
#    hostname: smtp.resend.com
#    port: 587 或 465
#    username: resend
#    password: 你的Resend API Key(格式 re_xxxxxxxxx)

# 4. 测试发送
# echo "Test mail body" | mail -s "Test" -r from@yourdomain.com recipient@gmail.com

💯 验收:邮件信用评分测试

大功告成后,不要急着批量发信。先用专业工具做个全面评分,确保没有遗漏的配置项。

Mail-Tester mail-tester.com

向临时地址发送测试邮件,可检查黑名单、SPF、DKIM、DMARC 与正文问题。分数用于定位配置,不代表真实收件箱送达率。

MXToolbox mxtoolbox.com

提供 DNS 记录查询、邮件头分析、黑名单检查、SMTP 连接测试等工具集合,是邮件服务器运维的必备诊断工具。

DMARC Analyzer dmarcanalyzer.com

专门分析 DMARC 报告,帮您了解哪些 IP 在使用您的域名发信,发现潜在的域名仿冒和配置问题。

GlockApps glockapps.com

测试您的邮件能否进入 Gmail/Outlook/Yahoo 等主流邮箱的收件箱(而非垃圾箱),是最直接的收件率测试工具。

🔧 运维:Mailcow 日常管理

Mailcow 运维常用命令
# ── Mailcow 日常运维命令 ────────────────────────────────────────────────────
cd /opt/mailcow-dockerized     # 必须在 mailcow 目录下执行

# ── 更新 Mailcow ───────────────────────────────────────────────────────────
# 先阅读版本说明、确认磁盘空间并完成可恢复备份,再运行官方更新脚本
./update.sh
# 更新后检查容器、收发信、登录、队列和日志;数据库变更后的回滚依赖完整备份

# ── 备份(备份到 /opt/mailcow-dockerized/备份目录)──────────────────────────
# 官方备份脚本(备份数据库、SSL 证书、配置文件)
./helper-scripts/backup_and_restore.sh backup all

# 恢复前先在隔离环境核对目标目录、版本和可用空间
./helper-scripts/backup_and_restore.sh restore /path/to/backup

# ── 查看邮件队列 ──────────────────────────────────────────────────────────
docker exec -it mailcowdockerized-postfix-mailcow-1 postqueue -p
# 不要用 postsuper -d ALL 直接清空;先保存队列证据并按队列 ID 处理确认的坏消息

# ── 查看各组件日志 ────────────────────────────────────────────────────────
docker compose logs -f postfix-mailcow      # Postfix 发信日志
docker compose logs -f dovecot-mailcow      # Dovecot 收信日志
docker compose logs -f rspamd-mailcow       # Rspamd 垃圾邮件过滤日志
docker compose logs -f nginx-mailcow        # Nginx Web 界面日志

# ── 查看 Rspamd 垃圾邮件统计 ──────────────────────────────────────────────
# 访问 https://mail.yourdomain.com/rspamd 查看实时统计面板

常见问题解答

我的邮件能发出去,但 Gmail 直接进了垃圾箱,如何解决?

系统性排查:① Mail-Tester 评分:先在 mail-tester.com 测分,找出具体失分项;② 检查黑名单:用 mxtoolbox.com/blacklists 查看 IP 是否被列入,若在黑名单需申请解除;③ DKIM 是否正确:在 Mailcow 后台确认 DKIM 密钥已生成且 DNS 记录已添加;④ 邮件内容质量:避免全大写标题、大量超链接、含"免费"/"赚钱"等垃圾邮件关键词;⑤ IP 信誉冷启动:新 IP 没有发信历史,Gmail 的机器学习会保守对待。建议先发少量邮件给真实联系人,让他们将您标记为"非垃圾邮件",逐步建立信誉;⑥ 发送给自己的 Gmail 后在 Gmail 中查看邮件原始信息(显示原始邮件),检查 SPF/DKIM/DMARC 状态是否都是 PASS。

Mailcow 需要占用 80 和 443 端口,但我的服务器已经在跑 Nginx,怎么办?

官方推荐的解决方案:在 mailcow.conf 中修改 HTTP_PORT=8080HTTPS_PORT=8443,然后用您现有的 Nginx 做反代(配置见本文 Nginx 反代配置章节)。注意:Mailcow 的 SMTP/IMAP 端口(25/465/587/993/995)不需要反代,它们直接监听在宿主机上,不受 80/443 冲突影响。此外,Mailcow 自带一个内部 Nginx 容器负责处理它自己的 HTTP 请求,和您宿主机的 Nginx 是两套独立进程,只是端口需要错开。

国内 QQ 邮箱、163 邮箱收不到我发的邮件,和 Gmail 被拒收是同一个问题吗?

不完全相同,而且国内邮箱通常比 Gmail 更难打入。额外的挑战:① GFW 影响:部分境外 IP 段(尤其是美国服务器)会被国内邮件服务器认为是高风险来源,直接拒绝;② 额外认证要求:腾讯邮箱要求发件 IP 满足更严格的信誉标准;③ ICP 备案:虽然对邮件服务器没有强制要求,但某些情况下备案状态会影响信任度。解决建议:① 选择香港或亚太地区的 VPS(延迟低、IP 信誉对国内邮箱更友好);② 使用国内企业邮箱服务(腾讯企业邮、阿里企业邮)作为收信端,只用自建服务器发信(通过 Resend/SendGrid 中转);③ 向 QQ 邮箱/163 提交 IP 信誉申诉(各自有申诉入口)。

Mailcow 的资源占用很高,有没有更轻量的替代方案?

Mailcow 确实较重(约 15 个 Docker 容器,空载约需 1-2GB 内存)。轻量替代方案:① poste.io(免费版):单容器方案,约 512MB 内存,有 Web 管理界面,适合个人或小团队。Docker 一键部署:docker run -d -e TZ=Asia/Shanghai -v /opt/poste:/data -p 25:25 -p 80:80 -p 443:443 --name poste analogic/poste.io;② iRedMail:脚本一键安装到宿主机(非容器),功能完整但配置文件散落系统各处,升级麻烦;③ 仅发信场景:如果只需要应用发信(不需要收信和 Web 界面),可以只安装 Postfix 原生配置(极轻量,约 20MB),配合 SendGrid/Resend 做信誉背书。

DMARC 的 p=none / p=quarantine / p=reject 应该怎么选?

p=none 用于收集报告,p=quarantine 请求收件方隔离失败邮件,p=reject 请求拒收。先盘点应用、工单系统、营销平台和中转服务等全部合法发信源,确认 SPF 或 DKIM 与 From 域对齐;至少观察一轮有代表性的业务周期后,从较小 pct 开始隔离并逐步提高。只有报告持续正常、转发和第三方发信均已验证时才评估 reject;处置强度不是越高越好。

Mailcow 怎么创建邮箱账号?如何在手机/电脑的邮件客户端配置?

在 Mailcow 后台(https://mail.yourdomain.com)登录后:① 创建邮箱:Email → Mailboxes → Add Mailbox,填入用户名(如 admin)、密码和配额;② 客户端配置:在邮件客户端(Outlook/Apple Mail/Thunderbird/iOS邮件 App)中添加账户时,服务器地址填 mail.yourdomain.com,收信协议选 IMAP(端口 993,SSL),发信选 SMTP(端口 587,STARTTLS);③ Web 界面:Mailcow 自带 SOGo 网页邮件客户端,访问 https://mail.yourdomain.com/SOGo 即可使用,功能类似 Gmail 网页版;④ 若使用 iPhone,在系统设置 → 邮件 → 账户 → 其他,手动填入 IMAP/SMTP 信息,注意开启 SSL/TLS。

服务器被黑客用来发垃圾邮件(Open Relay),如何防范?

Open Relay(开放中继)是指邮件服务器接受任何来源、转发给任何目的地的邮件——这会让您的服务器成为垃圾邮件的中转站,IP 快速进黑名单。防范措施:① Mailcow 默认已禁用 Open Relay,只允许授权账户发信,无需额外配置;② 强密码 + 2FA:确保邮箱账户密码强度足够,Mailcow 后台支持开启 TOTP 两步验证;③ 监控发信量:在 Mailcow 的 Rspamd 面板中查看发信统计,发现异常高的发信量立即检查;④ Fail2ban 保护 SMTP 端口:Mailcow 已集成,会自动封禁多次认证失败的 IP;⑤ 定期检查 docker compose logs postfix-mailcow | grep "warning\|error\|reject" 发现可疑活动。

自建邮件服务器和直接用腾讯企业邮箱/阿里企业邮箱相比,哪个更划算?

取决于责任边界:自建可以控制账号、保留策略和反垃圾配置,但宿主商、DNS、备份端和中转商仍可能参与数据路径,且更新、滥用响应、恢复与信誉都由自己负责。托管邮箱减少基础设施运维,并不等于零维护,也仍需配置身份验证、账号安全与归档。个人实验或有专职管理员、明确合规需求时再考虑自建;关键业务、小团队或缺少值守能力时通常优先托管邮箱,仅发应用通知则优先事务邮件服务。

学完邮件服务器后,下一步应该如何继续?与后续篇章有什么关联?

按 30 篇路径,第 18 篇(本篇,mail-server-setup)→ 第 19 篇(data-backup)→ 第 20 篇(server-monitoring)是最自然的延伸。关联逻辑:邮件数据是最难恢复的——一旦 Mailcow 数据卷损坏,历史邮件就永久丢失了。第 19 篇的 3-2-1 备份策略专门解决这个问题(Mailcow 官方备份脚本 + Rclone 异地同步);第 20 篇的 Uptime Kuma 监控则会在 Mailcow 的 25/465/587 端口异常时第一时间推送告警,让您能在邮件服务中断的第一时间响应——毕竟如果没有监控,您可能根本不知道邮件服务已经宕机了几天。三篇构成"部署 → 备份 → 监控"的完整邮件服务生命周期管理体系。

Mailcow 的 SSL 证书如何申请和续期?

Mailcow 可自动申请和续期 Let's Encrypt 证书,但仍需监控结果。确认 mail.yourdomain.com 的 A/AAAA 记录都指向可达地址,验证端口和代理路径正确;使用外部反向代理或外部 ACME 时按当前 Mailcow 文档选择一种证书责任边界。通过 docker compose logs -f acme-mailcow、证书到期监控和实际 SMTP/IMAP TLS 握手共同验收,避免只看 Web 页面证书。