Błąd Google SMTP: 454 4.7.0 Zbyt wiele prób logowania, spróbuj ponownie później

17

Odkryłem, że chociaż możliwe było używanie Gmaila / Google Apps jako serwera SMTP do użytku skryptowego, jeśli wysłano zbyt wiele wiadomości e-mail, zacząłem otrzymywać komunikaty o błędach:

SMTP Error: 454 4.7.0 Too many login attempts, please try again later.

Zwykle gdybym czekał godzinę lub dwie, mógłbym wysłać kolejne 100 e-maili, ale wkrótce znów napotkałbym ten sam komunikat o błędzie.

AlexMax
źródło

Odpowiedzi:

12

Odkryłem, że problem polegał na tym, że chociaż mieliśmy rekordy SPF dla naszych domen, nie mieliśmy rekordu DKIM powiązanego z naszą domeną. Aby dodać rekord DKIM do Google Apps, musisz wykonać następujące czynności:

  • Przejdź do konsoli administracyjnej
  • Kliknij „Google Apps”
  • Kliknij „Gmail”
  • Przewiń w dół, aż zobaczysz „Uwierzytelnij e-maila” i kliknij to
  • Wybierz domenę, do której chcesz dodać DKIM
  • Gdy zapyta, jakiego prefiksu chcesz użyć, po prostu użyj domyślnego „google”

Następnie zobaczysz rekord TXT w dwóch częściach, jeden kawałek ma domenę, a drugi rzeczywisty rekord TXT. Musisz przejść do ustawień DNS na serwerze dla swojej domeny i dodać ten rekord. Jeśli Twój panel sterowania DNS nie pozwala na dodanie domeny google._domainkey, po prostu spraw , aby domena była w pełni kwalifikowana google._domainkey.example.com.

Po wykonaniu tej czynności poświęć rekordowi DNS trochę czasu na propagację, a następnie kliknij „Rozpocznij uwierzytelnianie” w panelu administracyjnym Google Apps. Jeśli widzisz zielony znacznik wyboru, zrobiłeś to, a poczta e-mail powinna ponownie zacząć przepływać przez serwer SMTP.

AlexMax
źródło
Co jeśli nie masz kontroli nad serwerem DNS?
Ishmael,
1
Ratownik. Wygląda na to, że Gmail sprawdza autorytatywne serwery pod kątem rekordu TXT, więc nie powinieneś czekać na pełne propagowanie DNS - w przypadku większości zmian wprowadzonych w tych dniach za pomocą menedżera plików strefy DNS nie będziesz musiał czekać więcej niż kilka sekund, aby zmiana zaczęła obowiązywać.
JT Taylor
4

Nie należy uwierzytelniać każdego wysłanego e-maila.

Na początku procesu:

Session session = loadSession();
Transport transport = session.getTransport("smtp");
transport.connect("[email protected]", "password");

Następnie użyj obiektu transportu do wysłania każdej poczty bez rozpoczynania sesji:

transport.sendMessage(message, message.getAllRecipients());

Po wysłaniu wszystkich wiadomości e-mail należy zamknąć połączenie:

transport.close();
victorpacheco3107
źródło
0

rozwiązanie z @ victorpacheco3107 zadziałało dla mnie, oto co zrobiłem w Ruby:

settings = {
  address:        "smtp.gmail.com",
  port:           587,
  domain:         "mydomain.com",
  user_name:      "[email protected]",
  password:       "password",
  authentication: "plain"
}

smtp_conn = Net::SMTP.new(settings[:address], settings[:port])
smtp_conn.enable_starttls_auto
smtp_conn = smtp_conn.start(settings[:domain],
                            settings[:user_name],
                            settings[:password],
                            settings[:authentication])
Mail.defaults do
  delivery_method :smtp_connection, { :connection => smtp_conn }
end

# send mails..
mail = Mail.new
mail.to('...')
# more mail stuff..
mail.deliver!

# after all mails are sent, end session
smtp_conn.finish
Lluís
źródło
0

Używając SMTP, gdy wysyłasz masową wiadomość e-mail, zaloguj się do każdej poczty, a następnie wyloguj się. Z tego powodu Google blokuje twoje połączenie. Dla mnie zadziałało ustawienie SMTPKeepAlive na wartość true.

kushal parikh
źródło
1
Sugerowano już, aby nie logować się do każdej poczty.
RalfFriedl