问题根源:为什么需要 SMTP 服务器?
您的应用程序不能直接把邮件“扔”到对方的邮箱里,发送邮件需要一个专业的“中转站”来遵循复杂的邮件协议(SMTP),处理邮件的路由、排队、重试等。

这个“中转站”SMTP 服务器。
- 您的应用 -> SMTP 服务器 -> 收件人的邮件服务器 -> 收件人邮箱
您的目标服务器上没有这个“中转站”,所以发送邮件的尝试失败了。
解决方案(从推荐到备选)
根据您的需求(是偶尔发几封系统通知,还是大量发送营销邮件),有几种主流的解决方案。
使用第三方 SMTP 中继服务(强烈推荐,最简单通用)
这是最简单、最推荐的解决方案,尤其是对于大多数网站和应用,您不需要在服务器上安装任何东西,只需要将您的应用配置为使用一个外部的 SMTP 服务即可。

工作原理: 您的应用将邮件发送给第三方服务商的 SMTP 服务器,由他们负责将邮件成功投递到收件人邮箱。
主流服务商:
- SendGrid:非常流行的选择,有免费套餐(每天可发送数百封邮件),信誉度高,到达率有保障。
- Mailgun:功能强大,同样提供免费试用,开发者友好。
- Amazon SES (Simple Email Service):AWS 的服务,价格非常便宜,信誉度极高,是新项目的首选之一。
- 腾讯企业邮 / 阿里云企业邮箱:如果您有自己的域名,可以购买这些服务,它们也提供 SMTP 发信功能。
- Resend / Brevo (前身为 Sendinblue):新一代的邮件服务,API 友好,免费额度也足够。
操作步骤(以 SendGrid 为例):
- 注册并创建账号:前往 SendGrid 官网注册一个免费账号。
- 验证发件人域名:这是必须步骤,以证明您有权从这个域名发邮件,通常需要添加几条 DNS 记录到您的域名解析中。
- 获取 API Key 或 SMTP 凭据:
- API Key (推荐):现代的应用程序(Node.js, Python, PHP 等)通常使用 API Key 来调用 SendGrid 的 API 发送邮件,这种方式更灵活、更安全。
- SMTP 凭据:传统应用程序或需要配置传统邮件客户端时使用,您可以在 SendGrid 后台找到 SMTP 服务器地址(如
smtp.sendgrid.net)、端口(587 或 465)和您的用户名/密码。
- 修改您的应用程序配置:在您的应用代码或配置文件中,将 SMTP 相关的设置修改为 SendGrid 提供的信息。
示例配置 (以 WordPress 为例): 在 WordPress 的 设置 > 常规 中,将“电子邮件地址”设置为一个您在 SendGrid 上验证过的邮箱地址,然后安装并配置一个如 WP Mail SMTP 的插件,填入您的 SMTP 服务器信息:
- SMTP Host:
smtp.sendgrid.net - Encryption:
TLS - Port:
587 - Authentication:
Yes - SMTP Username: 您的 SMTP 用户名(通常是
apikey) - SMTP Password: 您的 SMTP 密码(即 SendGrid 生成的 API Key)
在服务器上自建 SMTP 服务器(适合特定需求)
如果您对邮件控制权要求极高,或者有大量内部邮件发送需求,可以考虑在服务器上自建 SMTP 服务器,但这不推荐用于对外发送营销邮件或重要通知,因为到达率低且容易被当作垃圾邮件。
常见软件:
- Postfix:功能强大、稳定、配置灵活,是 Linux 上最主流的 MTA(邮件传输代理)。
- Exim:同样非常流行,尤其是在 Debian/Ubuntu 系统中。
- Microsoft IIS SMTP Service:适用于 Windows Server。
优点:
- 完全的控制权。
- 无需向第三方付费(服务器资源成本除外)。
- 数据不经过第三方。
缺点:
- 配置复杂:需要学习相关软件的配置。
- 到达率是巨大挑战:您的服务器 IP 没有信誉,很容易被全球的邮件服务商(如 Gmail, Outlook)标记为垃圾邮件源,您需要做大量的反垃圾邮件工作(如配置 SPF, DKIM, DMARC 记录)。
- 维护成本高:需要持续监控服务器状态和邮件队列,处理发送失败和投递问题。
操作步骤(以在 Ubuntu 上安装 Postfix 为例):
- 安装 Postfix:
sudo apt update sudo apt install postfix
- 安装时进行配置:安装过程中会弹出一个配置向导。
- 选择 "Internet Site"。
- "System mail name" 填写您的域名(
mydomain.com)。
- 配置 Postfix:编辑主配置文件
/etc/postfix/main.cf。sudo nano /etc/postfix/main.cf
您可能需要修改
myhostname,mydomain,myorigin,inet_interfaces,mydestination等参数。 - 配置 SPF, DKIM, DMARC:这是确保邮件到达率的关键步骤。
- SPF:在您的域名的 DNS 中添加一条 TXT 记录,声明哪些 IP 地址有权代表您的域名发邮件。
- DKIM:为您的域名生成一对密钥,公钥添加到 DNS,私钥保存在服务器上,Postfix 使用它对邮件签名。
- DMARC:基于 SPF 和 DKIM 的策略,告诉收件人服务器如何处理不符合 SPF/DKIM 的邮件。
- 重启 Postfix 服务:
sudo systemctl restart postfix
- 配置您的应用:将应用的 SMTP 服务器指向
localhost(127.0.0.1),端口通常为25。
使用云服务商的邮件服务(如 AWS SES)
这可以看作是方案一和方案二的结合体,您在自己的服务器上安装一个“邮件代理”(如 Postfix),但将其配置为将所有邮件转发给云服务商的 SMTP 网关。
优点:
- 避免了复杂的邮件投递问题,因为信誉由云服务商提供。
- 比纯第三方服务(如 SendGrid)在成本上可能更有优势,尤其是在发送量巨大时。
- 保持了服务器架构的完整性。
缺点:
- 配置比直接使用 API 稍微复杂,需要配置本地 MTA。
- 需要在云服务商后台完成域名的验证和发送权限的申请(SES 的沙盒模式)。
操作流程:
- 在 AWS 控制台申请并验证 SES,获取 SMTP 凭据。
- 在服务器上安装并配置 Postfix。
- 修改 Postfix 的配置(通常是
transport_maps或relayhost参数),让它将所有出站邮件转发到 SES 的 SMTP 网关(email-smtp.us-east-1.amazonaws.com)。 - 重启 Postfix。
总结与建议
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 第三方 SMTP 中继 | 简单、快速、到达率高、有免费额度 | 每封邮件或按量付费,数据在第三方 | 绝大多数网站和应用(博客、电商、SaaS) |
| 自建 SMTP 服务器 | 完全控制、无额外服务费 | 配置复杂、到达率极低、维护成本高 | 内部系统通知、邮件实验室、有专业邮件运维团队的企业 |
| 云服务商 SMTP 网关 | 到达率高、成本可控、架构灵活 | 配置比方案一复杂 | 对成本敏感且发送量巨大的应用,希望保持自有邮件架构 |
给您的最终建议:
对于 99% 的情况,请直接选择方案一:使用第三方 SMTP 中继服务。
它能以最小的成本和精力,解决您的邮件发送问题,并确保您的用户能正常收到邮件,这是业界经过验证的最佳实践,只有在您有非常特殊的需求(例如严格的合规要求、内部系统间通信)时,才考虑方案二或三。
