C# .NET中使用SMTP及Gmail账户无法发送邮件问题
Gmail SMTP发送账户确认邮件失败解决方案
问题概述
发送账户确认邮件时遭遇SMTP相关错误,谷歌已移除原有的“允许不太安全的应用登录”功能,调整UseDefaultCredentials值和端口后问题仍未解决。
原代码(EmailSender.cs):
public bool SendEmail(string userEmail, string confirmationLink) { MailMessage mailMessage = new MailMessage(); mailMessage.From = new MailAddress("employmentlyy@gmail.com"); mailMessage.To.Add(new MailAddress(userEmail)); mailMessage.Subject = "Confirm your email"; mailMessage.IsBodyHtml = true; mailMessage.Body = confirmationLink; var emailPass = _config["emailPassword"]; SmtpClient client = new SmtpClient(); client.Credentials = new System.Net.NetworkCredential("employmentlyy@gmail.com", emailPass); client.DeliveryMethod = SmtpDeliveryMethod.Network; client.Host = "smtp.gmail.com"; client.UseDefaultCredentials = true; client.EnableSsl = true; client.Port = 587; try { client.Send(mailMessage); Console.WriteLine("Sent email!"); return true; } catch (SmtpFailedRecipientException ex) { // log exception } return false; }
核心问题与修复步骤
1. 代码配置顺序错误
UseDefaultCredentials必须在设置Credentials之前设为false,否则手动配置的凭据会被系统默认凭据覆盖,直接导致认证失败。
2. 谷歌SMTP认证方式变更
谷歌已淘汰“允许不太安全的应用登录”,当前需使用应用专用密码(前提是账号已开启两步验证):
修正后的代码
public bool SendEmail(string userEmail, string confirmationLink) { MailMessage mailMessage = new MailMessage(); mailMessage.From = new MailAddress("employmentlyy@gmail.com"); mailMessage.To.Add(new MailAddress(userEmail)); mailMessage.Subject = "Confirm your email"; mailMessage.IsBodyHtml = true; mailMessage.Body = confirmationLink; var emailPass = _config["emailPassword"]; // 此处需替换为应用专用密码 SmtpClient client = new SmtpClient(); // 先禁用默认凭据,再设置自定义认证信息 client.UseDefaultCredentials = false; client.Credentials = new System.Net.NetworkCredential("employmentlyy@gmail.com", emailPass); client.DeliveryMethod = SmtpDeliveryMethod.Network; client.Host = "smtp.gmail.com"; client.EnableSsl = true; client.Port = 587; try { client.Send(mailMessage); Console.WriteLine("Sent email!"); return true; } catch (SmtpFailedRecipientException ex) { // 建议补充详细日志,便于排查收件人相关问题 Console.WriteLine($"收件人验证失败: {ex.Message}"); } catch (Exception ex) { // 捕获所有SMTP相关异常,覆盖认证、连接等场景 Console.WriteLine($"SMTP服务错误: {ex.Message}"); } return false; }
备选方案:OAuth2认证
若无法开启两步验证,可使用OAuth2协议完成SMTP认证,需借助第三方库(如MailKit)实现,核心逻辑是获取谷歌OAuth2令牌后进行身份验证。
额外排查点
- 确认Gmail账号已开启IMAP/SMTP服务:进入Gmail设置→转发和POP/IMAP→开启IMAP访问
- 检查服务器或防火墙是否封禁了587端口
- 验证应用专用密码是否有效,未被泄露或过期
内容的提问来源于stack exchange,提问作者Aleksandar Hristov
相关产品推荐
相关产品推荐

