VPSKnow

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

高级
50分钟

拥有 admin@yourdomain.com 这样的专属域名邮箱,是极客的终极浪漫,也是企业品牌通信的基础。但自建邮件服务器是公认的运维"深水区"——协议繁多、信誉体系复杂,一步走错就被直接进垃圾箱。本指南将带您系统性地避开 90% 的坑,建立一个高信誉度的私有邮局。

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

在投入时间搭建之前,请先确认您的 VPS 满足以下三个硬指标。任意一项不满足,发出的邮件都会被 Gmail/腾讯/网易直接拒收。

01

25 端口未被封锁

由于垃圾邮件泛滥,绝大多数云厂商默认封锁出站 25 端口(SMTP 标准端口)。必须提交工单申请解封,部分厂商永久不解封(如 AWS EC2、Oracle Cloud)。

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

支持自定义 rDNS

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

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

IP 未在黑名单

共享 IP 可能被前任租户用来发垃圾邮件,导致 IP 进入 Spamhaus 等黑名单。一旦被列入黑名单,新购 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 ────────────────────────────────────────
# 参考第15篇 Docker 安装:curl -fsSL https://get.docker.com | bash

# ── 第一步:克隆 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;
}

🔑 核心:防进垃圾箱的 DNS 三件套

不配置这三条 DNS 记录,您发出的邮件会被 Gmail/QQ 邮箱/网易直接扔进垃圾箱,甚至直接拒收。它们是邮件服务器的"身份证"体系:

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=quarantine  = 验证失败的邮件放入垃圾箱(建议初始值,而非直接 reject)
# rua=          = 每日汇总报告发到这个邮箱(了解哪些 IP 在冒充您的域名发信)
# adkim=s       = DKIM 严格模式(域名必须完全匹配)
# aspf=s        = SPF 严格模式

v=DMARC1; p=quarantine; rua=mailto:dmarc@yourdomain.com; adkim=s; aspf=s

# 等确认邮件完全正常后,可以升级到 p=reject(直接拒收验证失败的邮件)

📋 完整 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=quarantine;...
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
# SendGrid 免费计划:每月 100 封免费,基本满足个人使用

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

# 或者在 Postfix 配置文件中直接设置(高级方法):
# relayhost = [smtp.sendgrid.net]:587
# smtp_sasl_auth_enable = yes
# smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
# smtp_sasl_security_options = noanonymous
# smtp_tls_security_level = encrypt

# /etc/postfix/sasl_passwd 文件内容:
# [smtp.sendgrid.net]:587 apikey:你的SendGrid_API_Key

Resend 中转配置

Mailcow + Resend SMTP 中转
# ── 方案二:使用 Resend(新兴发信服务,对开发者友好)────────────────────
# 免费计划:每天 100 封,每月 3000 封
# 优势:界面简洁,API 设计优雅,支持 React Email 模板

# 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、邮件正文质量等 10+ 维度打分。目标:10/10 满分。

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
# 清空所有积压邮件(⚠️ 谨慎)
docker exec -it mailcowdockerized-postfix-mailcow-1 postsuper -d ALL

# ── 查看各组件日志 ────────────────────────────────────────────────────────
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(监控模式):验证失败时收件方不做任何处理,只发送 DMARC 报告给您——适合刚开始配置时使用,观察有没有合法邮件被误判;p=quarantine(隔离模式):验证失败放入垃圾箱——适合稳定运行一段时间后升级,确认自己的 SPF/DKIM 配置完全正确;p=reject(拒绝模式):验证失败直接拒收——最安全,能有效防止域名仿冒,适合配置完全稳定后使用。推荐升级路径:先 none(观察 2 周)→ quarantine(观察 2 周)→ reject(最终状态)。期间通过 DMARC 报告邮件监控没有合法邮件被误判再升级。

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" 发现可疑活动。

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

不能简单说哪个更划算,取决于您的优先项:自建 Mailcow 的优势:数据完全自控(邮件内容不经过第三方)、无账号数量限制、可以深度定制反垃圾策略、长期成本低(VPS 费用 vs 企业邮年费)。劣势:维护成本高(更新、备份、信誉管理需要自己做)、国内收件率不如腾讯企业邮、有被列入黑名单的风险。腾讯/阿里企业邮 的优势:收件率高(尤其国内)、维护零成本、小团队(10人以下)免费。劣势:数据存在第三方服务器、功能受限、大规模团队付费不便宜。推荐组合:个人极客 / 隐私优先 → 自建 Mailcow;国内业务为主的企业 → 腾讯企业邮;国际业务为主 → 自建 + SendGrid 中转。

学完邮件服务器后,下一步应该怎么进阶?

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

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

Mailcow 内置了 acme.sh 自动申请和续期 Let's Encrypt 证书,全自动,无需手动操作。前提:① mail.yourdomain.com 的 A 记录已经解析到服务器 IP;② 80 端口可以被 Let's Encrypt 的服务器访问(用于 HTTP-01 验证)。如果 80 端口被 Nginx 占用,需要在 Nginx 中为 ACME 验证路径做特殊处理,或在 Mailcow 文档中启用"使用外部 ACME"模式。证书存储在 /opt/mailcow-dockerized/data/assets/ssl/,Mailcow 容器内所有服务(Postfix/Dovecot/Nginx)会自动使用同一套证书。可通过 docker compose logs -f acme-mailcow 查看证书申请和续期日志。