Błąd Gmaila: serwer SMTP wymaga bezpiecznego połączenia lub klient nie został uwierzytelniony. Odpowiedź serwera brzmiała: 5.5.1 Wymagane uwierzytelnienie

260

Używam następującego kodu, aby wysłać e-mail. Kod działa poprawnie na mojej lokalnej maszynie. Ale na serwerze produkcyjnym pojawia się komunikat o błędzie

var fromAddress = new MailAddress("[email protected]");
var fromPassword = "xxxxxx";
var toAddress = new MailAddress("[email protected]");

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

A na moim Gmailu A / c otrzymałem następujący e-mail po uruchomieniu kodu z serwera produkcyjnego

Cześć ,

Ktoś ostatnio użył Twojego hasła, aby zalogować się na Twoje konto Google [email protected]. Ta osoba używała aplikacji, takiej jak e-mail, klient lub urządzenie mobilne.

Zapobiegliśmy próbie zalogowania się na wypadek, gdyby był to porywacz próbujący uzyskać dostęp do Twojego konta. Sprawdź szczegóły próby zalogowania:

Piątek, 3 stycznia 2014 13:56:08 godzina Adres UTC: xxx.xx.xx.xxx (abcd.net.) Lokalizacja: Philadelphia PA, Philadelphia, PA, USA

Jeśli nie rozpoznasz tej próby logowania, ktoś inny może próbować uzyskać dostęp do Twojego konta. Powinieneś zalogować się na swoje konto i natychmiast zresetować hasło.

Zresetuj hasło

Jeśli to Ty i masz problem z dostępem do konta, wykonaj kroki rozwiązywania problemów wymienione na stronie http://support.google.com/mail?p=client_login

Z poważaniem, Zespół kont Google

vcs
źródło
czy masz dostęp do serwera produkcyjnego
Arshad
Nie mam dostępu do serwera produkcyjnego
vcs
Wyłącz weryfikację dwuetapową.
Mangesh
1
Upewnij się także, że Google „Captcha” jest wyłączony - może to być konieczne, jeśli skrypt jest uruchamiany na zdalnym serwerze (nie jest konieczny, gdy działa na komputerze lokalnym): accounts.google.com/DisplayUnlockCaptcha
Jens

Odpowiedzi:

197

Zazwyczaj dzieje się tak, gdy próbujesz zalogować się z innej strefy czasowej lub komputera z adresem IP. Twój serwer produkcyjny i użyty identyfikator poczty znajdują się w innej strefie czasowej. Wybierz jedno z tych dwóch rozwiązań:

1) Zaloguj się do serwera produkcyjnego za pomocą zdalnego dostępu i zaloguj się do Gmaila jeden raz przy użyciu swoich poświadczeń. Poprosą o potwierdzenie, potwierdź je i wyloguj.

Lub 2) zaloguj Gmaila na komputer lokalny, kliknij ten link i wybierz przejrzyj tę aktywność i podejmij odpowiednie działania.

Arszad
źródło
21
Mały komentarz: przejdź do security.google.com/settings/security/activity, a tutaj zobaczysz zablokowane połączenie z kodu. Pozwól im i to powinno pomóc w tym przypadku.
Alex Zhukovskiy
68
Pomoże to również bardzo: google.com/settings/security/lesssecureapps
George
Tak, powodem jest 2-etapowa weryfikacja włączona dla konta Gmail. Wybierz aplikację / urządzenie i kliknij przycisk Wygeneruj support.google.com/accounts/answer/185833
smily
8
Upewnij się także, że Google „Captcha” jest wyłączony - może to być konieczne, jeśli skrypt jest uruchamiany na zdalnym serwerze (nie jest konieczny, gdy działa na komputerze lokalnym): accounts.google.com/DisplayUnlockCaptcha
Jens
301

Podczas próby wysłania wiadomości e-mail z kodu i znalezienia błędu „Serwer SMTP wymaga bezpiecznego połączenia lub klient nie został uwierzytelniony. Odpowiedź serwera brzmiała: 5.5.1 Wymagane uwierzytelnienie”, może wystąpić błąd z powodu następujących przypadków.

przypadek 1: gdy hasło jest nieprawidłowe

przypadek 2: gdy próbujesz zalogować się z jakiejś aplikacji

przypadek 3: gdy próbujesz zalogować się z domeny innej niż strefa czasowa / domena / komputer (tak jest w większości scenariuszy podczas wysyłania poczty z kodu)

Dla każdego istnieje rozwiązanie

rozwiązanie dla przypadku 1: Wprowadź poprawne hasło.

rozwiązanie 1 dla przypadku 2 : przejdź do ustawień bezpieczeństwa pod linkiem followig https://www.google.com/settings/security/lesssecureapps i włącz mniej bezpieczne aplikacje. Abyś mógł zalogować się ze wszystkich aplikacji.

rozwiązanie 2 dla przypadku 2 : (patrz https://stackoverflow.com/a/9572958/52277 ) włącz uwierzytelnianie dwuskładnikowe (inaczej weryfikacja dwuetapowa), a następnie wygeneruj hasło aplikacji. Użyj nowo wygenerowanego hasła do uwierzytelnienia za pomocą SMTP.

rozwiązanie 1 dla przypadku 3: (może to być pomocne) musisz przejrzeć działanie. ale przeglądanie działania nie będzie pomocne ze względu na najnowsze standardy bezpieczeństwa, link nie będzie przydatny. Wypróbuj poniższy przypadek.

rozwiązanie 2 dla przypadku 3 : Jeśli hostowałeś swój kod gdzieś na serwerze produkcyjnym i masz dostęp do serwera produkcyjnego, to połącz się zdalnie z serwerem produkcyjnym i spróbuj zalogować się raz z przeglądarki serwera produkcyjnego. Spowoduje to dodanie wyjątku do logowania do Google i będzie można zalogować się z kodu.

Ale co, jeśli nie masz dostępu do serwera produkcyjnego. wypróbuj rozwiązanie 3

rozwiązanie 3 dla przypadku 3: Musisz włączyć logowanie z innej strefy czasowej / ip dla swojego konta Google.

Aby to zrobić, kliknij link https://g.co/allowaccess i zezwól na dostęp, klikając przycisk Kontynuuj.

I to wszystko. Proszę bardzo. Teraz będziesz mógł zalogować się z dowolnego komputera i dowolnej aplikacji na swoje konto Google.

Roshan Parmar
źródło
10
Rozwiązanie 2! Ty mała piękność!
George Harnwell
2
powyższy link lesssecureapps pomógł :)
Gautam Jain
Wow, to powinno być oznaczone jako zaakceptowana odpowiedź. Dzięki.
Nic
5
strona hostowana na lazurach musi postępować zgodnie z rozwiązaniem 3 dla przypadku 3: końcowy link, który pomaga g.co/allowaccess
Ravi Anand
1
Rozwiązanie 2 dla przypadku 3 - działało dla mnie jak urok. Dzięki.
ss_mj
106

Jest to problem bezpieczeństwa, Gmail domyślnie uniemożliwia dostęp do konta e-mail z niestandardowych aplikacji. Możesz ustawić akceptację loginu z aplikacji.

Po zalogowaniu się na swój e-mail, KLIKNIJ TUTAJ

Spowoduje to przejście do następnej strony

Strona mniej bezpiecznych aplikacji

Sayka
źródło
1
Ponadto, jeśli masz domenę niestandardową, administrator domeny musi najpierw włączyć użytkowników, aby umożliwić dostęp do mniej bezpiecznych aplikacji. Jeśli jesteś administratorem domeny, kliknij poniższy link, aby włączyć to admin.google.com/AdminHome#ServiceSettings/…
user551113
2
Ta odpowiedź jest świetna. To działa jak urok. Dziękuję Ci.
Thomas.Benz
24

Po spędzeniu kilku godzin dzisiaj na wypróbowaniu każdego rozwiązania tutaj, nadal nie byłem w stanie ominąć tego dokładnego błędu. Korzystałem z Gmaila wiele razy w ten sposób, więc wiedziałem, że to coś głupiego, ale nic nie rozwiązałem. W końcu natknąłem się na rozwiązanie w moim przypadku, więc pomyślałem, że podzielę się.

Po pierwsze, większość powyższych odpowiedzi jest również wymagana, ale w moim przypadku było to proste uporządkowanie kodu podczas tworzenia SmtpClientklasy.

W tym pierwszym fragmencie kodu poniżej zwróć uwagę na lokalizację Credentials = credswiersza. Ta implementacja wygeneruje błąd wymieniony w tym pytaniu, nawet jeśli wszystko inne zostało poprawnie skonfigurowane.

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
}

Jeśli jednak przeniesiesz wywołanie setera poświadczeń na dół, wiadomość e-mail zostanie wysłana bezbłędnie. Nie wprowadziłem żadnych zmian w otaczającym kodzie ... tj. ... nazwa użytkownika / hasło itp. Oczywiście, albo EnableSSL, UseDefaultCredentials, or the DeliveryMethodto zależy od ustawienia Credentialsjako pierwszego ... Nie przetestowałem wszystkich, aby dowiedzieć się, który to był .

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
}

Mam nadzieję, że pomoże to uratować komuś ból głowy w przyszłości.

użytkownik1011627
źródło
2
W moim przypadku miałem ten sam problem, co twój, zmieniając kolejność kodu, tak aby poświadczenia były ostatnio dla mnie działały.
Dev
1
Nie mogę w to uwierzyć, ale zadziałało! Włączyłem 2-etapowy, ponieważ nie chciałem włączać mniej bezpiecznej flagi, ale dopóki nie wprowadzę Poświadczenia na końcu przed wysłaniem, nie chcę działać. Niesamowite!
Čikić Nenad
6
Problem jest, że w UseDefaultCredentialsseter jest ten kod: this.transport.Credentials = value ? (ICredentialsByHost) CredentialCache.DefaultNetworkCredentials : (ICredentialsByHost) null;która zastępuje credentialsustawiony przez Credentialsseter. Dla mnie wygląda to jak SmtpClientbłąd
Tomasz Madeyski
@TomaszMadeyski to musi być odpowiedź zamiast komentarza! to jest mój problem ... jak do diabła mogę pomyśleć, że jeśli ustawię poświadczenia w konstruktorze, a następnie ponownie przypiszę do fałszywej wartości UseDefaultCredentials = false to przesłania poświadczenia ... szalone !! ale to się zdarza .... dzięki
youuuuu
12

Cześć, miałem ten sam problem,

co zrobiłem, aby to rozwiązać. jest włączenie mniej bezpiecznej aplikacji. po połączeniu z moim kontem Gmail. Podałem ten link: https://www.google.com/settings/security/lesssecureapps

Następnie włączam bezpieczną aplikację i, i to działało. zostało powiedziane również powyżej

Barak Rosenfeld
źródło
Czym więc różni się Twoja odpowiedź od powyższej odpowiedzi? Ta sama odpowiedź została udzielona 12 stycznia 2015 r. O godz. 10:36.
Dush
11

Mam wcześniej działający kod, który teraz generuje ten błąd. Brak problemu z hasłem. Nie trzeba też konwertować wiadomości na base64. Okazuje się, że muszę wykonać następujące czynności:

  1. Wyłącz uwierzytelnianie dwuskładnikowe
  2. Ustaw „Zezwalaj mniej bezpiecznym aplikacjom” na WŁ
  3. Zaloguj się na swoje konto Gmail z serwera produkcyjnego
  4. Idź tutaj, aby zatwierdzić logowanie
  5. Uruchom aplikację na serwerze produkcyjnym

Działający kod

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

        client.Send("[email protected]", emailTo, subject, body);
    }

Wyłączanie uwierzytelniania dwuskładnikowego Wyłączanie uwierzytelniania dwuskładnikowego

Ustaw „Zezwalaj mniej bezpiecznym aplikacjom” na WŁ. (Ta sama strona, musisz przewinąć do dołu) Zezwalaj na mniej bezpieczne aplikacje

Jeson Martajaya
źródło
9

Wystarczy wykonać krok w e-mailu Google i włączyć mniej bezpieczne aplikacje.

Trung
źródło
6

Napotkałem ten sam problem. Zdarza się to po włączeniu weryfikacji dwuetapowej (MFA). Wystarczy wyłączyć weryfikację dwuetapową, a problem powinien zostać rozwiązany.

Anik
źródło
Nie miałem włączonego dwuetapowego konta i miałem ten problem.
Shiv
4

Poniżej znajduje się mój kod. Miałem również ten sam błąd, ale problem polegał na tym, że podałem nieprawidłowe hasło. Poniższy kod będzie działał idealnie.

            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 polecić to na moim blogu

Ganesh Pillai N.
źródło
używam tego samego kodu, który działa na moim komputerze lokalnym, ale nie działa na serwerze. Wystąpił błąd Serwer SMTP wymaga bezpiecznego połączenia lub klient nie został uwierzytelniony. Odpowiedź serwera brzmiała: 5.5.1 Wymagane uwierzytelnienie. .
Akshay Chawla
1
skontaktowałem się z moim dostawcą hostingu, który powiedział: Widzieliśmy, że masz skonfigurowaną trzecią część SMTP (smtp.gmail.com), która nie będzie obsługiwana w naszym środowisku serwerów współdzielonych. Z powodu nadmiernego nadużywania funkcji poczty lub problemu ze spamem funkcja poczty nie jest obsługiwana. Możesz wysyłać wiadomości e-mail za pomocą PHPMailer, który jest bardzo popularny i często używany. ale moja strona jest wbudowana w mvc c #, więc jak mogę korzystać z phpmailer?
Akshay Chawla
3

po prostu włącz ustawienie lub Gmail. patrz poniżej podany obraz:

wprowadź opis zdjęcia tutaj

Rajesh Paliwal
źródło
2

Miałem ten sam problem z aplikacją wdrożoną na Microsoft Azure.

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

Najpierw zatwierdziłem wszystkie nieznane urządzenia (niektóre adresy IP pochodzące z Irlandii) na następującej stronie (zalogowany jako użytkownik Gmaila): https://security.google.com/settings/u/1/security/secureaccount

Użyłem następujących ustawień dla klienta:

var client = new SmtpClient("smtp.gmail.com");
client.Port = 587;
client.EnableSsl = true;
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("[email protected]", "my_password"); 

Zaczęło działać dopiero po ustawieniu następującej właściwości na kliencie smtp:

client.TargetName = "STARTTLS/smtp.gmail.com";
haiiaaa
źródło
2

To, co zadziałało, to aktywacja opcji dla mniej bezpiecznych aplikacji (używam 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("[email protected]")
        mail.[To].Add("[email protected]")
        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

Zaloguj się na swoje konto, a następnie przejdź do google.com/settings/security/lesssecureapps

Edgar
źródło
2

Komentarz Tomasza Madeyskiego naprawił mój problem ... mówi, że istnieje błąd w SetDefaultCredential, mówi:

„Problem polega na tym, że w seterze UseDefaultCredentials znajduje się następujący kod: this.transport.Credentials = wartość? (ICredentialsByHost) CredentialCache.DefaultNetworkCredentials: (ICredentialsByHost) null; który zastępuje poświadczenia ustawione przez seter poświadczeń. Dla mnie wygląda to na błąd

jeśli wstawisz smtpClient.UseDefaultCredentials = falsepo ustawieniu poświadczeń ... ten wiersz ustawia na zero tych poświadczeń ...

FabianSilva
źródło
2

LISTOPAD 2018, próbowałem wszystkiego powyżej bez powodzenia.

Poniżej znajduje się rozwiązanie, które w końcu zadziałało. Niestety nie używa SSL, ale działa !!!

var fromAddress = new MailAddress(asd@asd.com, "From Name");
var toAddress = new MailAddress("[email protected]", "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);
}
InGeek
źródło
1

Wypróbowałem wszystkie sugestie tutaj znalezione, od włączania mniej bezpiecznych aplikacji, po wypróbowanie portu 587 ... nic nie działało. W końcu właśnie skomentowałem linię UseDefaultCredentials = false. Wszystko działało, gdybym nie dotknął tego boolean.

Kris Coleman
źródło
1
to samo tutaj… nie mogę uwierzyć, że jedna linia zajęła mi godzinę!
Wahid Masud
0

Naprawdę przyjrzałem się wielu pomysłom, jedynym rozwiązaniem było to w ten sposób (działa z różnymi dostawcami e-mail):

            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 "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)...
Walter
źródło
0

Jestem aplikacją Google dla abonentów biznesowych i ostatnie kilka godzin spędzam na rozwiązywaniu tego problemu, nawet po skonfigurowaniu wszystkich poprawnych ustawień (smtp, port, enableSSL itp.). Oto, co zadziałało dla mnie i stron internetowych, które zgłaszały błąd 5.5.1 podczas próby wysłania wiadomości e-mail:

  1. Zaloguj się na admin.google.com
  2. Kliknij BEZPIECZEŃSTWO <- jeśli nie jest to widoczne, kliknij „WIĘCEJ KONTROLI” i dodaj go z listy
  3. Kliknij opcję Ustawienia podstawowe
  4. Przewiń w dół okna Ustawienia podstawowe, kliknij link: „Przejdź do ustawień dla mniej bezpiecznych aplikacji”
  5. Wybierz opcję # 3: Wymuszaj dostęp do mniej bezpiecznych aplikacji dla wszystkich użytkowników (niezalecane)
  6. Naciśnij ZAPISZ w dolnej części okna

Po wykonaniu tej czynności moje formularze e-mail ze strony znów działały. Powodzenia!

RichieMN
źródło
0

Może być konieczne utworzenie / wygenerowanie określonego hasła do aplikacji z Gmaila. Twoja aplikacja lub skrypt użyje wtedy tego nowego hasła zamiast zwykłego hasła. Twoje zwykłe hasło nadal będzie działać dobrze.

Właśnie to dla mnie zrobiło. Nadal korzystałem z tego samego konta e-mail, ale musiałem wygenerować nowe hasło aplikacji.

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

Zrzut ekranu

Zasadniczo możesz to zrobić tutaj: https://security.google.com/settings/security/apppasswords

Samiup
źródło
0

Jeśli używasz Gmaila.

  • 1 logowanie do twojego konta

    2- przeglądaj ten link

    3- Zezwalaj na mniej bezpieczne aplikacje: WŁ

Cieszyć się....

Muhammad Azeem
źródło
0

nie umieszczaj punktu przerwania przed oczekiwaniem na smtp.SendMailAsync (mail);

:)

gdy czeka z punktem przerwania, podając ten błąd, gdy usuwam punkt przerwania, zadziałało

Hamit YILDIRIM
źródło
-1

Użyłem wszystkich wyżej wymienionych rozwiązań, ale w końcu zadziałało dopiero po włączeniu dostępu IMAP z ustawień Gmaila Link do włączania dostępu IMAP w ustawieniach Gmaila

Oczywiście wymagane były również punkty w innych rozwiązaniach.

AndroidMechanic - Viral Patel
źródło
To mi nie pomogło. Włączenie IMAP umożliwia tylko czytanie wiadomości e-mail Gmaila z innych klientów pocztowych, takich jak Outlook, Thunderbird.
kimbaudi,
-5

spróbuj zmienić hosta, to jest nowy, dostałem ten konfigurujący Mozilla Thunderbird

Host = "smtp.googlemail.com"

to działa dla mnie

patogalarzar
źródło