最近项目部署到 AWS EC2 后,发现系统发送邮件一直失败。程序没有任何改动,本地正常,服务器却始终发送失败。经过一系列排查,最终定位到了 AWS 默认限制 SMTP 25 端口 的问题。

本文记录整个排查过程,希望能帮助遇到同样问题的朋友。


问题现象

系统使用的是 Microsoft 365 邮箱发送邮件。

SMTP 配置如下:

配置

SMTP Server

smtp.office365.com

用户名

xxx@company.com

密码

******

SSL

true

程序报错:

Unable to connect to the remote server

由于程序没有任何改动,因此第一反应是:

  • 网络问题?

  • Office365 故障?

  • AWS 防火墙?

  • SMTP 配置错误?

于是开始逐步排查。


第一步:验证 SMTP 587 是否正常

首先在服务器执行 PowerShell:

Test-NetConnection smtp.office365.com -Port 587

返回:

TcpTestSucceeded : True

说明:

  • DNS 正常

  • 网络正常

  • 可以访问 Office365 SMTP

  • 587 端口没有被拦截

因此可以排除:

  • Internet 不通

  • DNS 解析失败

  • Office365 故障


第二步:验证 SMTP 25

继续测试:

Test-NetConnection smtp.office365.com -Port 25

返回:

ComputerName           : smtp.office365.com
RemotePort             : 25
PingSucceeded          : True
TcpTestSucceeded       : False

说明:

虽然能够 Ping 通微软服务器,

但是:

TCP 25 无法建立连接。

这里开始怀疑:

是不是 AWS 限制了 SMTP?


第三步:PowerShell 实际发送邮件验证

为了验证是不是代码问题,

直接使用 PowerShell 自带命令:

$cred = Get-Credential

Send-MailMessage `
    -SmtpServer smtp.office365.com `
    -Port 25 `
    -UseSsl `
    -Credential $cred `
    -From xxx@company.com `
    -To xxx@company.com `
    -Subject "SMTP TEST" `
    -Body "Hello"

结果:

Send-MailMessage :
Unable to connect to the remote server

注意:

这里甚至还没有进入账号密码验证阶段。

说明:

SMTP TCP 连接都没有建立。


第四步:检查程序默认端口

查看程序源码:

client.Port = accountInfo.Port;

继续查看配置:

发现默认值竟然是:

0x19

很多人第一眼没反应过来。

实际上:

0x19 = 25

也就是说程序一直在连接:

smtp.office365.com:25

而不是:

smtp.office365.com:587

这也是为什么一直发送失败。


第五步:确认 AWS 安全组

第一反应就是:

是不是安全组没开放?

于是:

AWS Security Group

新增:

Outbound Rule

TCP

25

0.0.0.0/0

再次测试:

Test-NetConnection smtp.office365.com -Port 25

结果:

仍然失败。

说明:

不是 Security Group。


第六步:检查 Windows 防火墙

继续检查:

Windows Defender Firewall

Outbound Rule

允许 TCP 25

再次测试。

依旧:

TcpTestSucceeded : False

说明:

也不是 Windows 防火墙。


第七步:查阅 AWS 官方文档

最终查阅 AWS 官方说明,发现:

AWS 为了防止垃圾邮件,

默认会限制 EC2 实例访问外部 SMTP 25 端口。

官方明确说明:

EC2 默认限制出站 TCP 25(SMTP)流量。

也就是说:

即使:

  • 安全组放行

  • Windows 防火墙放行

  • NACL 放行

依然:

无法访问 SMTP 25。

如果业务必须使用 25,

需要提交 AWS Support Case 申请解除限制。


587 为什么可以?

再次测试:

Test-NetConnection smtp.office365.com -Port 587

结果:

TcpTestSucceeded : True

说明:

AWS 并没有限制:

587

实际上:

Microsoft 官方也推荐:

smtp.office365.com

Port 587

STARTTLS

而不是:

25

我的最终结论

整个排查下来,可以得到以下结论:

✅ 网络正常

✅ DNS 正常

✅ Office365 正常

✅ TLS 正常

❌ SMTP 25 被限制

不是程序问题,

也不是 Office365 问题,

而是:

AWS 默认限制 EC2 外发 SMTP 25。


建议排查流程

以后如果再次遇到 SMTP 无法发送,

建议按照下面顺序检查:

① DNS 是否正常

↓

② Test-NetConnection SMTP 587

↓

③ Test-NetConnection SMTP 25

↓

④ PowerShell Send-MailMessage

↓

⑤ 查看程序实际端口

↓

⑥ 检查 Security Group

↓

⑦ 检查 Windows Firewall

↓

⑧ 检查 AWS 是否限制 SMTP 25

如果必须使用 25

有两种解决方案:

方案一(推荐)

修改程序:

SMTP Server

smtp.office365.com

Port

587

SSL

Enable

无需申请 AWS 解封。


方案二

如果业务必须使用:

25

则需要:

向 AWS Support 提交

Request to Remove Email Sending Limitations

申请解除 EC2 SMTP 25 出站限制。


总结

很多开发人员看到 "Unable to connect to the remote server",第一反应都是程序 Bug。

但实际上,对于部署在 AWS 上的应用,这类问题更多时候是云平台网络策略导致的。

如果你的邮件服务器是 Microsoft 365(smtp.office365.com),建议优先使用 587 + STARTTLS。只有在确实需要 SMTP Relay 或历史系统兼容的场景下,才考虑使用 25 端口。

希望这次排查记录能帮助你少走一些弯路。