C#使用Gmail App Password发邮件报net_io_connectionclosed异常求助
Gmail SMTP发信报连接关闭错误排查方案
按以下优先级逐一排查即可解决问题:
- 校验应用专用密码(App Password)有效性
- 确认账号两步验证已完成全部验证流程,不是待生效状态;如果是企业/教育版Workspace账号,需要管理员在后台开启应用专用密码权限后才能生成使用。
- 填入代码的16位密码必须是连续无空格的字符串,谷歌生成密码时默认按4位一组加空格分隔,复制后要手动删除所有空格再填入。
- 刚生成的密码需要等待2-3分钟待谷歌后台同步权限后再测试,立刻使用会触发认证失败断开连接。
- 修复C#代码配置问题
- 低版本.NET Framework(4.7及以下)默认使用TLS 1.0协议,Gmail已经完全拒绝TLS 1.0/1.1的连接请求,必须在初始化SmtpClient前强制指定高版本TLS协议。
SmtpClient的属性赋值顺序有要求:必须先配置服务器地址、端口、SSL开关、默认凭证开关,最后再赋值网络凭证,提前赋值凭证会被默认配置覆盖。- 你使用的自定义
Email封装类可能在内部重写SmtpClient配置,建议先用.NET原生的发信逻辑测试连通性,排除封装代码的干扰。
- 排查网络连通性问题
- 能正常收邮件不代表发件端口连通:收信走IMAP/POP3的993/995端口,发信走SMTP的587端口,需要确认本地/部署服务器的防火墙、安全组没有封禁587端口的出站连接,内网环境常见网关拦截SMTP端口导致连接被直接重置。
修正后的可直接测试的代码如下:
// .NET Framework 4.7及以下版本必须加这行,.NET Core 3.0/.NET 5+可省略 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; SmtpClient smtpClient = new SmtpClient(); // 严格按顺序配置属性,不要随意调换顺序 smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.EnableSsl = true; smtpClient.Host = "smtp.gmail.com"; smtpClient.Port = 587; smtpClient.UseDefaultCredentials = false; // 第二个参数填无空格的16位App Password smtpClient.Credentials = new NetworkCredential("你的Gmail邮箱地址", "16位应用专用密码"); // 先用原生MailMessage测试,排除自定义封装类的问题 MailMessage testMail = new MailMessage(); testMail.From = new MailAddress("你的Gmail邮箱地址"); testMail.To.Add(customerEmail); testMail.Subject = "Test subject"; testMail.Body = "Test Body"; try { smtpClient.Send(testMail); // 发信成功逻辑 } catch (Exception ex) { AppLogger.LogError(ex.Message + Environment.NewLine + ex.ToString()); return false; }
如果原生代码测试发信成功,说明问题出在你自定义的objSendMail.SendEmail方法内部,检查封装逻辑是否覆盖了SmtpClient的正确配置即可。
内容的提问来源于stack exchange,提问作者DfrDkn
相关产品推荐
相关产品推荐

