You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 19:27:16