Gmail开启2FA用应用密码SMTP发信报net_io_connectionclosed错误
Gmail SMTP 应用密码发送失败排查方案
你遇到的System.IO.IOException: Unable to read data from transport connection: net_io_connectionclosed报错是SMTP握手阶段被Gmail服务端主动断开连接导致的,开启双重验证并创建应用密码后,账号侧不需要额外配置,问题全部来自连接参数不匹配或框架兼容问题,按以下要求配置即可正常发送:
- 必须严格匹配Gmail SMTP的官方接入参数
- 服务地址固定为
smtp.gmail.com,不能用其他地址 - 端口固定使用
587,Gmail已永久关闭25端口的未加密接入,走25端口会被直接拒连 - 必须开启
EnableSsl = true,使用STARTTLS模式加密连接 - 认证用户名填完整的Gmail邮箱地址(必须带
@gmail.com后缀),认证密码填你生成的16位应用密码,不要填账号原登录密码,输入时去掉应用密码显示的分隔空格
- 服务地址固定为
- 修复.NET Framework 4.0的TLS版本兼容问题(核心故障点)
.NET Framework 4.0默认仅启用SSL 3.0、TLS 1.0协议,而Gmail当前要求所有SMTP连接必须使用TLS 1.2及以上版本,协议版本不匹配时Gmail会直接断开TCP连接,不会返回SMTP层错误信息,和你看到的报错完全吻合。
修复方式很简单,在应用启动阶段或者Client类构造函数最开头,添加如下代码即可,不需要升级框架版本:// 启用TLS 1.2支持,.NET 4.0中Tls12枚举对应值为3072 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; - 其他排查项
- 生成应用密码时选择「其他(自定义名称)」类型,生成后立刻复制保存,页面关闭后无法再次查看该密码
- 确认本地出口网络没有封禁587端口,可通过
telnet smtp.gmail.com 587测试连通性,返回220开头的SMTP服务提示才代表网络连通正常 - 现有代码中
RefreshPort方法默认在关闭SSL时走25端口的逻辑对Gmail无效,接入Gmail时建议强制指定端口为587、强制开启SSL,避免参数误配置 - 不要给SmtpClient单独配置网络代理,使用系统默认代理即可,如果本地挂了全局代理,需要确认代理支持SMTP协议透传
内容的提问来源于stack exchange,提问作者Devend
相关产品推荐
相关产品推荐

