结论: 自建邮件服务器的最小可用组合是 Postfix(发信 / SMTP)+ Dovecot(收信 / IMAP、POP3),再在域名 DNS 上补齐 MX、SPF、DKIM、DMARC 与 PTR 反向解析来建立发信信誉。由于主流云厂商默认封禁 25 出站端口,实际部署必须改用 465/587 提交端口,或借助第三方中继(Relay)服务完成投递。
为什么自建邮件服务器比想象中难?
很多站长第一次搭邮件服务器的想法是"装个 Postfix 就能发信了",结果信是发出去了,却全部进了对方的垃圾箱,或者直接被拒收。原因在于邮件系统不是"能连通"就算成功,而是一场信誉博弈:收件方(Gmail、QQ 邮箱、Outlook)会检查你的 IP 是否在黑名单里、域名有没有 SPF 授权、邮件有没有 DKIM 签名、有没有声明 DMARC 策略、反向解析是否对得上。任何一项缺失,都会让你的邮件服务器发出的信被打折。
更现实的阻碍是端口。截至 2026 年,绝大多数公有云厂商(包括国内外主流云)对新开云服务器默认封禁 25 出站端口,原因是历史上大量垃圾邮件从云服务器发出。这意味着你的邮件服务器不能直接向公网 25 端口投递,只能通过 465/587 提交端口把信交给中继服务,再由中继代为投递。
所以搭建邮件服务器的正确顺序是:先规划 DNS 与端口策略,再装软件。本文以 Ubuntu 24.04 LTS + Postfix 3.8 + Dovecot 2.3 为例,假设域名为 example.com,邮件主机名为 mail.example.com。
邮件服务器需要配置哪些 DNS 记录?
先给结论:一封能被正常接收的邮件,背后至少需要 6 条 DNS 记录配合,缺一条都会显著降低投递率。下表是完整清单。
| 记录类型 | 主机名 | 示例值 | 作用与说明 |
|---|---|---|---|
| A | mail.example.com | 203.0.113.10 | 把邮件主机名指向服务器公网 IP,MX 必须指向主机名而非 IP |
| MX | example.com | 10 mail.example.com. | 告诉全世界"example.com 的邮件由这台机器接收",优先级数字越小越优先 |
| SPF(TXT) | example.com | v=spf1 mx a ip4:203.0.113.10 -all | 声明哪些主机被授权以本域名发信,-all 表示其余全部拒绝 |
| DKIM(TXT) | default._domainkey.example.com | v=DKIM1; k=rsa; p=MIGfMA0... | 公钥记录,收件方用它校验邮件签名未被篡改 |
| DMARC(TXT) | _dmarc.example.com | v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com | 声明校验失败时如何处理,并接收汇总报告 |
| PTR(反向解析) | 10.113.0.203.in-addr.arpa | mail.example.com | IP 反查域名,需向云厂商工单申请,多数厂商仅支持独享 IP |
补充说明三点:
- MX 不能指向 CNAME,必须指向 A 记录对应的主机名,这是 RFC 要求。
- PTR 记录无法在域名解析商处自助添加,它属于 IP 地址的反向区域,必须在云厂商控制台申请或提交工单,且通常要求该 IP 为你独享。
- SPF 的
-all与~all:-all是硬失败(直接拒收),~all是软失败(标记为可疑)。建议稳定运行一段时间后再从~all切换到-all。
准备工作:主机名、端口与用户
第一步是把主机名与解析对齐,很多 DKIM 校验失败其实是主机名不匹配导致的。
# 设置完全限定域名(FQDN)
sudo hostnamectl set-hostname mail.example.com
# 确认 /etc/hosts 中主机名与 IP 对应
sudo tee -a /etc/hosts <<'EOF'
203.0.113.10 mail.example.com mail
EOF
# 验证:hostname -f 必须输出 mail.example.com
hostname -f第二步是确认端口策略。邮件服务器涉及的端口如下表,也是后续防火墙与安全组放行的依据。
| 端口 | 协议 | 用途 | 是否对公网开放 |
|---|---|---|---|
| 25 | SMTP | 服务器之间中转投递 | 入站开放,出站常被云厂商封禁 |
| 465 | SMTPS | 客户端隐式 TLS 提交 | 建议开放 |
| 587 | Submission | 客户端 STARTTLS 提交(推荐) | 建议开放 |
| 143 / 993 | IMAP / IMAPS | 客户端收取邮件 | 仅开放 993,明文 143 建议关闭 |
| 110 / 995 | POP3 / POP3S | 客户端收取邮件 | 仅开放 995 |
第三步是创建邮箱用户。Postfix + Dovecot 使用系统用户作为邮箱账号,出于安全考虑应禁止其登录 Shell:
sudo useradd -m -s /usr/sbin/nologin admin
sudo passwd admin # 设置邮箱密码
# 生成 Dovecot 可用的密码哈希(可选,用于数据库认证场景)
doveadm pw -s SHA512-CRYPT第一步:安装并配置 Postfix 发信服务
Postfix 是 Linux 上最主流的邮件传输代理(MTA,Mail Transfer Agent),负责把邮件从本机发出去或投递到本地邮箱。安装时选择 Internet Site 类型,System mail name 填 example.com。
sudo apt update
sudo apt install -y postfix postfix-pcre mailutils核心配置在 /etc/postfix/main.cf,下面是可直接套用的最小生产配置:
sudo tee -a /etc/postfix/main.cf <<'EOF'
# --- 身份标识 ---
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
mydestination = $myhostname, $mydomain, localhost
inet_interfaces = all
inet_protocols = all
# --- 邮箱格式 ---
home_mailbox = Maildir/
mailbox_size_limit = 0
message_size_limit = 52428800
# --- 客户端提交认证(交给 Dovecot 的 SASL)---
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_tls_auth_only = yes
# --- TLS 证书(用 Let's Encrypt 签发的证书)---
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_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
# --- 收件限制,防止被当成开放中继 ---
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_rbl_client zen.spamhaus.org
EOF接着在 /etc/postfix/master.cf 中启用 587 与 465 提交端口。默认该文件里这两段是被注释掉的,取消注释并确保参数如下:
sudo tee -a /etc/postfix/master.cf <<'EOF'
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
EOF
sudo postfix check && sudo systemctl restart postfix注意:reject_unauth_destination 这一行绝对不能删,否则你的邮件服务器会变成开放中继(Open Relay),几小时内就会被垃圾邮件团伙发现并用于群发,IP 随即进黑名单。
第二步:安装 Dovecot 提供 IMAP 收信与 SASL 认证
Dovecot 负责两件事:让客户端能通过 IMAP/POP3 收取邮件;为 Postfix 提供 SASL 认证服务(即上面 smtpd_sasl_path = private/auth 指向的套接字)。
sudo apt install -y dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd需要修改四个配置文件:
# 1) 启用协议
sudo sed -i 's/^#protocols = .*/protocols = imap pop3 lmtp/' /etc/dovecot/dovecot.conf
# 2) 邮箱存储格式与位置,必须与 main.cf 的 home_mailbox 一致
sudo tee /etc/dovecot/conf.d/10-mail.conf <<'EOF'
mail_location = maildir:~/Maildir
mail_privileged_group = mail
EOF
# 3) 认证方式:启用明文机制但强制走 TLS
sudo tee /etc/dovecot/conf.d/10-auth.conf <<'EOF'
disable_plaintext_auth = yes
auth_mechanisms = plain login
!include auth-system.conf.ext
EOF
# 4) 为 Postfix 暴露 SASL 套接字
sudo tee /etc/dovecot/conf.d/10-master.conf <<'EOF'
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
EOFSSL 部分在 /etc/dovecot/conf.d/10-ssl.conf 中设置为强制加密:
sudo tee /etc/dovecot/conf.d/10-ssl.conf <<'EOF'
ssl = required
ssl_cert = 只要 587、465、993 三个端口处于 LISTEN 状态,邮件服务器的基础收发链路就通了。
第三步:配置 SPF、DKIM、DMARC 三件套
这三件事是投递率的生死线。SPF 和 DMARC 是直接加 TXT 记录,DKIM 需要先在服务器上生成密钥对。
sudo apt install -y opendkim opendkim-tools
sudo mkdir -p /etc/opendkim/keys/example.com
sudo opendkim-genkey -D /etc/opendkim/keys/example.com -d example.com -s default
sudo chown -R opendkim:opendkim /etc/opendkim生成的 default.txt 里就是需要发布的 TXT 记录内容,default.private 是私钥。接着配置 OpenDKIM:
sudo tee /etc/opendkim.conf <<'EOF'
Syslog yes
Mode sv
Canonicalization relaxed/simple
Selector default
MinimumKeyBits 1024
KeyTable refile:/etc/opendkim/key.table
SigningTable refile:/etc/opendkim/signing.table
InternalHosts 127.0.0.1, ::1
OversignHeaders From
Socket inet:8891@localhost
PidFile /run/opendkim/opendkim.pid
UserID opendkim
UMask 007
EOF
echo 'default %DOMAIN:default:/etc/opendkim/keys/example.com/default.private' \
| sudo tee /etc/opendkim/key.table
echo '*@example.com default' | sudo tee /etc/opendkim/signing.table
sudo systemctl restart opendkim最后把 OpenDKIM 挂到 Postfix 上,并重启服务:
sudo tee -a /etc/postfix/main.cf <<'EOF'
milter_protocol = 6
milter_default_action = accept
smtpd_milters = inet:127.0.0.1:8891
non_smtp_milters = inet:127.0.0.1:8891
EOF
sudo systemctl restart postfix opendkim
# 校验 DKIM 公钥是否已正确发布到 DNS
opendkim-testkey -d example.com -s default -vvv需要发布到域名解析商的三条 TXT 记录如下(把公钥串换成你自己的 default.txt 内容):
; SPF —— 主机名 @,类型 TXT
v=spf1 mx a ip4:203.0.113.10 -all
; DKIM —— 主机名 default._domainkey,类型 TXT
v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0B...(你的公钥)
; DMARC —— 主机名 _dmarc,类型 TXT
v=DMARC1; p=quarantine; pct=100; rua=mailto:dmarc@example.com; adkim=s; aspf=sDMARC 的 p 策略建议分三步走:先 p=none 观察两周报告,再改 p=quarantine,稳定运行一个月后切到 p=reject。
25 端口被封禁怎么办?
这是云服务器搭邮件服务器最现实的问题。判断是否被封只需要一条命令:
# 从本机直接连 Gmail 的 25 端口,超时即说明被封
timeout 8 bash -c 'cat < /dev/null > /dev/tcp/smtp.gmail.com/25' && echo "25 OK" || echo "25 BLOCKED"可选方案有三条,按推荐顺序排列:
- 提交端口 + 中继(首选):客户端走 587 连到你的 Postfix,Postfix 再把信交给中继服务商的 587 端口投递。配置
relayhost即可:
sudo tee -a /etc/postfix/main.cf <<'EOF'
relayhost = [smtp.relay.example]:587
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_tls_security_level = encrypt
smtp_tls_note_starttls_offer = yes
EOF
echo '[smtp.relay.example]:587 apikey:你的密钥' | sudo tee /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd
sudo systemctl restart postfix- 申请解封 25 出站端口:部分云厂商对实名认证且有一定消费记录的用户开放工单申请,但通常要求承诺不发垃圾邮件,且随时可能被回收。
- 使用 587 端口中继到支持备用端口的 MTA:少数中继服务提供 2525 端口作为 25 的替代。
收信不受影响:别人给你发信是对方连你的 25 入站端口,入站 25 一般是开放的,所以"收得到、发不出"是最典型的症状。
企业QQ咨询




