ASP.NET MVC调用SMTP发邮件需开放的出站端口及发送失败排查
SMTP发信问题解答
1. Windows防火墙出站端口要求
- 必须开放对应SMTP服务的出站端口,具体端口取决于你使用的加密模式:
- 未加密/STARTTLS模式:默认端口25,注意绝大多数云服务商默认封禁25端口的出站请求用于防范垃圾邮件
- SSL加密模式:默认端口465
- 部分服务商提供的替代STARTTLS端口:587
- 实际使用端口以你的SMTP服务提供商给出的官方说明为准。
2. 生产环境无报错但收件人收不到邮件的常见原因
- 出站请求被拦截:优先排查生产服务器的Windows防火墙出站规则、云服务商安全组、机房硬件防火墙是否封禁了对应的SMTP端口,很多拦截规则会静默丢弃数据包,不会给应用返回错误信息,所以不会触发异常
- 邮件被SMTP服务商判定为垃圾邮件:确认生产服务器的出口IP是否已经添加到发件人域名的SPF解析记录中,未备案/未登记的IP发信大概率会被SMTP服务商直接拒收但返回投递成功状态,不会触发应用异常
- 配置读取错误:生产环境IIS应用池的运行身份权限受限,确认应用读取的SMTP配置(发件人地址、鉴权账号密码、端口参数)和本地开发环境完全一致,避免因权限问题读取到错误的配置项
- 邮件进入非收件箱分类:让收件人检查垃圾邮件、推广邮件、订阅邮件文件夹,符合垃圾邮件特征的邮件不会进入主收件箱也不会返回报错
- 开启SMTP交互日志排查:在web.config中添加如下配置,输出完整的SMTP交互日志排查隐性问题:
<system.diagnostics> <sources> <source name="System.Net" tracemode="includehex" maxdatasize="1024"> <listeners> <add name="System.Net"/> </listeners> </source> </sources> <sharedListeners> <add name="System.Net" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\smtp-log\net.log" /> </sharedListeners> <switches> <add name="System.Net" value="Verbose"/> </switches> <trace autoflush="true"/> </system.diagnostics>
内容的提问来源于stack exchange,提问作者Mariam Nagy
相关产品推荐
相关产品推荐

