DigitalOcean Droplet 为什么无法发送邮件——及解决方案(2026)
目录
问题:无法从 Droplet 发送邮件
许多 DigitalOcean 用户都遇到过同样的问题:即使 SMTP 配置正确,从 Droplet 上的网站或应用发送邮件仍然失败。根本原因不在代码或邮件服务器配置,而是因为 DigitalOcean 在平台网络层面上屏蔽了邮件端口。
- 即使代码中 SMTP 配置完全正确也会发生
- 这不是 Web 应用或邮件库的问题
- 这是平台级别的策略,适用于所有 Droplet,无自动例外
被屏蔽的端口
综合多次测试,DigitalOcean 默认在所有 Droplet 上屏蔽三个标准 SMTP 端口:25、465 和 587。这适用于普通 IP 和预留 IP 连接,即使将预留 IP 绑定到 Droplet,仍然会被屏蔽。
- 端口 25:标准未加密 SMTP(用于服务器间邮件传输)
- 端口 465:SMTP over SSL
- 端口 587:SMTP 提交(通常用于客户端发送邮件)
- 所有 Droplet 都被屏蔽,包括绑定预留 IP 的
为什么 DigitalOcean 要屏蔽这些端口
主要原因是防止滥用和垃圾邮件。廉价云提供商如果不限制端口 25,往往会被滥用者用来建立大量垃圾邮件服务器。这会导致整个提供商的 IP 段被列入黑名单,影响所有在同一 IP 范围内的合法用户。提前屏蔽是一种平台级别的保护措施。
- 防止 Droplet 被用作垃圾邮件发送服务器
- 保护平台上整个 IP 段的声誉
- 降低合法用户的 IP 被加入黑名单的风险
为什么不应该自己配置邮件服务器
即使成功解除端口屏蔽,DigitalOcean 本身也建议不要在 Droplet 上自建邮件服务器,因为保护邮件服务器的安全性和声誉是一项复杂且持续的工作。这涉及 SPF/DKIM/DMARC 配置和持续的 IP 声誉监管。
- 需要正确配置 SPF、DKIM、DMARC 以防邮件进入垃圾文件夹
- 必须持续监控 IP 声誉,防止被加入黑名单
- 消耗的服务器资源和维护时间比预期要多
解决方案:使用 SMTP 中继/Email API 服务
在实际使用中,最实用的解决方案是转向第三方邮件服务(Email-as-a-Service),而不是自建邮件服务器。这些服务已经处理好 IP 声誉、DKIM/SPF 和邮件投递率等问题,可以通过 API 或 SMTP 中继连接。开发者常用的提供商有 SendGrid、Mailgun、Postmark 和 Amazon SES。
- SendGrid、Mailgun、Postmark、Amazon SES——开发者常用的提供商
- 大多数提供免费套餐供中小型项目试用
- 通过 SMTP 中继(使用提供商的端口而非端口 25)或 API 连接
- 内置投递率管理、退信处理和打开统计分析
如何在 Droplet 上设置 SMTP 中继
无论选择哪个提供商,步骤大致相同:注册账户,获取 SMTP 凭证或 API 密钥,然后在应用的邮件配置中设置这些信息。对于 WordPress 使用插件、Laravel 使用 .env 文件、Node.js 应用使用环境变量,最后在投入生产前发送测试邮件。
- 向选定的 SMTP 中继提供商注册账户
- 复制 SMTP host/port/username/password 或 API 密钥到应用配置中
- 使用提供商要求的 DNS 记录验证您的域名,以获得更好的投递率
- 在部署到生产环境前始终发送测试邮件
向 DigitalOcean 支持团队申请解除端口屏蔽
综合多次测试,可以联系 DigitalOcean 支持团队申请解除 SMTP 端口屏蔽,但无法保证会批准,因为这需要逐案审查且属于平台级反垃圾邮件策略。实际上,大多数团队建议从一开始就使用 SMTP 中继服务以加快进程。
- 通过控制面板的支持工单联系支持
- 结果无法保证,因为这是平台级反垃圾邮件策略
- 审查过程可能比迁移到 SMTP 中继更耗时
- 如需快速解决,建议从一开始就使用第三方服务
替代端口选项
某些 SMTP 中继提供商支持 2525 等替代端口,以绕过云提供商通常屏蔽的端口。使用前应检查所选提供商的文档是否支持这个端口。
- 端口 2525 是某些提供商支持的替代选项
- 使用前必须检查提供商文档是否支持此端口
- 仍然需要通过第三方服务,不是直接解除端口 25 的屏蔽
部署邮件系统前的检查清单
投入生产前应检查所有项目,确保确认邮件或收据等关键交易邮件不会丢失。
- 确认使用 SMTP 中继或 Email API 而非自建邮件服务器
- 验证域名并按提供商要求配置 SPF/DKIM
- 在所有关键流程中测试实际邮件发送(注册、密码重置、收据)
- 设置邮件发送失败时的警报系统(bounce/failure webhook)