簡體   English   中英

SMTP 服務器需要安全連接或客戶端未通過身份驗證。 服務器響應是:5.5.1 需要身份驗證?

[英]The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required?

我想從我的應用程序中發送一個 email 並且我已經編寫了以下代碼來發送郵件

    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>

我應該怎么做才能解決這個錯誤並發送郵件?

我也有同樣的問題。

我找到了這個解決方案:

Google 可能會阻止來自某些不使用現代安全標准的應用或設備的登錄嘗試。 由於這些應用程序和設備更容易被入侵,因此阻止它們有助於確保您的帳戶更安全。

一些不支持最新安全標准的應用程序示例包括:

  • 裝有 iOS 6 或更低版本的 iPhone 或 iPad 上的郵件應用
  • 8.1 版本之前 Windows 手機上的郵件應用程序
  • 一些桌面郵件客戶端,如 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);
    }
}

首先檢查 gmail 的安全相關問題。 您可能在 gmail 中啟用了雙重身份驗證。 如果您收到任何安全警報,請檢查您的 Gmail 收件箱。 在這種情況下,檢查@mjb 的其他答案如下

以下是我總是首先檢查此類問題的非常普遍的事情

client.UseDefaultCredentials = true;

將其設置為假。

注意@Joe King 的回答- 您必須在設置 client.Credentials之前設置 client.UseDefaultCredentials

確保調用SmtpClient.UseDefaultCredentials = false設置SmtpClient.Credentials

該順序很重要,因為設置SmtpClient.UseDefaultCredentials = false會將SmtpClient.Credentials重置為 null。

我已經搜索並嘗試了幾個小時的不同事情......總而言之,我必須考慮以下幾點:

  1. 使用smtp.gmail.com而不是smtp.google.com
  2. 使用端口 587
  3. 設置client.UseDefaultCredentials = false; 在設置憑據之前
  4. 打開安全性較低的應用程序訪問權限
  5. 設置client.EnableSsl = true;

如果這些步驟沒有幫助,請查看此答案
也許,您也可以在此System.Net.Mail 常見問題解答中找到一些有用的信息。

嘗試登錄您的 Gmail 帳戶。 如果您使用 gmail SMTP 發送電子郵件,它會被鎖定。 我不知道在被鎖定之前您可以發送的電子郵件的限制,但是如果您登錄一次,則它可以通過代碼再次運行。 確保您的 webconfig 設置良好。

試試這種方式,我只是做了一些輕微的改變:

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 文件。

從此鏈接打開安全性較低的應用程序並繁榮...

嘗試啟用允許不太安全的應用程序訪問。

在這里,您可以在使用 Gmail 登錄后啟用安全性較低的應用程序。

https://myaccount.google.com/lesssecureapps

謝謝。

在此處輸入圖片說明確保允許訪問不太安全的應用程序。

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

即使我將“UseDefaultCredentials”設置為 false,我也遇到了同樣的問題。 后來我發現根本原因是我在我的帳戶中打開了“兩步驗證”。 我關掉之后,問題就解決了。

下面是我的代碼。我也有同樣的錯誤,但問題是我給我的密碼錯誤。下面的代碼將完美運行..試試看

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

您可以在 發送郵件中重新提交

如果是新的 google 帳戶,則必須通過常規用戶界面發送電子郵件(第一個)。 之后,您可以使用您的應用程序/機器人發送消息。

您應該考慮在配置文件中指定 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>

我多次遇到同樣的問題。 啟用不太安全的應用程序選項后,問題解決了。 從這里啟用安全性較低的應用程序: https : //myaccount.google.com/lesssecureapps

希望這會有所幫助。

如果您在測試環境中並且不想設置安全設置,則必須允許安全性較低的應用程序通過。 Gmail 中的此鏈接。

https://myaccount.google.com/lesssecureapps

我今天早上創建了Microsoft 365 開發人員訂閱 (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 帳戶沒有任何問題時,密碼肯定無效。 然而,密碼更改解決了這個問題。

應用密碼幫助了我。

  1. 轉到https://myaccount.google.com/security
  2. 向下滾動到“登錄 Google”。
  3. 啟用兩步驗證。
  4. 添加應用密碼。
  5. 在您的代碼中使用生成的密碼。

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

在打開不太安全的選項並嘗試其他解決方案后,如果您仍然面臨同樣的問題,請嘗試使用此重載:

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

代替:

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

我遇到了同樣的問題,通過將密碼更改為強密碼來解決。

如果您使用 Office 365 帳戶遇到此問題。 在 Exchange Online 中,默認情況下,將對所有 Office 365 郵箱帳戶禁用 SMTP 客戶端身份驗證。 您必須為有問題的帳戶手動啟用 SMTP 身份驗證並再次檢查案例。 檢查以下線程。

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

我已經使用了這個問題中的步驟,它對我有用。

我的問題是 G Suite 認為我的密碼不強,更改后它運行良好。

如果所有提到的解決方案都沒有幫助,請嘗試使用此 URL - 它幫助我在我的網站上取消阻止電子郵件發送

https://g.co/allowaccess

這可能是以下情況:1)用戶或密碼錯誤 2)未啟用 SSL 3)未啟用不安全的應用程序 4)您尚未使用此郵件登錄服務器 5)您尚未設置 client.UseDefaultCredentials = false

在完成了每一個建議的解決方案之后,我意識到正確的答案取決於您當前的服務器和電子郵件客戶端的情況。 就我而言,我的 MX 記錄指向我的內部部署出站服務器。 此外,由於我使用 G Suite 而不是 Gmail 來發送通知電子郵件,因此我必須遵循以下配置: https : //support.google.com/a/answer/2956491?hl=en

話雖如此,我找到了使這項工作的正確方法,確實是首先從我的 G Suite 帳戶配置 SMTP 中繼服務:

SMTP_Relay 配置 G Suite

繼電器設置詳情

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 ; 而不是其他解決方案中建議的錯誤 此外,由於我們使用 IPv6 地址連接到 SMTP 客戶端,因此不需要指定用戶名或密碼。 因此,在我看來,這是一種更安全、更安全的方法。

就我而言,我面臨着同樣的問題。 經過長時間的研究,不要將 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);

現在它可以使用兩個更正的代碼正常工作。 所以在這種情況下,順序很重要。

干杯!

嘗試這種方式,並通過單擊此鏈接來啟用安全性較低的應用程序

        var fromEmail = new MailAddress("your@gmail.com", "Title");
        var toEmail = new MailAddress(emailID);
        var fromEmailPassword = "yourPassword"; 
         

        var smtp = new SmtpClient
        {
            Host = "smtp.gmail.com",
            Port = 587,
            EnableSsl = true,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            UseDefaultCredentials = false,
            Credentials = new NetworkCredential(fromEmail.Address, fromEmailPassword)
        };
            using (var message = new MailMessage(fromEmail, toEmail)
            {
                Subject = subject,
                Body = body,
                IsBodyHtml = true
            })

                smtp.Send(message);

自 2022 年 5 月 30 日起,Google 不再支持安全性較低的應用,因此您必須使用應用密碼

https://support.google.com/accounts/answer/6010255?authuser=1&hl=en-GB&authuser=1&visit_id=637957424028050444-425688120&p=less-secure-apps&rd=1

以下是通過 google 設置應用密碼的步驟: https://support.google.com/accounts/answer/185833?authuser=1

然后您需要為 smtpClient 的憑據使用 16 個字符的應用程序密碼:

smtpClient = new SmtpClient(emailHost)
{
     Port = port,
     DeliveryMethod = SmtpDeliveryMethod.Network,
     Credentials = new NetworkCredential(fromEmail, emailPassword),
     EnableSsl = true,
 };

emailpassword 應該是生成的 16 個字符的App Password

港口: 587

郵箱主機: smtp.gmail.com

然后是rest的代碼:

var mailMessage = new MailMessage{
                    From = new MailAddress(fromEmail),
                    Subject = "Yoursubject",
                    Body = $"Your body",
                    IsBodyHtml = true,
                };
                mailMessage.To.Add(newEmail);

                if (smtpClient != null)
                    smtpClient.Send(mailMessage);

出於安全原因,自 2021 年 5 月 30 日起,Google 已停止為不太安全的應用程序啟用訪問權限。因此,此處強調為不太安全的應用程序啟用訪問權限的一些答案已經過時。

這是我在 VB 論壇上找到的答案,它對我有用。 我能夠成功發送郵件。

"Please do following steps. In Google Account Activate 2-step verification. Select App Password in Google Account => Security => Signing to Google. In Select App Combo Select Other and Name as Windows App & Click Generate it. Copy Password and use它代替 email 密碼。它將起作用。

查看鏈接以查看更多答案。 https://www.vbforums.com/showthread.php?895413-Sending-Email-via-Gmail-change-for-May-30

向下滾動查看 microbrain 發布的答案

請參閱下面我發送郵件的代碼:

Dim emailTo As String = TxtEmail.Text.Trim()
        If emailTo.Length > 10 Then
            Try
                Dim Smtp_Server As New SmtpClient
                Dim e_mail As New MailMessage()
                Smtp_Server.UseDefaultCredentials = False
                Smtp_Server.Credentials = New Net.NetworkCredential("myemail@gmail.com", "***16-digit-code***")
                Smtp_Server.Port = 587
                Smtp_Server.EnableSsl = True
                Smtp_Server.Host = "smtp.gmail.com"

                e_mail = New MailMessage()
                e_mail.From = New MailAddress("myemailaddress@gmail.com")
                e_mail.To.Add(emailTo)
                e_mail.Subject = "Login OTP"
                e_mail.IsBodyHtml = False
                e_mail.Body = "some text here"
                Smtp_Server.Send(e_mail)
                MessageBox.Show("Your login OTP has been sent to " & emailTo)
                LblOTPSuccess.Visible = True
                TxtOTP.Visible = True
                BtnVerifyOTP.Visible = True
                TxtOTP.Focus()
            Catch error_t As Exception
                MessageBox.Show(error_t.ToString, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        Else
            MessageBox.Show("Email address is invalid or too short", "Invalid Email", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End If

請記住更改代碼中的參數以適合您。

我還面臨着“SMTP 服務器需要安全連接或客戶端未通過身份驗證”之類的問題。 服務器的響應是:需要 5.5.0 Authentication' 然后瀏覽了很多互聯網資料,但它並沒有完全幫助我。 我是如何解決它的

步驟 1:smtp.gmail.com 是 gmail 服務器,因此轉到您的帳戶 gmail 設置->單擊查看所有設置->轉發和 IMAP/POP->檢查 pop 和 imap 是否已啟用,如果未啟用它-> 保存更改。 第2步-單擊您的gmail個人資料圖片->單擊管理您的谷歌帳戶->轉到安全選項卡->檢查訪問不太安全的應用程序(如果您沒有選擇兩步驗證,此選項將可用)->默認情況下谷歌將其設置為禁用,使其啟用使用您的真實 gmail 密碼發送電子郵件。 注意:-為不太安全的應用程序啟用 Gmail 訪問權限,可能對您很危險,所以我不推薦這樣做

第 3 步:-如果您的帳戶啟用了兩步驗證或想要使用除 Gmail 以外的密碼使用應用程序特定密碼的真實密碼,請嘗試以下操作:- 單擊您的 Gmail 個人資料圖片-> 單擊管理您的 google 帳戶-> 轉到安全性選項卡-> 搜索應用程序密碼-> 選擇給定的任何應用程序名稱-> 選擇任何設備名稱-> 單擊生成-> 復制 16 位密碼並將其粘貼到您的應用程序中,您必須在其中輸入 Gmail 密碼來代替您真正的 Gmail 密碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM