2010-09-07 23 views
8

Nienawidzę po prostu opublikować ślad stosu tutaj, ale nie mam pomysłów ... Moja aplikacja wysyła e-maile do różnych zadań na stronie internetowej, a 90% czasu nie ma problemy. Jednak co jakiś czas ASP.NET rzuca dziwny wyjątek, który wydaje się odnosić do łączności z serwerem pocztowym (używam serwerów biznesowych Google dla wiadomości e-mail). Błąd jest zbyt ogólny dla mnie do debugowania, stąd ślad stosu poniżej. Moja aplikacja przechwytuje wyjątek i wypisuje ogólną odpowiedź "spróbuj ponownie w ciągu 5 minut".Tymczasowe problemy z wysyłaniem e-maili z ASP.NET

Jestem zakłopotany przez ten błąd, ponieważ:

  • Google e-mail jest na ogół bardzo wiarygodne (to jest wysyłane z mojej domeny, nie gmail.com).
  • Objętości są bardzo niskie, więc nie powinno to być problemu z ładowaniem/spamowaniem.
  • Błąd jest bardzo ogólny.
  • Próba powtórzenia w ciągu 5 minut prawie zawsze pozwala na wysłanie wiadomości e-mail bez problemu, przy czym żaden z parametrów (odbiorca, temat, treść) nie uległy zmianie.

Wszelkie pomysły? Jedyne nierozstrzygnięte kwestie, które mogę wymyślić, to:

  1. Wysyłanie wiadomości e-mail jest synchroniczne. Właśnie to chcę zrobić, ponieważ chcę odpowiedzieć użytkownikowi na komunikat o stanie sukcesu/porażki.
  2. Używam Amazon EC2 jako serwera, jeśli ma to jakiekolwiek znaczenie w tej sprawie.

Kod:

public static void SendMail(String from, String to, String subject, String body, bool IsHtml) 
    { 
     MailMessage m = new MailMessage(from, to, subject, body); 
     m.IsBodyHtml = IsHtml; 

     SmtpClient smtpClient = new SmtpClient(); 
     smtpClient.EnableSsl = true; 
     smtpClient.Send(m); 
    } 

Wyjątek:

System.Net.Mail.SmtpException: Error in processing. The server response was: 4.3.0 Mail server temporarily rejected message. m6sm2190005vcx.24 
at System.Net.Mail.DataStopCommand.CheckResponse(SmtpStatusCode statusCode, String serverResponse) 
at System.Net.Mail.DataStopCommand.Send(SmtpConnection conn) 
at System.Net.Mail.SmtpConnection.OnClose(Object sender, EventArgs args) 
at System.Net.ClosableStream.Close() 
at System.Net.Mail.MailWriter.Close() 
at System.Net.Mail.SmtpClient.Send(MailMessage message) 
+0

Wykonywanie wyszukiwania google na tym konkretnym błędzie wskazuje, że jest to prawdopodobnie problem z serwerami Google, o których wiedzą.Rozstrzygnięcie w toku. –

Odpowiedz

5

Pracowałem na masowych systemów pocztowych w przeszłości. Komunikat o wyjątku, który otrzymujesz, jest całkowicie opisowy: serwer SMTP tymczasowo nie przyjmuje poczty. Może to wynikać z szeregu warunków:

  1. serwer jest zajęty
  2. Wysyłasz zbyt wiele e-maili zbyt szybko (to może wyglądać jak spamera)
  3. błędy ogólne

Fakt, że ponowna próba wysłania e-maila później zawsze działa, oznacza, że ​​jest to normalne, oczekiwane zachowanie. Nic nie możesz zrobić inaczej, aby tego uniknąć, jest to popularna metoda używana przez dostawców usług internetowych do ograniczania ruchu w razie potrzeby.

+0

Jak na podstawie doświadczeń ... Czy warto wypróbować drugi raz natychmiast po wystąpieniu pierwszego błędu SMTP z 1-sekundowym opóźnieniem? Wydaje się, że jest to tylko tymczasowy problem (zaskakujące, ponieważ jest to poczta google !!?) I po prostu powtarzanie wysyłania wydaje się przezwyciężać problemy. –

+1

Gwarantuję, że nie jesteś jedyną osobą, która otrzymała ten błąd za pośrednictwem Google lub jakiegokolwiek innego ISP/ESP. To niekoniecznie jest "niepowodzeniem" na końcu Google- kolejka na tym serwerze może być pełna lub może być jedną z wielu innych często spotykanych problemów. Jedna sekunda to chyba za mało, będę czekać co najmniej 30 sekund. –

+0

Dzięki za radę! –

0

Oprócz tego, co powiedział Dave Swersky: Możesz przechowywać wiadomości e-mail, które chcesz wysłać (np. System plików lub bazę danych) i umożliwić generowanie wiadomości e-mail przez usługę. Twoja usługa będzie oczekiwać na wysyłanie nowych e-maili. Jeśli wystąpi błąd podczas wysyłania, możesz umieścić wiadomość e-mail z powrotem w kolejce i spróbować ponownie później.

Może nawet możesz użyć lokalnego serwera STMPServer, który używa GoogleMail jako serwera przekazywania. W takim przypadku można użyć wbudowanej funkcji pickupdirectory, zamiast pisać ją samodzielnie.