【问题标题】:Gmail Error :The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication RequiredGmail 错误:SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应是:5.5.1 Authentication Required
【发布时间】:2014-01-21 06:23:21
【问题描述】:

我正在使用以下代码发送电子邮件。该代码在我的本地机器上正常工作。但在生产服务器上我收到错误消息

var fromAddress = new MailAddress("mymailid@gmail.com");
var fromPassword = "xxxxxx";
var toAddress = new MailAddress("yourmailid@yourdoamain.com");

string subject = "subject";
string body = "body";

System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword)       
};

using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = subject,
    Body = body
})

smtp.Send(message);

在我的 Gmail A/c 上,我从生产服务器运行代码后收到了以下电子邮件

你好,

最近有人使用您的密码尝试登录您的 Google 帐户 mymailid@gmail.com。这个人正在使用这样的应用程序 作为电子邮件、客户端或移动设备。

我们阻止了登录尝试,以防这是劫机者试图 访问您的帐户。请查看登录尝试的详细信息:

2014 年 1 月 3 日星期五 13:56:08 点 UTC IP 地址:xxx.xx.xx.xxx (abcd.net.) 地点:Philadelphia PA, Philadelphia, PA, USA

如果您无法识别此登录尝试,则可能是其他人 试图访问您的帐户。您应该登录您的帐户并 立即重置您的密码。

重设密码

如果这是您,并且您无法访问自己的帐户, 完成以下所列的故障排除步骤 http://support.google.com/mail?p=client_login

此致,Google 帐户团队

【问题讨论】:

标签: c# .net smtp gmail


【解决方案1】:

当您尝试从代码发送邮件并发现错误“SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应为:5.5.1 需要身份验证”时,该错误可能由于以下情况而发生。

案例一:密码错误时

案例 2:当您尝试从某个 App 登录时

案例 3:当您尝试从您的时区/域/计算机以外的域登录时 (在大多数情况下,从代码发送邮件时都是这种情况)

每个都有解决方案

案例一的解决方法:输入正确的密码。

案例 2 的解决方案 1:通过以下链接访问安全设置 https://www.google.com/settings/security/lesssecureapps 并启用安全性较低的应用。这样您就可以从所有应用程序登录。

案例 2 的解决方案 2:(参见 https://stackoverflow.com/a/9572958/52277)启用双因素身份验证(也称为两步验证),然后生成应用程序专用密码。使用新生成的密码通过 SMTP 进行身份验证。

案例 3 的解决方案 1:(这可能会有所帮助)您需要查看活动。但由于最新的安全标准,查看活动将无济于事,该链接将无用。所以试试下面的案例。

案例 3 的解决方案 2:如果您将代码托管在生产服务器上的某处,并且您可以访问生产服务器,则将远程桌面连接到生产服务器并尝试登录一次从生产服务器的浏览器。 这将为登录谷歌添加例外,您将被允许从代码登录。

但如果您无权访问生产服务器怎么办。 尝试解决方案 3

案例 3 的解决方案 3:您必须为您的 google 帐户启用从其他时区/IP 登录。

要做到这一点,请点击链接 https://g.co/allowaccess 并通过单击继续按钮允许访问。

就是这样。干得好。现在您将能够从任何一台计算机和通过任何应用程序登录到您的 Google 帐户。

【讨论】:

  • 解决方案 2!你这个小美女!
  • 上面的lesssecureapps链接帮助了:)
  • 已尝试解决方案 2,打开安全性较低的应用程序 - 仍然出现相同的错误。然后,我尝试了解决方案 3,在生产服务器上登录 - 已解决。
  • 托管在 azure 上的站点需要遵循案例 3 的解决方案 3:帮助 g.co/allowaccess 的最终链接
  • 案例 3 的解决方案 2 - 对我来说就像一个魅力。谢谢。
【解决方案2】:

这通常发生在您尝试从不同时区或 IP 地址计算机登录时。您的生产服务器和您使用的邮件 ID 都在不同的时区。选择以下两种解决方案之一:

1) 通过远程访问登录生产服务器,并使用您的凭据登录一次 gmail。他们会要求确认,确认并退出。

或 2) 将 gmail 登录到您的本地计算机,按照此 Link 并选择 review this activity 并采取适当的措施。

【讨论】:

【解决方案3】:

这是一个安全问题。默认情况下,Gmail 会阻止自定义应用程序访问您的电子邮件帐户。您可以将其设置为接受来自您的应用程序的登录。

登录您的电子邮件后,CLICK HERE

这将带您到以下页面

【讨论】:

  • 另外,如果您有自定义域,用户首先需要由域管理员启用以允许访问不太安全的应用程序。如果您是域管理员,请转到以下链接以启用此admin.google.com/AdminHome#ServiceSettings/…
  • 这个答案很棒。它就像一个魅力。谢谢。
  • 虽然这对我来说是启用的,但它最初并没有工作。后来我把它关了,然后又打开了。关闭刷新页面然后打开后,这对我有用。
【解决方案4】:

今天花了几个小时在这里尝试每个解决方案后,我仍然无法克服这个确切的错误。我以这种方式使用了 gmail 很多次,所以我知道这很愚蠢,但我没有解决这个问题。我终于在我的案例中偶然发现了解决方案,所以我想我会分享。

首先,上面的大部分答案也是必需的,但就我而言,在创建SmtpClient 类时对代码进行排序很简单。

在下面的第一个代码 sn-p 中,注意 Credentials = creds 行的位置。即使您已正确设置其他所有内容,此实现也会生成此问题中引用的错误。

System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient
{
    Host = Emailer.Host,
    Port = Emailer.Port,
    Credentials = creds,
    EnableSsl = Emailer.RequireSSL,
    UseDefaultCredentials = false,
    DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
}

但是,如果您将 Credentials setter 调用移至底部,则电子邮件将正确发送。我没有对周围的代码进行任何更改...即...用户名/密码等。显然,EnableSSL, UseDefaultCredentials, or the DeliveryMethod 取决于首先设置的Credentials...我没有测试所有的数字虽然是哪一个。

System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient
{
    Host = Emailer.Host,
    Port = Emailer.Port,
    EnableSsl = Emailer.RequireSSL,
    UseDefaultCredentials = false,
    DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
    Credentials = creds
}

希望这有助于在将来帮助其他人免去一些麻烦。

【讨论】:

  • 在我的情况下,我遇到了和你一样的问题,重新排序代码,以便凭据最后一次为我工作。
  • 我不敢相信,但它奏效了!我启用了两步,因为不想启用不太安全的标志,但是直到我在发送之前将凭据放在最后,它才不想工作。难以置信!
  • 问题是在UseDefaultCredentials setter 中有这个代码:this.transport.Credentials = value ? (ICredentialsByHost) CredentialCache.DefaultNetworkCredentials : (ICredentialsByHost) null; 覆盖credentialsCredentials setter 设置。对我来说,它看起来像 SmtpClient 的错误
  • @TomaszMadeyski 这必须是答案而不是评论!那是我的问题...我怎么能认为如果我在构造函数上设置凭据然后再次分配给错误值 UseDefaultCredentials = false 它会覆盖凭据...疯了!但这发生了....谢谢youuuuu
【解决方案5】:

您需要从此处开启“允许安全性较低的应用” https://myaccount.google.com/lesssecureapps

【讨论】:

  • 是的,没错!
【解决方案6】:

您好,我遇到了同样的问题,

我做了什么来解决它。是打开不太安全的应用程序。 连接到我的 gmail 帐户后。我输入了这个链接:https://www.google.com/settings/security/lesssecureapps

然后我打开安全应用程序,它就可以工作了。 上面也说了

【讨论】:

  • 那么与above 答案的答案有何不同? 2015 年 1 月 12 日 10:36 将在您面前给出相同的答案。
【解决方案7】:

我有一个以前工作的代码现在会引发此错误。密码没有问题。也不需要将消息转换为 base64。事实证明,我需要执行以下操作:

  1. 关闭两因素身份验证
  2. 将“允许不太安全的应用”设置为开启
  3. 从生产服务器登录到您的 gmail 帐户
  4. 也去here 批准登录活动
  5. 在生产服务器中运行您的应用

工作代码

    public static void SendEmail(string emailTo, string subject, string body)
    {
        var client = new SmtpClient("smtp.gmail.com", 587)
        {
            Credentials = new NetworkCredential("youremail@gmail.com", "secretpassword"),
            EnableSsl = true
        };

        client.Send("youremail@gmail.com", emailTo, subject, body);
    }

关闭两因素身份验证

将“允许安全性较低的应用程序”设置为开启(同一页面,需要滚动到底部)

【讨论】:

    【解决方案8】:

    只需按照谷歌电子邮件中的步骤启用安全性较低的应用即可。

    【讨论】:

      【解决方案9】:

      我也遇到过同样的问题。当您打开两步验证 (MFA) 时会发生这种情况。 只需关闭两步验证即可解决您的问题。

      【讨论】:

      • 我没有为此帐户启用两步,因此遇到了这个问题。
      【解决方案10】:

      下面是我的代码。我也有同样的错误,但问题是我输入的密码错误。下面的代码将完美运行..试试吧

                  MailMessage mail = new MailMessage();
                  SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");             
                  mail.From = new MailAddress("fromaddress@gmail.com");
                  mail.To.Add("toaddress1@gmail.com");
                  mail.To.Add("toaddress2@gmail.com");
                  mail.Subject = "Password Recovery ";
                  mail.Body += " <html>";
                  mail.Body += "<body>";
                  mail.Body += "<table>";
                  mail.Body += "<tr>";
                  mail.Body += "<td>User Name : </td><td> HAi </td>";
                  mail.Body += "</tr>";
      
                  mail.Body += "<tr>";
                  mail.Body += "<td>Password : </td><td>aaaaaaaaaa</td>";
                  mail.Body += "</tr>";
                  mail.Body += "</table>";
                  mail.Body += "</body>";
                  mail.Body += "</html>";
                  mail.IsBodyHtml = true;
                  SmtpServer.Port = 587;
                  SmtpServer.Credentials = new System.Net.NetworkCredential("sendfrommailaddress.com", "password");
                  SmtpServer.EnableSsl = true;
                  SmtpServer.Send(mail);
      

      你可以参考my blog

      【讨论】:

      • 我正在使用在我的本地机器上运行但在服务器上不运行的相同代码。出现错误 SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应是:5.5.1 需要身份验证。.
      • 我联系了我的托管服务提供商,他们说:我们可以看到您配置了第三方 SMTP (smtp.gmail.com),这在我们的共享服务器环境中不支持。由于过度滥用邮件功能或垃圾邮件问题,不支持邮件功能。您可以使用 PHPMailer 发送电子邮件,这是非常流行且经常使用的。 但是我的网站是用 mvc c# 构建的,那么我该如何使用 phpmailer 呢?
      【解决方案11】:

      只需打开或gmail的设置。 见下图:

      【讨论】:

        【解决方案12】:

        对于部署到 Microsoft Azure 的应用程序,我遇到了同样的问题。

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

        首先,我在以下页面(以 gmail 用户登录)上批准了所有未知设备(一些来自爱尔兰的 IP 地址): https://security.google.com/settings/u/1/security/secureaccount

        我为客户端使用了以下设置:

        var client = new SmtpClient("smtp.gmail.com");
        client.Port = 587;
        client.EnableSsl = true;
        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential("my_user_name@gmail.com", "my_password"); 
        

        只有在我在 smtp-client 上设置以下属性后它才开始工作:

        client.TargetName = "STARTTLS/smtp.gmail.com";
        

        【讨论】:

          【解决方案13】:

          对我有用的是激活不太安全的应用程序的选项(我使用的是 VB.NET)

          Public Shared Sub enviaDB(ByRef body As String, ByRef file_location As String)
                  Dim mail As New MailMessage()
                  Dim SmtpServer As New SmtpClient("smtp.gmail.com")
                  mail.From = New MailAddress("from@gmail.com")
                  mail.[To].Add("to@gmail.com")
                  mail.Subject = "subject"
                  mail.Body = body
                  Dim attachment As System.Net.Mail.Attachment
                  attachment = New System.Net.Mail.Attachment(file_location)
                  mail.Attachments.Add(attachment)
                  SmtpServer.Port = 587
                  SmtpServer.Credentials = New System.Net.NetworkCredential("user", "password")
                  SmtpServer.EnableSsl = True
                  SmtpServer.Send(mail)
              End Sub
          

          所以登录到您的帐户,然后转到 google.com/settings/security/lesssecureapps

          【讨论】:

            【解决方案14】:

            Tomasz Madeyski 的评论解决了我的问题……他说 SetDefaultCredential 上存在一个错误,他说:

            “问题是在 UseDefaultCredentials setter 中有这个代码: this.transport.Credentials = value ? (ICredentialsByHost) CredentialCache.DefaultNetworkCredentials : (ICredentialsByHost) null; 它覆盖了 Credentials setter 设置的凭据。对我来说,它看起来像 SmtpClient 的错误”

            如果您将smtpClient.UseDefaultCredentials = false 放在设置凭据之后...此行设置为空这些凭据...

            【讨论】:

              【解决方案15】:

              2018 年 11 月,已尝试上述所有方法,但均未成功。

              以下是最终奏效的解决方案。不幸的是,它没有使用 SSL,但它可以工作!!!

              var fromAddress = new MailAddress(asd@asd.com, "From Name");
              var toAddress = new MailAddress("tosend@asd.com", "To Name");
              
              const string subject = "Subject";
              const string body = "Body";
              
              var smtp = new SmtpClient
              {
                  Host = "aspmx.l.google.com",
                  Port = 25,
                  EnableSsl = false
              };
              using (var message = new MailMessage(fromAddress, toAddress)
              {
                  Subject = subject,
                  Body = body
              })
              {
                  smtp.Send(message);
              }
              

              【讨论】:

                【解决方案16】:

                我尝试了这里找到的所有建议,从启用安全性较低的应用程序到尝试端口 587... 没有任何效果。最后我只是注释掉了UseDefaultCredentials = false这一行。如果我不碰那个布尔值,一切都会奏效。

                【讨论】:

                • 这里也一样..我不敢相信单行花了我一个小时!
                【解决方案17】:

                首先,我在 GoDaddy 中购买了域名,当我点击此链接时 https://www.google.com/settings/security/lesssecureapps 我没有选项,它显示这条消息“域管理员管理这些设置”,所以我去管理控制台https://admin.google.com/

                有这个选项

                然后出现我需要的选项

                【讨论】:

                  【解决方案18】:

                  我是商业用户的谷歌应用程序,我花了最后几个小时来处理这个问题,即使在设置了所有正确的设置(smtp、端口、enableSSL 等)之后也是如此。以下是对我和在尝试发送电子邮件时抛出 5.5.1 错误的网站有用的方法:

                  1. 登录到您的 admin.google.com
                  2. 点击安全
                  3. 点击基本设置
                  4. 滚动到“基本设置”框的底部,点击链接:“转到安全性较低的应用的设置”
                  5. 选择选项 #3:强制所有用户访问不太安全的应用程序(不推荐)
                  6. 按窗口底部的保存

                  完成此操作后,我来自网站的电子邮件表单再次正常工作。祝你好运!

                  【讨论】:

                    【解决方案19】:

                    您可能需要从 gmail 创建/生成特定的 APP 密码。 然后,您的应用程序或脚本将使用此新密码而不是您的常规密码。 您的常规密码仍然可以正常使用。

                    这就是为我做的。 我仍然使用相同的电子邮件帐户,但必须生成一个新的应用专用密码。

                    https://support.google.com/accounts/answer/185833?hl=en

                    基本上你可以在这里做: https://security.google.com/settings/security/apppasswords

                    【讨论】:

                      【解决方案20】:

                      如果您使用的是 gmail。

                      • 1-登录到您的帐户

                        2- 浏览此link

                        3- 允许安全性较低的应用:开

                      享受....

                      【讨论】:

                        【解决方案21】:

                        您应该禁止安全性较低的应用访问您的 Google 帐户

                        要做的事情:

                        https://myaccount.google.com/lesssecureapps

                        【讨论】:

                          【解决方案22】:

                          在等待 smtp.SendMailAsync(mail) 之前不要放断点;

                          :)

                          当它等待一个断点时,当我删除断点时它会给出这个错误

                          【讨论】:

                            【解决方案23】:

                            我确实看过很多想法,唯一的解决方案是这种方式(适用于不同的电子邮件提供商):

                                        try
                                    {
                                        ViewProgressbar("Try to connect mail-server...", progressBar1.Value = 20);
                                        string host = dsProvider.Rows[y]["POP_hostOut"].ToString();
                                        int port = int.Parse(dsProvider.Rows[y]["POP_portOut"].ToString());  //587
                                        string[] email = von1.Split('@');
                                        string userName = (dsProvider.Rows[y]["login"].ToString() == "email[0]@email[1]")? email[0]+"@"+email[1] : email[0];
                                        string password = layer.getUserPassword(listSender.SelectedValue.ToString());
                                        SmtpClient client = new SmtpClient(host, port);
                                        client.DeliveryMethod = SmtpDeliveryMethod.Network;
                                        client.UseDefaultCredentials = false;
                                        //A idea from MSDN but it not works. You got "The server response was: 5.5.1 Authentication Required."
                                        //System.Net.NetworkCredential myCreds = new System.Net.NetworkCredential(userName, password, host);
                                        //System.Net.CredentialCache cache = new System.Net.CredentialCache();
                                        //cache.Add(host, port, "NTLM", myCreds);
                                        ///cache.GetCredential(host, port, "NTLM");   //NTLM
                                        client.Credentials = new System.Net.NetworkCredential(userName, password);
                                        client.Host = host;
                                        client.Port = port;
                                        client.EnableSsl = true;
                                        client.Send(message);
                                        ViewProgressbar();
                                    }
                                    catch (SmtpException ex)...
                            

                            【讨论】:

                              【解决方案24】:

                              好吧,我想我迟到了,但试试这个,因为它对我有用。 从您要发送电子邮件的帐户登录后,转到此链接https://accounts.google.com/b/0/DisplayUnlockCaptcha

                              点击此链接后,您将看到类似这样的消息 -> " 作为安全预防措施,Google 可能会要求您在登录新设备或应用程序时完成此额外步骤。

                              要允许访问,请单击下面的继续按钮。 "

                              此消息下方将有一个继续按钮,您只需点击继续按钮即可开始

                              【讨论】:

                                【解决方案25】:

                                我使用了上述所有解决方案,但只有在我从 Gmail 设置 Link to Enable IMAP Access in gmail settings 启用 IMAP 访问后,它才终于奏效了

                                当然,其他解法中的点也是必须的。

                                【讨论】:

                                • 这对我没有帮助。启用 IMAP 只是让您能够阅读来自 Outlook、Thunderbird 等其他邮件客户端的 Gmail 电子邮件。
                                【解决方案26】:

                                换个主机试试,这是新的,我有这个配置的mozilla Thunderbird

                                Host = "smtp.googlemail.com"
                                

                                对我有用

                                【讨论】:

                                  猜你喜欢
                                  • 2017-02-17
                                  • 2012-05-28
                                  • 2015-05-01
                                  • 2015-05-18
                                  • 2014-11-08
                                  • 2016-05-16
                                  • 2013-10-31
                                  相关资源
                                  最近更新 更多