在个人站长管理 VPS 或公有云虚拟机时,经常会遇到一个棘手的问题:主机提供商(如 AWS、Azure、阿里云、腾讯云等)出于反垃圾邮件的目的,默认封锁了 TCP 25 端口(标准的 SMTP 端口)。这直接导致站点的注册验证、密码重置等邮件无法通过本地服务发送出去。
解决这个问题的标准且最可靠的方法是:放弃使用本地 MTA(Mail Transfer Agent)直接发送邮件,转而使用专业的第三方事务性邮件服务(Transactional Email Service Provider, ESP)作为中继(Relay),通过非标端口(如 587 或 465)发送邮件。
我们将使用 Postfix 作为本地邮件客户端,并配置它通过加密的 587 端口将所有邮件转发给外部 ESP(例如 SendGrid、Mailgun 或 AWS SES)。
实施步骤:使用 Postfix 转发至专业邮件服务
步骤一:获取外部 SMTP 凭证
首先,您需要在一家专业的邮件服务提供商处注册账号,并获取其 SMTP 发送凭证。大多数服务都提供免费或低成本的套餐,非常适合个人站长。
- 重要信息: 您需要记录以下三项信息:
- SMTP 服务器地址(例如 smtp.sendgrid.net)
- SMTP 端口(通常是 587)
- 用户名和密码(或 API Key)
步骤二:安装 Postfix 和 SASL 模块
我们需要安装 Postfix(用于处理邮件)和 libsasl2-modules(用于加密认证)。以下命令适用于 Debian/Ubuntu 系统:
# 更新系统并安装 Postfix 及 SASL 模块
sudo apt update
sudo apt install postfix libsasl2-modules -y
如果使用 CentOS/RHEL 系统:
sudo yum install postfix cyrus-sasl-plain -y
sudo systemctl enable --now postfix
步骤三:配置 Postfix 使用外部 SMTP 转发
编辑 Postfix 的主配置文件 /etc/postfix/main.cf,添加或修改以下关键配置,告诉 Postfix 使用外部服务器进行邮件中继,并使用 587 端口和 TLS 加密。
请将 smtp.externalprovider.com 替换为您实际的邮件服务商地址。
# 编辑主配置文件
sudo nano /etc/postfix/main.cf
# --- 在文件末尾添加以下配置 ---
# 1. 设置中继主机和端口 (通常是 587)
relayhost = [smtp.externalprovider.com]:587
# 2. 启用 SASL 认证
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
# 3. 启用 TLS 加密
smtp_use_tls = yes
smtp_tls_security_level = encrypt
# 如果遇到证书问题,可以尝试使用 dane 或 verify
# smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
# --- 配置结束 ---
步骤四:创建和保护认证文件
我们需要在 /etc/postfix/sasl_passwd 文件中存储您的外部 SMTP 服务的用户名和密码。
# 创建或编辑认证文件
sudo nano /etc/postfix/sasl_passwd
# 格式: [中继主机]:端口 用户名:密码
[smtp.externalprovider.com]:587 YOUR_SMTP_USERNAME:YOUR_SMTP_PASSWORD
配置完成后,需要使用 postmap 命令生成 Postfix 可读取的数据库文件,并设置严格的权限以保护密码:
# 生成 Postfix 数据库文件
sudo postmap /etc/postfix/sasl_passwd
# 严格设置权限,防止密码泄露
sudo chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
# 删除原始的纯文本密码文件(可选但推荐)
# sudo rm /etc/postfix/sasl_passwd
步骤五:重启 Postfix 服务并测试
应用新的配置并重启 Postfix。
sudo systemctl restart postfix
现在,您可以发送一封测试邮件,确认邮件是否能成功通过外部服务发送出去(如果您的系统还没有 mail 命令,可能需要先安装 mailutils 或 s-nail)。
# 安装 mailutils (Debian/Ubuntu)
sudo apt install mailutils -y
# 发送测试邮件
echo "恭喜,您的VPS已成功绕过25端口限制,并通过587端口发送邮件!" | mail -s "VPS邮件中继测试" your_recipient_email@example.com
检查 /var/log/mail.log (或 CentOS 上的 /var/log/maillog) 可以确认邮件是否被 Postfix 成功接受并转发给了外部中继服务器。
汤不热吧