在上一篇中,我们成功配置了 Postfix 与 Dovecot 的核心交互。但截至目前,我们的服务器主要还是通过 25 端口在服务器之间传输邮件。

        想要使用 Outlook、Thunderbird 或手机邮件 APP 发送邮件,我们需要开启标准的客户端提交端口:587 (Submission)465 (SMTPS),并强制启用 TLS 加密,确保密码和邮件内容在传输过程中不被窃听。

1. 配置 Postfix 开启加密端口

        Postfix 的多端口监听是由 /etc/postfix/master.cf 控制的。我们需要取消部分注释,开启专门给客户端用的“提交服务”。

        编辑 /etc/postfix/master.cf,找到 submissionsmtps 区域,修改如下(注意每行前面的空格缩进,格式非常重要):

# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (no)    (never) (100)
# ==========================================================================

# 启用 587 端口 (Submission) - 推荐用于 STARTTLS
submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_tls_auth_only=yes
  -o smtpd_reject_unlisted_recipient=no
  # 兼容性选项 (可选)
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

# 启用 465 端口 (SMTPS) - 推荐用于 SSL/TLS (Outlook/手机常用)
smtps     inet  n       -       n       -       -       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
  -o milter_macro_daemon_name=ORIGINATING

        修改完成后,重启 Postfix:

systemctl restart postfix

2. 开放防火墙

        客户端连接需要通过防火墙,我们需要放行对应的服务或端口。

# 放行 SMTP Submission (587) 和 SMTPS (465)
firewall-cmd --permanent --add-service=smtp-submission
firewall-cmd --permanent --add-service=smtps

# 如果你还需要 POP3S/IMAPS (995/993) 用于收信
firewall-cmd --permanent --add-service=imaps
firewall-cmd --permanent --add-service=pop3s

# 重载生效
firewall-cmd --reload

3. 关于 Cloudflare 与 SSL 证书的特殊说明

        很多站长习惯将域名托管在 Cloudflare 并开启“小黄云” (Proxy 模式) 以隐藏服务器真实 IP。这对 Web 服务很有用,但对邮件服务是致命的

3.1 为什么不能开“小黄云”?

  1. 端口限制:Cloudflare 的代理模式默认只转发 HTTP/HTTPS 端口,不转发 25, 465, 587, 993 等邮件端口。客户端连接时会直接超时。
  2. 证书不匹配:开启代理后,客户端看到的证书是 Cloudflare 的泛域名证书,而不是你服务器上的证书,会导致客户端报错“证书无效”或“中间人攻击警告”。

3.2 正确的做法

  1. DNS 设置:在 Cloudflare 后台,将 mail.yourdomain.com 的记录设置为 “仅 DNS (灰色云)”。这是必须的。
  2. 本地证书:服务器必须申请并配置真实的 Let's Encrypt 证书(我们在之前的文章中已经通过 acme.sh 完成了这一步,并配置到了 main.cf10-ssl.conf 中)。

4. 客户端连接测试

        现在,我们可以使用 Thunderbird (雷鸟) 或其他客户端进行连接了。

4.1 推荐配置

  • 收件服务器 (IMAP):

    • 主机名: mail.yourdomain.com
    • 端口: 993
    • SSL: SSL/TLS
  • 发件服务器 (SMTP):

    • 主机名: mail.yourdomain.com
    • 端口: 465
    • SSL: SSL/TLS
  • 用户名: 完整邮箱地址 (如 [email protected])
  • 密码: PostfixAdmin 中设置的密码

4.2 故障排查 (swaks)

        如果客户端连不上,可以在服务器上用 swaks 模拟客户端进行测试,这比看客户端模糊的报错信息要准确得多。

# 安装 swaks
yum install -y swaks

# 测试 587 端口登录发送
swaks --to 收件箱@qq.com \
      --from 发件人@你的域名.com \
      --server 127.0.0.1 --port 587 \
      --auth LOGIN --auth-user 发件人@你的域名.com \
      --header "Subject: Test from Port 587" \
      --body "This is a test email."

        如果 swaks 能发送成功,但你本地电脑连不上,请检查本地网络是否封禁了 25/465 端口,或者检查 Cloudflare 的 DNS 是否确实改为了“灰云”。

mail_11