【问题标题】:Can't auth to Gmail smtp via MailMessage & smtpClient无法通过 MailMessage 和 smtpClient 对 Gmail smtp 进行身份验证
【发布时间】:2012-02-01 22:57:28
【问题描述】:

我终其一生都无法弄清楚为什么这不起作用

SmtpClient smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    UseDefaultCredentials = false,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    Credentials = new NetworkCredential("myemail@gmail.com", "myGmailPasswordHere"),
    EnableSsl = true,
    Timeout = 10000
};


smtp.Send(mail);

我明白了:

SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.5.1 Authentication Required。

我刚刚将 EnableSsl 指定为 true,因此这不应该是安全连接方面的问题。

我从 localhost 运行它。是的,我输入身份验证的用户名和密码(我的 gmail 帐户凭据)是 100% 正确的。

【问题讨论】:

  • 你在web.config中声明了吗?
  • 不,现在只是硬编码。无论是否测试 web.config 都应该无关紧要。
  • 我已经编辑了我的答案让我知道它是否有效?
  • @CoffeeAddict 请检查答案并提供一个接受的答案,如果有的话。

标签: c# gmail smtpclient


【解决方案1】:

我知道这是一个老话题,但是……Google 已经更改了他们的安全设置。

我一直在为所有答案苦苦挣扎,直到我检查了我的电子邮件,其中包含来自 Google 的一封邮件,其中说“我们最近阻止了对您的 Google 帐户的登录尝试”。

这使我进入了这个页面: Google Account Security

在“访问安全性较低的应用程序”部分下,您可以允许从其他设备/应用程序访问您的帐户...例如您的 C# 应用程序。

请注意,不再有“特定于应用程序”的部分。

希望这对某人有所帮助...我刚刚失去了 30 分钟的生命...

【讨论】:

  • 这个答案应该得到更多的投票。有时我们也应该尝试更少投票的答案。我尝试了所有文章并在我尝试了stackoverflow.com/questions/32260/…中标记为答案的解决方案后真的放弃了我的意思是我没有知道哪里做错了。谢谢 Tiny。你的解决方案对我有用。
  • 这对我很有帮助。我不明白为什么这些信息不容易找到。
  • 如果我不想在我的 gmail 帐户中允许“不太安全的应用程序”,我需要在我的代码中进行哪些更改?
  • 如果您使用自己的域,则需要使用admin.google.com 设置2-step-verification或允许不太安全的应用程序跨度>
  • 我开启了允许不太安全的应用访问,但仍然出现间歇性问题。我不完全按照这个回复的建议去做。
【解决方案2】:

如果登录信息 100% 正确,您需要设置UseDefaultCredentials = false首先,然后设置您要使用的凭据Credentials = new NetworkCredential("myemail@gmail.com", "myGmailPasswordHere")

如果您先设置凭据,当您设置UseDefaultCredentials = false 时,这将使Credentials 属性变为null

这是有线的,但它发生在我身上。

在调用smtp.Send(message); 之前,调试您的代码并检查Credentials 属性是否为空。如果是这样,请尝试颠倒顺序。看来您的顺序正确,但如果它为 null,请不要使用内联初始化。

希望对你有帮助。

编辑:如果您使用两步验证,请确保您使用的是App Specific password

【讨论】:

  • 这确实有效。有同样的问题,这解决了我的问题。
  • 我今天在这上面花了 3 个小时...不敢相信这解决了它。
  • 天啊...花了大半天的时间尝试了几乎所有的事情。感谢您的回答!
  • 这对我不起作用,但我确实考虑过。如果仍然遇到问题,请尝试stackoverflow.com/a/25414099/2649883
  • 难以置信,但按此顺序可以正常工作 SmtpClient smtpClient = new SmtpClient(); smtpClient.UseDefaultCredentials = false; smtpClient.Credentials = new NetworkCredential(senderAddress,senderPassword); smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; smtpClient.Host = 主机; smtpClient.Port = 端口; smtpClient.EnableSsl = useSsl;返回 smtpClient;
【解决方案3】:

看起来 Gmail 需要应用程序专用密码(不是您的主密码)。

请调查一下:http://support.google.com/mail/bin/answer.py?hl=en&answer=1173270

我最近遇到了同样的问题。

【讨论】:

  • 非常感谢,这对我有用。使用来自here 的代码库,遵循this advice 以及我的应用程序生成的2-step verification Google 密码(不是我的常规 Gmail 密码),我能够从 C# 测试客户端发送电子邮件。我正在使用我的个人 Gmail 帐户在本地桌面上进行开发/测试,却忘记了我启用了 Gmail 的 2-step verification...所以这是我生命中的 2 个小时,我永远不会回来! :)
  • stackoverflow.com/a/25414099/2649883 工作正常。 gmail 中不再有特定于应用程序的部分
【解决方案4】:

这对我来说很好用

SmtpClient smtp = new SmtpClient
    {
        Host = "smtp.gmail.com",
        Port = 587,
        UseDefaultCredentials = false,
        DeliveryMethod = SmtpDeliveryMethod.Network,
        Credentials = new NetworkCredential("myid@gmail.com", "mypassword"),
        EnableSsl = true,
        Timeout = 10000
    };

    MailMessage message = new MailMessage();
    message.Body = "hello there";
    message.Subject = "hi!!";
    message.To.Add("myid@gmail.com");
    message.From = new MailAddress("myid@gmail.com");
    smtp.Send(message);

【讨论】:

    【解决方案5】:

    我之前遇到过这个问题,按照以下步骤解决了:

    1. 转到“我的帐户”设置。
    2. 点击“登录和安全”类别。
    3. 向下滚动到“关联的应用和网站”部分。
    4. 关闭“允许安全性较低的应用程序”选项。

    我刚刚关闭了这个选项,我的代码运行成功了。

    【讨论】:

      【解决方案6】:

      对我来说,解决方案需要 2 个“步骤”:

      • 先设置UseDefaultCredentials = false,然后设置我要使用的凭据Credentials = new NetworkCredential("myemail@gmail.com", "myGmailPasswordHere")。首先设置凭据,当我设置UseDefaultCredentials = false 时,会使凭据属性null
      • 在我的 Google 个人资料中允许安全性较低的应用。

      【讨论】:

        【解决方案7】:

        有如下回调。告诉System.Net忽略错误!

        在调用Send()之前添加这个

        ServicePointManager.ServerCertificateValidationCallback = 
            delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
            { return true; };
        
        smtp.Send(mail);
        

        【讨论】:

        • 那么不要吃...处理枚举。请告诉我们你得到了什么。
        【解决方案8】:
        <mailSettings>
                    <smtp from="youremail@gmail.com">
                        <network host="smtp.gmail.com" password="yourpassword" port="587" userName="username"/>
                    </smtp>
        </mailSettings>
        

        编辑:尝试在此之后添加此行 smtp.Credentials = Credentials

        Credentials = new NetworkCredential("myemail@gmail.com", "myGmailPasswordHere"),

        【讨论】:

        • 是的,我知道你可以这样做,但这并不能解释为什么我上面的硬编码魔法字符串(仅用于测试)不起作用。
        • 为什么?我已经在 smtpClient Credentials = new NetworkCredential("myemail@gmail.com", "myGmailPasswordHere") 的对象初始化程序中设置了它
        【解决方案9】:

        从运行在 Amazon AWS 主机上的 ASP.NET 应用程序访问 smtp.gmail.com 时遇到同样的问题。事实证明我的配置是正确的——它在另一台计算机上也可以正常工作——但 gmail 会拒绝我的登录尝试,因为我尝试从一个不寻常的位置登录。 我通过 Web 界面 (www.gmail.com) 登录到 gmail,并且必须回答验证码。之后就成功了。

        【讨论】:

          【解决方案10】:

          我的问题是我们的 gmail 帐户的域所有者禁用了“访问不太安全的应用程序”和两步身份验证。没有办法启用它,我什至看不到设置。所以我改用我的个人帐户进行了测试,结果很好。

          【讨论】:

            【解决方案11】:

            C# WPF 应用程序非常简单,只需按照以下步骤操作即可:

                   private void SendByGmail(string subject, string body, string recepientEmail, string MailMsgFrom, string MailMsgPass)
                    {
                        using (MailMessage mailMessage = new MailMessage())
                        {
                            mailMessage.From = new MailAddress(MailMsgFrom);
                            mailMessage.Subject = subject;
                            mailMessage.Body = body;
                            mailMessage.IsBodyHtml = true;
                            mailMessage.To.Add(new MailAddress(recepientEmail));
                            mailMessage.Priority = System.Net.Mail.MailPriority.High;
                            SmtpClient smtp = new SmtpClient();
                            smtp.Host = "smtp.gmail.com";
                            smtp.EnableSsl = true;
                            smtp.Timeout = 200000;
                            System.Net.NetworkCredential NetworkCred = new System.Net.NetworkCredential();
                            NetworkCred.UserName = MailMsgFrom;
                            NetworkCred.Password = MailMsgPass;
                            smtp.UseDefaultCredentials = true;
                            smtp.Credentials = NetworkCred;
                            smtp.Port = 587;
                            smtp.Send(mailMessage);
            
                        }
                    }
            

            之后你应该得到这样的错误

            smtpException   {"The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn more at"}   System.Net.Mail.SmtpException
            

            要解决这个问题,首先在网络浏览器中将您的电子邮件帐户登录到您的谷歌帐户。然后只需点击此链接Google Account Activity。然后,您将通过您的帐户获得最近的设备和活动。如果显示阻止您当前设备的当前活动。只需取消阻止即可。然后再次尝试发送电子邮件。
            谢谢

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-10-28
              • 1970-01-01
              • 2018-07-19
              • 2018-06-23
              • 1970-01-01
              • 2021-12-26
              • 2012-04-01
              • 2014-01-05
              相关资源
              最近更新 更多