Serwer SMTP wymaga bezpiecznego połączenia lub klient nie został uwierzytelniony. Odpowiedź serwera brzmiała: 5.5.1 Czy wymagane jest uwierzytelnienie?

110

Chcę wysłać e-mail z mojej aplikacji i napisałem następujący kod do wysyłania poczty

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

Używam go na hoście lokalnym, więc jaki błąd robię, aby go wysłać.

Kiedy wysyłam przycisk, wyświetla się błąd, taki jak

Serwer SMTP wymaga bezpiecznego połączenia lub klient nie został uwierzytelniony. Odpowiedź serwera: 5.5.1 Wymagane uwierzytelnienie.

Kod w pliku 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="[email protected]" />
    <add key="smtpPass" value="mypassword" />
    <add key="adminEmail" value="[email protected]" />
  </appSettings>
  <system.net>
    <mailSettings>
      <smtp from="[email protected]">
        <network host="smtp.gmail.com" password="mypassword" port="587" userName="[email protected]"  enableSsl="true"/>
      </smtp>
    </mailSettings>
  </system.net>

co powinienem zrobić, aby rozwiązać ten błąd i wysłać wiadomość?

Abhay Andhariya
źródło
Myślę, że być może będziesz musiał również spojrzeć na tę odpowiedź: stackoverflow.com/a/9572958/1136253
mrbengi
Miałem ten sam problem. sprawdź [ten post] [1] [1]: stackoverflow.com/a/20186909/709340
Moslem Hady
Powinieneś rozważyć określenie danych konfiguracyjnych SMTP w pliku konfiguracyjnym i nie nadpisywać ich w kodzie - patrz dane konfiguracji SMTP na systemnetmail.com/faq/4.1.aspx
Michael Freidgeim

Odpowiedzi:

62

Najpierw sprawdź problemy związane z bezpieczeństwem Gmaila. Być może włączyłeś podwójne uwierzytelnianie w Gmailu. Sprawdź również skrzynkę odbiorczą Gmaila, jeśli otrzymujesz alerty bezpieczeństwa. W takich przypadkach sprawdź inną odpowiedź @mjb, jak poniżej

Poniżej znajduje się bardzo ogólna rzecz, którą zawsze najpierw sprawdzam pod kątem takich problemów

client.UseDefaultCredentials = true;

ustaw go na false.

Zwróć uwagę na odpowiedź @Joe Kinga - musisz ustawić client.UseDefaultCredentials przed ustawieniem klienta.

Ronak Patel
źródło
2
W takim przypadku powinieneś udostępnić swój kod. Powyższa odpowiedź dotyczy omawianego kodu
Ronak Patel
7
Uwaga @Joe King's odpowiedź - musisz ustawić client.UseDefaultCredentials przed ustawieniem client.Credentials
Aaron
1
Ta odpowiedź nie zadziała, myślę, że większość ludzi miała do czynienia z bezpieczeństwem po stronie Gmaila. zobacz odpowiedź mjb na właściwe rozwiązanie
Jerry Liang,
2
Upewnij się również, że opcja „Captcha” jest wyłączona - może to być konieczne, jeśli uruchamiasz skrypt na serwerze zdalnym (nie jest to konieczne w przypadku uruchamiania na komputerze lokalnym): accounts.google.com/DisplayUnlockCaptcha
Jens
3
Setting client.UseDefaultCredentials = false; przed client.Credentials i ustawienie client.EnableSsl = true; załatwił sprawę w moim przypadku.
Stackowane
140

Mam ten sam problem.

Znalazłem takie rozwiązanie:

Google może blokować próby logowania z niektórych aplikacji lub urządzeń, które nie korzystają z nowoczesnych standardów zabezpieczeń. Ponieważ te aplikacje i urządzenia są łatwiejsze do włamania, zablokowanie ich pomaga zwiększyć bezpieczeństwo konta.

Oto przykłady aplikacji, które nie obsługują najnowszych standardów bezpieczeństwa:

  • Aplikacja Mail na iPhonie lub iPadzie z systemem iOS 6 lub starszym
  • Aplikacja Mail na telefonie z systemem Windows w wersji starszej niż 8.1
  • Niektóre stacjonarne klienty pocztowe, takie jak Microsoft Outlook i Mozilla Thunderbird

Dlatego musisz włączyć mniej bezpieczne logowanie (lub dostęp do mniej bezpiecznych aplikacji ) na swoim koncie Google.

Po zalogowaniu się na konto Google przejdź do:

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

W C # możesz użyć następującego kodu:

using (MailMessage mail = new MailMessage())
{
    mail.From = new MailAddress("[email protected]");
    mail.To.Add("[email protected]");
    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 protected]", "password");
        smtp.EnableSsl = true;
        smtp.Send(mail);
    }
}

-------------------
Informacje udostępnione przez Michaela Freidgeima w obszarze komentarzy poniżej:
Podobna odpowiedź ze zrzutami ekranu https://stackoverflow.com/a/32457468/52277

mjb
źródło
1
To wraz z zapewnieniem, że SSL był włączony w kodzie, zdziałało cuda, wielkie dzięki
Crouch
1
Niż @mjb za udostępnienie odpowiedzi. To ratuje mi życie :)
Mayeed
3
to powinna być wybrana odpowiedź
thatOneGuy
2
To był mój problem, dziękuję za przejście przez problem i udzielenie bardziej wyjaśniającej odpowiedzi.
Bojan
U mnie też zadziałało. Dzięki @mjb
Rajbir Jawanda
44

Upewnij się, że ustawiłeś SmtpClient.Credentials po telefonie SmtpClient.UseDefaultCredentials = false.

Kolejność jest ważna, ponieważ ustawienie SmtpClient.UseDefaultCredentials = falsezostanie zresetowane SmtpClient.Credentialsdo wartości null.

Joe King
źródło
2
Szukałem rozwiązania tego problemu przez pół godziny, twój jest jedynym małym postem w internecie, w którym znalazłem, który wspomina o zamawianiu tego. Dzięki stary.
4
@Joe King Jesteś po prostu niesamowitym kumplem ..... szukałeś tego od 3 godzin :)
Jatin
1
Dziękuję @Joe King, że brakuje istotnych informacji w dokumentach MS. To było również rozwiązanie mojego problemu z wysyłaniem z nazwą użytkownika i hasłem.
Aaron,
1
Łatwo to przeoczyć, ale kolejność jest ważna, jak właśnie się dowiedziałem.
GatesReign
1
Tak. uratował mój dzień. musisz wywołać UseDefaultCredentials = false przed ustawieniem poświadczeń.
Rendel
33

Szukałem i próbowałem różnych rzeczy godzinami. Podsumowując, musiałem wziąć pod uwagę następujące punkty:

  1. Użyj smtp.gmail.comzamiastsmtp.google.com
  2. Użyj portu 587
  3. Ustaw client.UseDefaultCredentials = false;przed ustawieniem poświadczeń
  4. Włącz dostęp dla mniej bezpiecznych aplikacji
  5. Zestaw client.EnableSsl = true;

Jeśli te kroki nie pomogły, sprawdź tę odpowiedź .
Być może znajdziesz też coś przydatnego w tym FAQ System.Net.Mail .

Ułożone
źródło
1
Ta odpowiedź jest bardzo przydatna ... rozwiązała mój problem. Wielkie dzięki
Hari
1
jeśli nadal nie działa, przejdź do tego linku g.co/allowaccess i zezwól na dostęp
Portekoi
1
„Dostęp do mniej bezpiecznych aplikacji” uratował mój dzień.
Romil Kumar Jain
1
Ta część zrobiła to za mnie: „Włącz dostęp dla mniej bezpiecznych aplikacji”. Dzięki!
Tadej
11

Spróbuj zalogować się na swoje konto Gmail. blokuje się, jeśli wysyłasz e-maile przy użyciu Gmaila SMTP. Nie znam limitu e-maili, które możesz wysłać, zanim zostanie zablokowany, ale jeśli zalogujesz się raz, to działa ponownie z kodu. upewnij się, że ustawienia webconfig są dobre.

Shuchita Bora
źródło
Najlepsza odpowiedź! Zalogowałem się ponownie i zadziałało! PS: Musiałem dostarczyć captcha w Google
Bellash,
Otrzymałem ten błąd, ponieważ moje konto Google jest chronione za pomocą uwierzytelniania dwuskładnikowego. Skończyło się na utworzeniu dedykowanego konta do wysyłania wiadomości e-mail.
MvdD
8

Spróbuj w ten sposób, właśnie wprowadziłem kilka drobnych zmian:

MailMessage msg = new MailMessage();

msg.From = new MailAddress("[email protected]");
msg.To.Add("[email protected]");
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("[email protected]", "mypassword");
    client.Host = "smtp.gmail.com";
    client.Port = 587;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;

    client.Send(msg);
}

Pokaż również swój plik app.config, jeśli masz tam ustawienia poczty.

meda
źródło
Jeszcze w nim nie skonfigurowałem. co mam tam napisać?
Abhay Andhariya
w mojej aplikacji mvc nie ma pliku app.config.
Abhay Andhariya
Próbowałem wielu innych rozwiązań, ale tylko to działało. Dzięki
Adil Malik
3

Napotkałem ten sam problem, nawet jeśli ustawiłem „UseDefaultCredentials” na false. Później odkryłem, że główną przyczyną jest włączenie na moim koncie „weryfikacji dwuetapowej”. Po wyłączeniu problem zniknął.

Soros Liu
źródło
4
Nie wyłączaj weryfikacji dwuetapowej. Jest tam z jakiegoś powodu. Możesz wygenerować hasło aplikacji w ustawieniach Gmaila i użyć go w SmtpClient. Powinieneś to robić niezależnie od ujawniania normalnego hasła.
Daniel Dyson
3

Włącz mniej bezpieczną aplikację z tego linku i boom ...

Behzad Qureshi
źródło
To zadziałało dla mnie. To musi być akceptowana odpowiedź
Noman,
2

wprowadź opis obrazu tutaj Upewnij się, że dostęp do mniej bezpiecznej aplikacji jest dozwolony.

        MailMessage mail = new MailMessage();
        mail.From = new MailAddress("[email protected]");
        mail.Sender = new MailAddress("[email protected]");
        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("[email protected]", "xx");
        smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
        smtp.EnableSsl = true;

        smtp.Timeout = 30000;
        try
        {

            smtp.Send(mail);
        }
        catch (SmtpException e)
        {
            textBox1.Text= e.Message;
        }
Shivam Srivastava
źródło
1
Link do przełączania ustawienia „Dostęp do mniej bezpiecznej aplikacji” jest tutaj - google.com/settings/security/lesssecureapps Zmiana tego ustawienia nie pomogła mi w rozwiązaniu
problemu
1

Poniżej znajduje się mój kod. Też miałem ten sam błąd, ale problem polegał na tym, że podałem błędne hasło. Poniższy kod będzie działał idealnie ... spróbuj

            MailMessage mail = new MailMessage();
            SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");              
            mail.From = new MailAddress("[email protected]");
            mail.To.Add("[email protected]");
            mail.To.Add("[email protected]");
            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);

Możesz to odesłać w Wysyłanie poczty

Ganesh Pillai N
źródło
1

Jeśli jest to nowe konto Google, musisz wysłać wiadomość e-mail (pierwszą) za pośrednictwem zwykłego interfejsu użytkownika. Następnie możesz używać aplikacji / robota do wysyłania wiadomości.

Ezequiel Santana
źródło
1

Należy rozważyć określenie danych konfiguracyjnych SMTP w pliku konfiguracyjnym i nie nadpisywać ich w kodzie - patrz dane konfiguracyjne SMTP na stronie http://www.systemnetmail.com/faq/4.1.aspx

<system.net>
            <mailSettings>
                <smtp deliveryMethod="Network" from="[email protected]">
                    <network defaultCredentials="false" host="smtp.example.com" port="25" userName="[email protected]" password="password"/>
                </smtp>
            </mailSettings>
        </system.net>
Michael Freidgeim
źródło
1

Kilka razy napotkałem ten sam problem. Po włączeniu mniej bezpiecznej opcji aplikacji problem został rozwiązany. Włącz mniej bezpieczną aplikację tutaj: https://myaccount.google.com/lesssecureapps

mam nadzieję, że to pomoże.

Mahmud
źródło
0

Niektóre serwery smtp (bezpieczne) wymagają podania zarówno nazwy użytkownika, jak i adresu e-mail, jeśli jest to gmail, najprawdopodobniej jest to problem „Mniej bezpiecznego logowania”, który musisz rozwiązać, w przeciwnym razie możesz spróbować:

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

Zauważ, że e-mail od i nazwa użytkownika są różne, w przeciwieństwie do niektórych implementacji, które odnoszą się do nich jako takie same.

wywołanie tej metody można zrobić w następujący sposób:

SendEmail("[email protected]", "test", "Hi it worked!!", 
   "from-mail", "from-username", "from-password", "smtp", 587);
Yakir Manor
źródło
0

Po włączeniu mniej bezpiecznej opcji i wypróbowaniu innych rozwiązań, jeśli nadal masz ten sam problem, spróbuj użyć tego przeciążenia:

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

zamiast:

client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
ssmsexe
źródło
0

Utworzyłem dziś rano subskrypcję Microsoft 365 Developer (E5) i użyłem jej do wysłania testowej wiadomości e-mail przy użyciu następujących ustawień

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

Na początku to nie zadziałało, ponieważ ciągle otrzymywałem ten komunikat o błędzie z wyjątkiem zgłaszanym przez ten kod. Następnie spędziłem ponad 4 godziny na zabawie z ustawieniami centrum administracyjnego platformy Microsoft 365 i czytaniu artykułów, aby rozwiązać problem. Ostatecznie zmieniłem hasło do centrum administracyjnego platformy Microsoft 365 i działało to jak marzenie. Warto więc spróbować zmienić hasło, gdy pojawi się taka wiadomość, zanim pomyślisz o jakimś zaawansowanym rozwiązaniu.

Zwróć uwagę, że hasło nie było na pewno nieprawidłowe, ponieważ logowałem się na moje konto Microsoft 365 bez żadnych problemów. Jednak zmiana hasła rozwiązała problem.

Kushan Randima
źródło
-1

Miałem również do czynienia z problemem typu „Serwer SMTP wymaga bezpiecznego połączenia lub klient nie został uwierzytelniony. Odpowiedź serwera brzmiała: 5.5.0 Wymagane uwierzytelnienie ”, a następnie przeszedł przez tak wiele materiałów internetowych, ale nie pomogło mi to w pełni. Jak to rozwiązałem

step1: smtp.gmail.com to serwer gmail, więc przejdź do ustawień Gmaila na swoim koncie-> kliknij zobacz wszystkie ustawienia-> Przekazywanie i IMAP / POP-> sprawdź, czy pop i imap są włączone, jeśli nie, włącz je-> Zapisz zmiany. step2-kliknij swoje zdjęcie profilowe w Gmailu-> kliknij Zarządzaj kontem Google-> przejdź do zakładki bezpieczeństwa-> sprawdź dostęp do mniej bezpiecznych aplikacji (ta opcja będzie dostępna, jeśli nie zdecydowałeś się na weryfikację dwuetapową) -> domyślnie Google ustawi to jako wyłączone, umożliwi używanie Twojego prawdziwego hasła do Gmaila do wysyłania wiadomości e-mail. Uwaga: - Zezwolenie na dostęp do Gmaila dla mniej bezpiecznych aplikacji może być dla Ciebie niebezpieczne, więc nie polecam tego

krok 3: -jeśli Twoje konto ma włączoną weryfikację dwuetapową lub chcesz użyć hasła innego niż Gmail Prawdziwe hasło za pomocą hasła aplikacji, spróbuj tego: - kliknij swoje zdjęcie profilowe Gmaila -> kliknij Zarządzaj kontem Google -> przejdź do bezpieczeństwa tab-> wyszukaj APP PASSWORD-> wybierz dowolną podaną nazwę aplikacji-> wybierz dowolną nazwę urządzenia-> kliknij generuj-> skopiuj 16-cyfrowe hasło i wklej je do swojej aplikacji, w której musisz wpisać hasło do Gmaila zamiast Twoje prawdziwe hasło do Gmaila.

Suryakant_Dubalgunde
źródło