为什么个人站长需要自建邮件服务器
很多站长把网站跑起来了,却一直把域名邮箱、通知邮件外包给第三方服务。免费的邮箱转发服务限制多,发信频率稍微高一点就被限流,甚至直接把你的域名拉黑;自建邮局虽然前期折腾,但域名、发信频率、退信处理全部掌握在自己手里,还能顺带把网站的通知邮件、评论提醒、备份报告统一收进自己的邮箱。这篇文章以 Debian 12 为例,从 DNS 准备、Postfix 安装、Dovecot 收发,到 SPF、DKIM、DMARC 三层反垃圾认证,完整走一遍自建邮局的流程。
一、动手之前:DNS 与网络准备
邮件服务器对 DNS 的要求比网站严格得多。首先是 MX 记录,在域名解析里添加一条 MX 记录指向你的邮件服务器主机名,例如 mail.example.com,优先级填 10;再添加一条 A 记录把 mail.example.com 解析到服务器 IP。紧接着要配置 PTR 反解记录,也就是把服务器 IP 反查到 mail.example.com。PTR 需要联系你的服务器提供商在控制台设置,普通 DNS 面板改不了,这一步很多站长会漏掉,而 Gmail、Outlook 对 PTR 缺失的服务器几乎直接拒收。
端口方面,邮件服务需要开放 25(SMTP)、465(SMTPS)、587(Submission)、143/993(IMAP)。特别注意:很多云厂商默认封禁 25 端口,买服务器的时候要确认是否能解封,否则邮件只能发不能收。准备好域名和端口后,用 dig 验证一下 MX 记录是否生效。
二、安装 Postfix 与 Dovecot
Debian 上安装非常简单,apt 直接搞定。Postfix 负责 SMTP 收发,Dovecot 负责 IMAP/POP3 投递和认证。安装时 Postfix 会弹出配置向导,选择 Internet Site,填写你的域名即可,后面我们再手动改配置。
apt update apt install -y postfix dovecot-imapd dovecot-pop3d dovecot-lmtpd opendkim opendkim-tools swaks
装完先停掉服务,把所有配置一次性改好再启动,避免半成品状态被外界扫描到。
三、Postfix 基础配置
编辑 /etc/postfix/main.cf,核心配置如下。myhostname 必须是 MX 记录指向的主机名,myorigin 和 mydestination 都要包含你的主域名,这样发给 user@example.com 的邮件才会被本机接收。
myhostname = mail.example.com myorigin = example.com mydestination = $myhostname, example.com, localhost.localdomain, localhost inet_interfaces = all inet_protocols = ipv4 home_mailbox = Maildir/ smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem smtpd_tls_security_level = may smtp_tls_security_level = may smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth smtpd_sasl_auth_enable = yes
这里用 Dovecot 做 SASL 认证,Postfix 通过 Unix socket 调用。TLS 证书用 Let's Encrypt 签发,记得申请时带上 mail.example.com 这个域名。smtpd_relay_restrictions 是开放中继的闸门,必须加上 reject_unauth_destination,否则你的服务器会变成垃圾邮件发送机。
四、SPF:声明发信来源
SPF(Sender Policy Framework)用一条 TXT 记录声明哪些 IP 允许以你的域名发信。在 DNS 里为 example.com 添加 TXT 记录:
v=spf1 mx ip4:你的服务器IP -all
mx 表示 MX 记录指向的服务器可以发信,ip4 直接列出服务器 IP,-all 表示除此之外全部拒绝。这是最严格的写法,适合单服务器场景。配置完后用 dig TXT example.com 检查,也可以直接在 Postfix 里开启 SPF 检查防止别人冒用你的域名:
apt install -y postfix-policyd-spf-python
# main.cf 追加
policyd-spf_time_limit = 3600s
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
check_policy_service unix:private/policyd-spf五、DKIM:给邮件签名
SPF 只验证发信 IP,DKIM 则用非对称密钥给每封邮件签名,收件方用 DNS 里的公钥验签,能有效防止内容被篡改。先生成密钥对:
mkdir -p /etc/opendkim/keys/example.com opendkim-genkey -D /etc/opendkim/keys/example.com -d example.com -s mail chown -R opendkim:opendkim /etc/opendkim
生成后把 /etc/opendkim/keys/example.com/mail.txt 里的 TXT 记录内容(去掉引号和转义符)添加到 DNS,主机名是 mail._domainkey.example.com。然后配置 opendkim.conf 和 Postfix 的 milter 接入:
# /etc/opendkim.conf Mode sv SubDomains no Canonicalization relaxed/simple Socket inet:8891@localhost SigningTable refile:/etc/opendkim/signing.table KeyTable refile:/etc/opendkim/key.table # /etc/opendkim/signing.table *@example.com default._domainkey.example.com # /etc/opendkim/key.table default._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private # main.cf 追加 milter_default_action = accept milter_protocol = 2 smtpd_milters = inet:localhost:8891 non_smtpd_milters = inet:localhost:8891
六、DMARC:告诉对方怎么处理失败邮件
DMARC 是建立在 SPF 和 DKIM 之上的策略层,用一条 TXT 记录告诉收件方:SPF/DKIM 都没通过时,邮件是投递、隔离还是拒收。为 _dmarc.example.com 添加 TXT 记录:
v=DMARC1; p=quarantine; rua=mailto:admin@example.com; ruf=mailto:admin@example.com; adkim=s; aspf=s
p=quarantine 表示验签失败的邮件进垃圾箱,等运行稳定后再升级成 p=reject。rua 接收聚合报告,建议先用这个策略观察一两周,看正常邮件的通过率,再逐步收紧。
七、Dovecot 接收配置
编辑 /etc/dovecot/conf.d/10-mail.conf,把邮箱格式设为 Maildir:
mail_location = maildir:~/Maildir
再配置 10-master.conf 里 Postfix 认证用的 socket,以及 10-auth.conf 启用登录认证。之后创建系统用户并设置密码,这个用户就是你的邮箱账号:
useradd -m -s /usr/sbin/nologin admin passwd admin
如果网站需要 info@、admin@ 这类通用地址,或者家里几个人共用邮箱,可以用别名功能。编辑 /etc/aliases 添加映射,再执行 newaliases 生效:
# /etc/aliases info: admin admin: admin, someone@example.com
Dovecot 侧建议开启邮箱配额,防止某个账号把磁盘塞满:在 10-mail.conf 里启用 quota 插件,配置好默认配额后,超出限制的账号会自动收到退信提示。另外,如果你有多个域名都要收信,把第二个域名加进 Postfix 的 mydestination,并为每个域名单独生成 DKIM 密钥和签名表条目,不然第二域名的邮件会因为签名不匹配被对方拒收。
重启所有服务,用 ss -tlnp 确认 25、587、993 端口都在监听。
八、发信测试与问题排查
用 swaks 从本机发一封测试邮件,验证整条链路:
swaks --to 你的gmail@gmail.com --from admin@example.com \ --server localhost --port 587 --auth LOGIN \ --auth-user admin --auth-password 密码 \ --header "Subject: 邮局测试" --body "自建邮局发信测试"
发出去后到 Gmail 里查看邮件原文,重点看 Authentication-Results 头,正常应看到 spf=pass、dkim=pass、dmarc=pass。如果被拒收,常见原因按顺序排查:PTR 反解缺失、IP 信誉差(新 IP 或机房 IP 段被滥用过)、SPF 记录写错、DKIM 公钥没生效。每次改完 DNS 用 dig 确认再重发,别急着反复重试,垃圾邮件评分会越试越高。
九、日常维护
邮件队列是自建邮局最容易忽略的部分。postqueue -p 查看积压,postsuper -d ALL 清空卡死的队列;日志看 /var/log/mail.log,配合 grep 过滤关键字;再把 mailq 长度和队列年龄加进监控脚本,超过阈值就告警。域名和 DKIM 密钥还有有效期,证书到期前记得续期,否则 TLS 失效后 Gmail 会直接拒收。用户邮件都存放在 Maildir 目录里,这个目录要纳入磁盘监控,配合前面配置的配额一起用,防止某个大附件把磁盘塞满导致整站故障。证书续期可以交给 cron 定时执行 certbot renew,续期成功后自动重启 Postfix 和 Dovecot 加载新证书,全流程无需人工干预。
十、MTA-STS 与 TLS-RPT:进阶加分项
SPF、DKIM、DMARC 解决的是身份认证,MTA-STS 解决的是传输加密:它通过一条 TXT 记录声明"本域只接受强制 TLS 的邮件",防止邮件在传输途中被降级成明文。配置分为两步,先为 mta-sts.example.com 添加 TXT 记录:
v=STSv1; id=20260831
再在 https://mta-sts.example.com/.well-known/mta-sts.txt 放一个策略文件,内容指定 mx: mail.example.com 和 mode: enforce。TLS-RPT 则是收 TLS 报告用的,为 _smtp._tls.example.com 添加 TXT 记录指向报告邮箱。这两项不是必须,但对提升域名信誉、进入 Gmail 的严格发件人标准有帮助,属于锦上添花。
十一、安全加固与防暴力破解
邮件服务器的 25/587 端口暴露在公网,是暴力破解的重灾区。首先在 Dovecot 和 Postfix 的日志上挂 fail2ban,连续认证失败自动封禁来源 IP:
apt install -y fail2ban # /etc/fail2ban/jail.local [dovecot] enabled = true logpath = /var/log/mail.log maxretry = 5 bantime = 3600 [postfix-sasl] enabled = true logpath = /var/log/mail.log maxretry = 5 bantime = 3600
同时关闭 Postfix 的用户枚举探测:main.cf 里加 disable_vrfy_command = yes,并开启 smtpd_helo_required。如果你的网站其实不需要接收外部来信,只通过 587 发信,那就在防火墙里把 25 端口只放行特定来源,公网一律拒绝,攻击面直接少一大半。另外,Dovecot 的认证日志要定期检查,异常时间段的多次失败登录往往是扫描器在试探弱口令。
十二、退信解读与国内邮箱互发
自建邮局必然遇到退信,学会读退信比反复重发重要得多。常见的退信代码:550 5.1.1 User unknown 是收件人不存在;421 4.4.2 是对方服务器繁忙或连接超时,稍后自动重试即可;554 5.7.1 基本是 IP 信誉或认证问题,需要对照邮件头里的 Authentication-Results 逐项检查 spf、dkim、dmarc 哪个没通过。发给 QQ 邮箱、网易邮箱时,国内服务商对境外机房 IP 段比较敏感,首封邮件进垃圾箱是常态,不要频繁重发拉低评分,坚持正常发送一段时间,信誉养起来后自然进收件箱。判断自己是否被拉黑,可以用对方的收件人邮箱给自己发一封测试信,然后查看投递状态。
结语
自建邮局的核心不是把 Postfix 装起来,而是把 SPF、DKIM、DMARC 这三层认证做扎实,外加 PTR 反解这个很多教程不会提的细节。前期可以先用 p=quarantine 观察,确认正常邮件零误杀后再收紧策略。邮件系统一旦稳定,域名邮箱、通知邮件、退信监控就全部自给自足,对个人站长来说是一次一劳永逸的投入。