C# SmtpException邮件发送失败问题排查求助
邮件发送失败问题排查与解决方案
一、Gmail SMTP 失败的核心原因
- 你的问题完全和谷歌的政策变更相关:2022年5月后,谷歌不再支持仅用用户名+密码登录的第三方应用(即"低安全应用"),且开启两步验证的账户无法启用低安全应用选项。此时直接用账户密码作为SMTP凭证必然会触发"Authentication required"错误。
- 另外"Connection closed"异常大概率是因为你之前尝试过非587端口(比如465)但未正确配置SSL,或者多次失败触发了谷歌的安全拦截。
二、Gmail 场景的解决方案
要在开启两步验证的情况下使用Gmail SMTP,必须使用应用专用密码:
- 登录谷歌账户,进入「安全」设置
- 找到「应用专用密码」选项(需确保两步验证已开启)
- 生成一个针对邮件应用的专用密码,替换代码中的
password字段
三、其他SMTP服务器(smtp.poczta.onet.pl)超时问题排查
出现100秒超时,可能的原因:
- 你的网络环境(比如校园网、公司内网)拦截了对该服务器的SMTP请求
- 该服务器的587端口未开放,或者SSL/TLS配置有误
- 服务器需要额外的认证信息(比如特定的发件人域名绑定)
四、代码层面的优化建议
你的代码逻辑基本没问题,但有几个细节可以调整:
- 确保
UseDefaultCredentials = false的设置在Credentials赋值之前(当前代码顺序正确,但颠倒会导致凭证不生效) - 可以显式设置
client.Timeout(比如client.Timeout = 30000;,即30秒),避免过长时间等待 - 建议用
using语句包裹SmtpClient和MailMessage,确保资源正常释放:
protected void SendMessage(object sender, EventArgs e) { string to = "******@student.uj.edu.pl"; string from = "******@gmail.com"; string server = "smtp.gmail.com"; // 替换为生成的应用专用密码 string password = "你的应用专用密码"; using (MailMessage message = new MailMessage(from, to)) { message.Subject = TextBox1.Text; message.Body = $"{TextBox3.Text} otrzymane {DateTime.Now.ToString()} od: {TextBox2.Text}"; using (SmtpClient client = new SmtpClient(server, 587)) { client.UseDefaultCredentials = false; client.Credentials = new System.Net.NetworkCredential(from, password); client.DeliveryMethod = SmtpDeliveryMethod.Network; client.EnableSsl = true; client.Timeout = 30000; try { client.Send(message); TextBox3.Text = "Wysłano wiadmość!"; Button1.Enabled = false; } catch (Exception ex) { TextBox3.Text = $"Problem z wysłaniem wiadomości ({ex.ToString()})"; } } } }
内容的提问来源于stack exchange,提问作者Just_code
相关产品推荐
相关产品推荐

