C# WinForms应用使用Gmail应用密码发送邮件失败求助
我来帮你搞定这个问题!你已经做了开启双重认证、创建应用密码这些关键步骤,但还是遇到了连接关闭的错误,咱们从几个方向排查:
1. 先确认应用密码的正确性
应用密码是16位无空格的字符串,创建的时候要注意选择对应的应用类型(比如「邮件」或者「其他(自定义名称)」),复制的时候别不小心带了空格或者换行。如果不确定,建议重新生成一个新的应用密码再试。
2. 检查SmtpClient的配置细节
你的代码看起来基本没问题,但有个细节可以再确认:UseDefaultCredentials 一定要在设置 Credentials 之前设为 false(你的代码顺序是对的,但如果顺序反了会导致认证失效)。另外,可以尝试添加一行代码强制启用TLS:
Smtp.EnableSsl = true; Smtp.TargetName = "STARTTLS/smtp.gmail.com"; // 新增这行
3. 排查网络/防火墙拦截
错误提示「连接被关闭」,很可能是本地防火墙、杀毒软件或者公司网络拦截了587端口。你可以尝试用命令行测试连通性:
telnet smtp.gmail.com 587
如果能连通会显示类似「220 smtp.gmail.com ESMTP」的信息;如果不通,就得调整防火墙规则或者换个网络试试。
4. 改用更稳定的MailKit库(推荐)
System.Net.Mail.SmtpClient 在.NET中已经被标记为过时,MailKit是更现代、更可靠的邮件库,对Gmail的支持更好。这里给你一个用MailKit发送邮件的示例代码:
using MailKit.Net.Smtp; using MimeKit; var message = new MimeMessage(); message.From.Add(new MailboxAddress("Sender", "...@gmail.com")); message.To.Add(new MailboxAddress("Recipient", "...@gmail.com")); message.Subject = "test"; message.Body = new TextPart("plain") { Text = "这是测试邮件内容" }; using (var client = new SmtpClient()) { client.Connect("smtp.gmail.com", 587, true); client.Authenticate("...@gmail.com", "你的应用密码"); client.Send(message); client.Disconnect(true); }
使用这个库需要先通过NuGet安装 MailKit 包。
另外补充:如果你的账号开启了「高级保护程序」,应用密码是无法使用的,这种情况就得改用OAuth2认证,但一般普通账号不会开启这个。
你遇到的错误信息:
System.Net.Mail.SmtpException: Failure sending mail. ---> System.IO.IOException: Unable to read data from the transport connection: The connection was closed.
你的原代码:
Smtp = new SmtpClient(); Smtp.UseDefaultCredentials = false; var NetworkCredentials = new NetworkCredential() { UserName = "...@gmail.com", Password = "..." }; Smtp.Port = 587; Smtp.EnableSsl = true; Smtp.Host = "smtp.gmail.com"; Smtp.Credentials = NetworkCredentials; MailMessage msg = new MailMessage(); msg.From = new MailAddress("...@gmail.com"); msg.To.Add("...@gmail.com"); msg.Subject = "test"; Smtp.Send(msg);
内容的提问来源于stack exchange,提问作者Maria

