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

C# .NET中使用SMTP及Gmail账户无法发送邮件问题

Gmail SMTP发送账户确认邮件失败解决方案

问题概述

发送账户确认邮件时遭遇SMTP相关错误,谷歌已移除原有的“允许不太安全的应用登录”功能,调整UseDefaultCredentials值和端口后问题仍未解决。

报错截图:
SMTP错误提示
谷歌功能移除提示

原代码(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认证方式变更

谷歌已淘汰“允许不太安全的应用登录”,当前需使用应用专用密码(前提是账号已开启两步验证):

  • 登录谷歌账号,开启两步验证
  • 进入应用专用密码页面,创建一个用于SMTP服务的专用密码
  • 将代码中_config["emailPassword"]对应的配置值替换为该专用密码

修正后的代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 09:10:28