最近项目部署到 AWS EC2 后,发现系统发送邮件一直失败。程序没有任何改动,本地正常,服务器却始终发送失败。经过一系列排查,最终定位到了 AWS 默认限制 SMTP 25 端口 的问题。
本文记录整个排查过程,希望能帮助遇到同样问题的朋友。
问题现象
系统使用的是 Microsoft 365 邮箱发送邮件。
SMTP 配置如下:
程序报错:
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 端口。
希望这次排查记录能帮助你少走一些弯路。
评论交流
欢迎留下你的想法