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

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 mymailid@gmail.com. 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


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.


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.


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


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.


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


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("youremail@gmail.com", "secretpassword"),
            EnableSsl = true
        };

        client.Send("youremail@gmail.com", 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


9

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


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.


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

Możesz polecić to na moim blogu


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


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("my_user_name@gmail.com", "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";

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("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

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


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ń ...


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

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.


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

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!


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


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ę....



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



-5

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

Host = "smtp.googlemail.com"

to działa dla mnie

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.