服务器怎么搭建邮件服务器

结论: 自建邮件服务器的最小可用组合是 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 记录配合,缺一条都会显著降低投递率。下表是完整清单。

记录类型主机名示例值作用与说明
Amail.example.com203.0.113.10把邮件主机名指向服务器公网 IP,MX 必须指向主机名而非 IP
MXexample.com10 mail.example.com.告诉全世界"example.com 的邮件由这台机器接收",优先级数字越小越优先
SPF(TXT)example.comv=spf1 mx a ip4:203.0.113.10 -all声明哪些主机被授权以本域名发信,-all 表示其余全部拒绝
DKIM(TXT)default._domainkey.example.comv=DKIM1; k=rsa; p=MIGfMA0...公钥记录,收件方用它校验邮件签名未被篡改
DMARC(TXT)_dmarc.example.comv=DMARC1; p=quarantine; rua=mailto:dmarc@example.com声明校验失败时如何处理,并接收汇总报告
PTR(反向解析)10.113.0.203.in-addr.arpamail.example.comIP 反查域名,需向云厂商工单申请,多数厂商仅支持独享 IP

补充说明三点:

  • MX 不能指向 CNAME,必须指向 A 记录对应的主机名,这是 RFC 要求。
  • PTR 记录无法在域名解析商处自助添加,它属于 IP 地址的反向区域,必须在云厂商控制台申请或提交工单,且通常要求该 IP 为你独享。
  • SPF 的 -all 与 ~all:-all 是硬失败(直接拒收),~all 是软失败(标记为可疑)。建议稳定运行一段时间后再从 ~all 切换到 -all。

准备工作:主机名、端口与用户

第一步是把主机名与解析对齐,很多 DKIM 校验失败其实是主机名不匹配导致的。

bash
# 设置完全限定域名(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

第二步是确认端口策略。邮件服务器涉及的端口如下表,也是后续防火墙与安全组放行的依据。

端口协议用途是否对公网开放
25SMTP服务器之间中转投递入站开放,出站常被云厂商封禁
465SMTPS客户端隐式 TLS 提交建议开放
587Submission客户端 STARTTLS 提交(推荐)建议开放
143 / 993IMAP / IMAPS客户端收取邮件仅开放 993,明文 143 建议关闭
110 / 995POP3 / POP3S客户端收取邮件仅开放 995

第三步是创建邮箱用户。Postfix + Dovecot 使用系统用户作为邮箱账号,出于安全考虑应禁止其登录 Shell:

bash
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。

bash
sudo apt update
sudo apt install -y postfix postfix-pcre mailutils

核心配置在 /etc/postfix/main.cf,下面是可直接套用的最小生产配置:

bash
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 提交端口。默认该文件里这两段是被注释掉的,取消注释并确保参数如下:

bash
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 指向的套接字)。

bash
sudo apt install -y dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd

需要修改四个配置文件:

bash
# 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
  }
}
EOF

SSL 部分在 /etc/dovecot/conf.d/10-ssl.conf 中设置为强制加密:

bash
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 需要先在服务器上生成密钥对。

bash
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:

bash
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 上,并重启服务:

bash
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 内容):

text
; 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=s

DMARC 的 p 策略建议分三步走:先 p=none 观察两周报告,再改 p=quarantine,稳定运行一个月后切到 p=reject。

25 端口被封禁怎么办?

这是云服务器搭邮件服务器最现实的问题。判断是否被封只需要一条命令:

bash
# 从本机直接连 Gmail 的 25 端口,超时即说明被封
timeout 8 bash -c 'cat < /dev/null > /dev/tcp/smtp.gmail.com/25' && echo "25 OK" || echo "25 BLOCKED"

可选方案有三条,按推荐顺序排列:

  1. 提交端口 + 中继(首选):客户端走 587 连到你的 Postfix,Postfix 再把信交给中继服务商的 587 端口投递。配置 relayhost 即可:
bash
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
  1. 申请解封 25 出站端口:部分云厂商对实名认证且有一定消费记录的用户开放工单申请,但通常要求承诺不发垃圾邮件,且随时可能被回收。
  2. 使用 587 端口中继到支持备用端口的 MTA:少数中继服务提供 2525 端口作为 25 的替代。

收信不受影响:别人给你发信是对方连你的 25 入站端口,入站 25 一般是开放的,所以"收得到、发不出"是最典型的症状。