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

我想从我的应用程序中发送一封电子邮件,并且我已经编写了以下用于发送邮件的代码

    MailMessage msg = new MailMessage();

    msg.From = new MailAddress("mymailid");
    msg.To.Add("receipientid");
    msg.Subject = "test";
    msg.Body = "Test Content";
    msg.Priority = MailPriority.High;

    SmtpClient client = new SmtpClient();

    client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
    client.Host = "smtp.gmail.com";
    client.Port = 587;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.EnableSsl = true;
    client.UseDefaultCredentials = true;

    client.Send(msg);

我在本地主机上运行它,所以我在发送它时犯了什么错误。

当我发送按钮时,它会出现类似的错误

SMTP 服务器需要安全连接,或者客户端没有 认证。服务器响应是:5.5.1 身份验证 必需。

Web.config 文件中的代码

 <appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />   
    <add key="smtpServer" value="smtp.gmail.com" />
    <add key="EnableSsl" value = "true"/>
    <add key="smtpPort" value="587" />
    <add key="smtpUser" value="sender@gmail.com" />
    <add key="smtpPass" value="mypassword" />
    <add key="adminEmail" value="sender@gmail.com" />
  </appSettings>
  <system.net>
    <mailSettings>
      <smtp from="sender@gmail.com">
        <network host="smtp.gmail.com" password="mypassword" port="587" userName="sender@gmail.com"  enableSsl="true"/>
      </smtp>
    </mailSettings>
  </system.net>

我应该怎么做才能解决这个错误并发送邮件??

【问题讨论】:

标签: c# smtp


【解决方案1】:

就我而言,我面临着同样的问题。经过长时间的研究,不要将 UseDefaultCredentials 值设置为 false。因为 UseDefaultCredentials 的默认值为 false。

另一个关键点是在 client.send(message) 语句之前设置网络凭据。

错误代码:

SmtpClient client = new SmtpClient();
client.Host = ServerName; 
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = false;
client.Send(message);

错误代码:

SmtpClient client = new SmtpClient();
client.Host = ServerName; 
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = true;
client.Send(message);

正确代码

SmtpClient client = new SmtpClient();
client.Host = ServerName; 
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Port = Port;
client.EnableSsl = EnableSSL;
// client.UseDefaultCredentials = true;
client.Send(message);

正确代码

SmtpClient client = new SmtpClient();
client.Host = ServerName; 
client.Port = Port;
client.EnableSsl = EnableSSL;
client.UseDefaultCredentials = false;
var credentials = new System.Net.NetworkCredential(UserName, Password);
client.Credentials = credentials;
client.Send(message);

现在两个更正的代码都可以正常工作。所以在这种情况下,顺序很重要。

干杯!

【讨论】:

    【解决方案2】:

    在浏览了每个建议的解决方案后,我意识到正确的答案取决于您当前的服务器和电子邮件客户端情况。就我而言,我的 MX 记录指向我的本地出站服务器。此外,由于我使用 G Suite 而不是 Gmail 来发送通知电子邮件,因此我必须遵循以下配置:https://support.google.com/a/answer/2956491?hl=en

    话虽如此,我找到了正确的方法来完成这项工作,确实是首先从我的 G Suite 帐户配置 SMTP 中继服务:

    IPv6 地址是 MX 记录指向的网络服务器的地址(例如:1234:454:c88a:d8e7:25c0:2a9a:5aa2:104)。

    完成后,使用此代码补充解决方案:

     //Set email provider credentials
     SmtpClient smtpClient = new SmtpClient("smtp-relay.gmail.com", "587");                   
    
     smtpClient.EnableSsl = true;
     smtpClient.UseDefaultCredentials = true;
     
     MailAddress from = new MailAddress("username@yourdomain.com", "EmailFromAlias");
     MailAddress to = new MailAddress("destination@anydomain.com");
    
     MailMessage = new MailMessage(from, to);
    
     MailMessage.Subject = subject;
     MyMailMessage.Body = message;
    
     MyMailMessage.IsBodyHtml = false;
    
     smtpClient.Send(MyMailMessage);
    

    请注意,使用此方法,smtpClient.UseDefaultCredentials = true;而不是其他解决方案中建议的 false。此外,由于我们使用 IPv6 地址连接 SMTP 客户端,因此不需要指定用户名或密码。因此,在我看来,这是一种更安全、更安全的方法。

    【讨论】:

    • admin.google.com 仅用于 Google Workspace 帐户。普通 Gmail 帐户不能用于登录 admin.google.com
    【解决方案3】:

    如果: 1)用户或密码错误 2) 不启用 SSL 3)不太安全的应用程序未启用 4)您还没有使用此邮件登录服务器 5)你没有设置client.UseDefaultCredentials = false

    【讨论】:

      【解决方案4】:

      如果所有提到的解决方案都没有帮助,请尝试使用此 URL - 它帮助我解除阻止在我的网站上发送电子邮件

      https://g.co/allowaccess

      【讨论】:

        【解决方案5】:

        我也有同样的问题。

        我找到了这个解决方案:

        Google 可能会阻止来自不使用现代安全标准的某些应用或设备的登录尝试。由于这些应用和设备更容易被入侵,因此阻止它们有助于确保您的帐户更安全。

        一些不支持最新安全标准的应用示例包括:

        • 安装 iOS 6 或更低版本的 iPhone 或 iPad 上的邮件应用程序
        • Windows 手机上 8.1 版本之前的邮件应用程序
        • 某些桌面邮件客户端,例如 Microsoft Outlook 和 Mozilla Thunderbird

        因此,您必须在您的 Google 帐户中启用不太安全的登录(或不太安全的应用访问)。

        登录谷歌账号后,前往:

        https://www.google.com/settings/security/lesssecureapps

        https://myaccount.google.com/lesssecureapps

        在 C# 中,您可以使用以下代码:

        using (MailMessage mail = new MailMessage())
        {
            mail.From = new MailAddress("email@gmail.com");
            mail.To.Add("somebody@domain.com");
            mail.Subject = "Hello World";
            mail.Body = "<h1>Hello</h1>";
            mail.IsBodyHtml = true;
            mail.Attachments.Add(new Attachment("C:\\file.zip"));
        
            using (SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587))
            {
                smtp.Credentials = new NetworkCredential("email@gmail.com", "password");
                smtp.EnableSsl = true;
                smtp.Send(mail);
            }
        }
        

        【讨论】:

        • 这与确保在代码中启用 SSL 一起创造了奇迹,非常感谢
        • 感谢@mjb 分享答案。它救了我的命:)
        • 这应该是选择的答案
        • 这是我的问题,感谢您解决问题并给出更解释性的答案。
        • 也为我工作。谢谢@mjb
        【解决方案6】:

        应用密码帮助了我。

        1. 转到https://myaccount.google.com/security
        2. 向下滚动到“登录 Google”。
        3. 启用两步验证。
        4. 添加应用密码。
        5. 在您的代码中使用生成的密码。

        【讨论】:

        • 虽然此解决方案有效,但它会将电子邮件直接发送到垃圾邮件文件夹。请仔细检查。谢谢。
        【解决方案7】:

        我已经使用了in this question 的步骤,它对我有用。

        我的问题是 G Suite 认为我的密码不安全,更改后它可以正常工作。

        【讨论】:

          【解决方案8】:

          如果您在使用 Office 365 帐户时遇到此问题。在 Exchange Online 中,默认情况下,将为所有 Office 365 邮箱帐户禁用 SMTP 客户端身份验证。您必须为有问题的帐户手动启用 SMTP Auth 并再次检查案例。检查以下线程。

          https://morgantechspace.com/2021/01/the-smtp-server-requires-a-secure-connection-or-the-client.html

          https://docs.microsoft.com/en-us/exchange/clients-and-mobile-in-exchange-online/authenticated-client-smtp-submission

          【讨论】:

            【解决方案9】:

            我遇到了同样的问题,通过将密码更改为强密码解决了。

            【讨论】:

              【解决方案10】:

              我今天早上创建了一个Microsoft 365 Developer subscription (E5),并使用它使用以下设置发送测试电子邮件

              using (SmtpClient client = new SmtpClient())
              {
                  client.EnableSsl = true;
                  client.UseDefaultCredentials = false;
                  client.Credentials = new NetworkCredential(username, password);
                  client.Host = "smtp.office365.com";
                  client.Port = 587;
                  client.DeliveryMethod = SmtpDeliveryMethod.Network;
              
                  client.Send(msg);
              }
              

              一开始它不起作用,因为我不断收到此错误消息以及此代码引发的异常。然后,我花了大约 4 个多小时来使用 Microsoft 365 管理中心设置并阅读文章以找出问题所在。最终,我更改了我的 Microsoft 365 管理中心密码,它就像一个魅力。因此,在考虑任何高级解决方案之前,有必要在收到此消息时尝试更改密码。

              请注意,当我毫无问题地登录到我的 Microsoft 365 帐户时,密码肯定不是无效的。但是,密码更改解决了这个问题。

              【讨论】:

                【解决方案11】:

                我也面临这样的问题 'SMTP 服务器需要安全连接或客户端未通过身份验证。服务器响应是:5.5.0 Authentication Required' 然后浏览了很多互联网资料,但并没有完全帮助我。我是如何解决的

                step1:smtp.gmail.com 是 gmail 服务器,所以转到您的帐户 gmail 设置->点击查看所有设置->转发和 IMAP/POP->检查弹出和 imap 是否已启用,如果未启用它->保存变化。 step2-单击您的gmail个人资料图片->单击管理您的google帐户->转到安全选项卡->检查访问安全性较低的应用程序(如果您没有选择两步验证,则此选项可用)->默认情况下谷歌将其设置为禁用,使其能够使用您的真实 gmail 密码来发送电子邮件。 注意:-为不太安全的应用程序启用 gmail 访问,可能对您很危险,所以我不推荐这样做

                第 3 步:-如果您的帐户启用了两步验证,或者想要使用您的 gmail 真实密码以外的密码(使用应用程序特定密码),请尝试以下操作:- 单击您的 gmail 个人资料图片->单击管理您的 google 帐户->转到安全选项卡->搜索 APP PASSWORD->选择给定的任何应用程序名称->选择任何设备名称->单击生成->复制 16-数字密码并将其粘贴到您的应用中,您必须在其中输入 gmail 密码来代替您的真实 gmail 密码。

                【讨论】:

                  【解决方案12】:

                  如果您在测试环境中并且不想设置安全设置,则必须允许安全性较低的应用通过。 Gmail 中的此链接。

                  https://myaccount.google.com/lesssecureapps

                  【讨论】:

                    【解决方案13】:

                    我多次遇到同样的问题。启用不太安全的应用程序选项后,问题解决了。 从这里启用不太安全的应用程序:https://myaccount.google.com/lesssecureapps

                    希望这会有所帮助。

                    【讨论】:

                      【解决方案14】:

                      尝试启用允许不太安全的应用访问。

                      在这里,您可以在使用 Gmail 登录后启用安全性较低的应用。

                      https://myaccount.google.com/lesssecureapps

                      谢谢。

                      【讨论】:

                        【解决方案15】:

                        在转less secure option on 并尝试其他解决方案后,如果您仍然面临同样的问题,请尝试使用此重载:

                        client.Credentials = new NetworkCredential("mymailid", "mypassword");
                        

                        代替:

                        client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
                        

                        【讨论】:

                          【解决方案16】:

                          我已经搜索并尝试了几个小时的不同事物。总而言之,我必须考虑以下几点:

                          1. 使用smtp.gmail.com 代替smtp.google.com
                          2. 使用端口 587
                          3. 在设置凭据之前设置client.UseDefaultCredentials = false;
                          4. 打开Access for less secure apps
                          5. 设置client.EnableSsl = true;

                          如果这些步骤没有帮助,请查看answer
                          也许,你也可以在这个System.Net.Mail FAQ 上找到有用的东西。

                          【讨论】:

                          • 这个答案非常有用......解决了我的问题。非常感谢
                          • 如果仍然无法使用,请点击此链接g.co/allowaccess 并允许访问
                          • “访问安全性较低的应用程序”节省了我的时间。
                          • 这部分是为我做的:“为不太安全的应用打开访问权限”。谢谢!
                          • 安全性较低的应用程序的访问权限可能是您通过两个帐户登录并在另一个帐户上更改了它
                          【解决方案17】:

                          从此link 开启不太安全的应用程序,然后繁荣...

                          【讨论】:

                          • 这对我有用.. 这一定是公认的答案
                          【解决方案18】:

                          您应该考虑在配置文件中指定 SMTP 配置数据,并且不要在代码中覆盖它们 - 请参阅http://www.systemnetmail.com/faq/4.1.aspx 的 SMTP 配置数据

                          <system.net>
                                      <mailSettings>
                                          <smtp deliveryMethod="Network" from="admin@example.com">
                                              <network defaultCredentials="false" host="smtp.example.com" port="25" userName="admin@example.com" password="password"/>
                                          </smtp>
                                      </mailSettings>
                                  </system.net>
                          

                          【讨论】:

                            【解决方案19】:

                            首先检查 gmail 的安全相关问题。您可能在 gmail 中启用了双重身份验证。如果您收到任何安全警报,还请检查您的 gmail 收件箱。在这种情况下,请检查@mjb 的其他答案,如下所示

                            以下是我总是首先检查此类问题的非常普遍的事情

                            client.UseDefaultCredentials = true;
                            

                            将其设置为 false。

                            注意@Joe King 的answer - 您必须设置 client.UseDefaultCredentials 设置 client.Credentials

                            【讨论】:

                            • 在这种情况下,您应该共享您的代码。以上答案适用于有问题的代码
                            • 注意@Joe King 的回答 - 你必须设置 client.UseDefaultCredentials before 你设置 client.Credentials
                            • 这个答案行不通,我认为大多数人都面临着 gmail 方面的安全问题。请参阅 mjb 的答案以获得适当的解决方案
                            • 另外,确保“Captcha”被禁用 - 如果您在远程服务器上运行脚本,这可能是必要的(在本地计算机上运行时不需要):accounts.google.com/DisplayUnlockCaptcha
                            • 设置client.UseDefaultCredentials = false;在 client.Credentials 和设置 client.EnableSsl = true 之前;在我的情况下成功了。
                            【解决方案20】:

                            如果是新的 google 帐户,您必须通过常规用户界面发送电子邮件(第一个)。之后,您可以使用您的应用程序/机器人发送消息。

                            【讨论】:

                              【解决方案21】:

                              确保允许访问不太安全的应用程序。

                                      MailMessage mail = new MailMessage();
                                      mail.From = new MailAddress("xx@gmail.com");
                                      mail.Sender = new MailAddress("xx@gmail.com");
                                      mail.To.Add("external@emailaddress");
                                      mail.IsBodyHtml = true;
                                      mail.Subject = "Email Sent";
                                      mail.Body = "Body content from";
                              
                                      SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
                                      smtp.UseDefaultCredentials = false;
                              
                                      smtp.Credentials = new System.Net.NetworkCredential("xx@gmail.com", "xx");
                                      smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                                      smtp.EnableSsl = true;
                              
                                      smtp.Timeout = 30000;
                                      try
                                      {
                              
                                          smtp.Send(mail);
                                      }
                                      catch (SmtpException e)
                                      {
                                          textBox1.Text= e.Message;
                                      }
                              

                              【讨论】:

                              【解决方案22】:

                              一些 smtp 服务器(安全的)要求您同时提供用户名和电子邮件,如果它的 gmail 则很可能是您需要解决的“不太安全的登录”问题,否则您可以尝试:

                              public static void SendEmail(string address, string subject, 
                                  string message, string email, string username, string password, 
                                  string smtp, int port)
                              {
                                  var loginInfo = new NetworkCredential(username, password);
                                  var msg = new MailMessage();
                                  var smtpClient = new SmtpClient(smtp, port);
                              
                                  msg.From = new MailAddress(email);
                                  msg.To.Add(new MailAddress(address));
                                  msg.Subject = subject;
                                  msg.Body = message;
                                  msg.IsBodyHtml = true;
                              
                                  smtpClient.EnableSsl = true;
                                  smtpClient.UseDefaultCredentials = false;
                                  smtpClient.Credentials = loginInfo;
                                  smtpClient.Send(msg);
                              }
                              

                              请注意,来自的电子邮件和用户名是不同的,这与某些将它们称为相同的实现不同。

                              调用这个方法可以这样:

                              SendEmail("to-mail@gmail.com", "test", "Hi it worked!!", 
                                 "from-mail", "from-username", "from-password", "smtp", 587);
                              

                              【讨论】:

                                【解决方案23】:

                                确保在调用SmtpClient.UseDefaultCredentials = false之后设置SmtpClient.Credentials

                                顺序很重要,因为设置 SmtpClient.UseDefaultCredentials = false 会将 SmtpClient.Credentials 重置为 null。

                                【讨论】:

                                • 我已经找了半个小时的解决方案,你的是我在互联网上发现的唯一一个提到这个排序的小帖子。谢谢老兄。
                                • @Joe King 你真是太棒了……从 3 小时开始就一直在寻找这个 :)
                                • 谢谢@Joe King,这是 MS 文档中缺少的重要信息。这也是我使用用户名和密码发送问题的解决方案。
                                • 这很容易被忽略,但我刚刚发现顺序很重要。
                                • 是的。拯救了我的一天。您需要在设置凭据之前调用 UseDefaultCredentials = false。
                                【解决方案24】:

                                即使我将“UseDefaultCredentials”设置为 false,我也遇到了同样的问题。后来我发现根本原因是我在我的帐户中打开了“两步验证”。关掉之后问题就解决了。

                                【讨论】:

                                • 不要关闭两步验证。它的存在是有原因的。您可以在 GMail 设置中生成应用程序专用密码并在 SmtpClient 中使用该密码。你应该这样做,而不是暴露一个普通的密码。
                                【解决方案25】:

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

                                            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);
                                

                                您可以在Sending mail引用它

                                【讨论】:

                                  【解决方案26】:

                                  尝试登录您的 gmail 帐户。如果您使用 gmail SMTP 发送电子邮件,它会被锁定。我不知道在锁定之前您可以发送的电子邮件的限制,但是如果您登录一次,那么它会再次通过代码工作。 确保您的 webconfig 设置良好。

                                  【讨论】:

                                  • 确实是最佳答案!我再次登录,它工作! PS:我必须在 Google 上提供验证码
                                  • 我收到此错误,因为我的 Google 帐户受到双重身份验证的保护。我最终创建了一个专用帐户来发送电子邮件。
                                  【解决方案27】:

                                  试试这个方法,我只是做了一些轻微的改变:

                                  MailMessage msg = new MailMessage();
                                  
                                  msg.From = new MailAddress("mymailid@gmail.com");
                                  msg.To.Add("receipientid@gmail.com");
                                  msg.Subject = "test";
                                  msg.Body = "Test Content";
                                  //msg.Priority = MailPriority.High;
                                  
                                  
                                  using (SmtpClient client = new SmtpClient())
                                  {
                                      client.EnableSsl = true;
                                      client.UseDefaultCredentials = false;
                                      client.Credentials = new NetworkCredential("mymailid@gmail.com", "mypassword");
                                      client.Host = "smtp.gmail.com";
                                      client.Port = 587;
                                      client.DeliveryMethod = SmtpDeliveryMethod.Network;
                                  
                                      client.Send(msg);
                                  }
                                  

                                  如果您有邮件设置,请同时显示您的 app.config 文件。

                                  【讨论】:

                                  • 我还没有在里面配置。我应该在那里写什么?
                                  • 我的 mvc 应用程序中没有 app.config 文件。
                                  • 我尝试了许多其他解决方案,但只有这个有效。谢谢
                                  猜你喜欢
                                  • 1970-01-01
                                  • 2018-01-22
                                  • 2016-04-12
                                  • 2012-05-28
                                  • 2012-05-28
                                  相关资源
                                  最近更新 更多