2010-01-21 11 views
7

Ich habe einen Thread im Hintergrund ausgeführt, die schlafen und Daten aus der Datenbank ziehen, wenn etwas aufwacht. Ich sende die E-Mails mit Google Apps mit SmtpClient (Code unten).Was sollte ich über das Senden von E-Mails in einem Hintergrund-Thread wissen? ASP.NET

Ich wollte wissen, ob es etwas gibt, das mir bewusst ist? Ich plane, nur eine E-Mail gleichzeitig zu senden (eine Registrierung oder Passwort vergessen E-Mail). Ich bin ein bisschen besorgt, dass etwas passieren kann wie eine ungültige E-Mail, die den Thread blockiert, weil ich keine Zeitüberschreitung eingestellt habe oder vielleicht Google Apps passiert und die App zum explodieren gebracht hat. Was sollte ich beachten? Ich sollte fragen, wie ich auch testen sollte?

+2

Gibt es einen Grund, warum man diese Logik nicht einfach von da an nennen kann, wo das "Auslösen" des Aufwachens geschieht. Wenn Sie versuchen, ein Passwort zurückzusetzen und es schlägt fehl, als ein Benutzer möchte ich wahrscheinlich wissen, und sehe einen netten Fehler sagen, dass es fehlgeschlagen, so dass ich nicht sitzen und aktualisieren meinen Posteingang warten darauf. Die geringfügige Verzögerung bei der Verarbeitung der Benutzeranforderung und beim Senden in einem könnte die Beseitigung der Komplexität der Signalisierung lohnen. – Rosstified

Antwort

3

Wenn Sie IIS verwenden. Installieren Sie SMTP auf Ihrem Server und senden Sie alle Nachrichten an localhost. Auf diese Weise wird der SMTP-Server die E-Mail in die Warteschlange stellen, wenn eine E-Mail nicht sofort weitergeleitet wird.

Sie müssen den SMTP-Server so konfigurieren, dass Gmail als Smarthost verwendet wird. Wenn Sie weitere Informationen zur Konfiguration benötigen, lassen Sie es mich wissen.

+0

So mache ich es auch - es ist schneller und zuverlässiger. Wenn einer Ihrer Empfänger ungültig ist oder seine SMTP-Server ausgefallen sind, werden Zeitüberschreitungen und/oder Ausnahmen ausgelöst. Auf diese Weise akzeptiert IIS sofort alle E-Mail-Nachrichten und sorgt dann für das Senden der Nachricht, einschließlich der erneuten Ausführung des Sendevorgangs, falls dieser fehlschlägt. – Richard

1

Ich gehe davon aus, dass dies unter ASP.Net getan wird, da es eines der Tags ist.

Wie wichtig ist dieser Prozess? Dies ist möglicherweise ein guter Kandidat für einen Windows-Dienst und nicht Teil der ASP.Net-Laufzeitumgebung, wenn Ihre Umgebung dies zulässt.

Sie haben erwähnt, dass Sie die Daten aus der Datenbank abrufen und die E-Mail senden. Nichts davon beruht auf ASP.Net. Außerdem kann Ihnen ein Dienst bessere Threading-, Test-, Protokollierungs- und Async-Optionen bieten.

Wenn Sie mit ASP.Net Runtime bleiben möchten, dann können Sie auch Asynchronous Pages betrachten, wenn Sie nicht bereits haben. Auf diese Weise können Sie mehrere Mail-Threads erstellen und Ihr Hauptseiten-Thread auf die Ergebnisse warten lassen. Sie können auch einen Zeitüberschreitungswert festlegen, mit dem Sie festgefahrene Threads abbrechen und protokollieren können. Das Festlegen und Behandeln eines asynchronen Timeouts würde viele Ihrer Sorgen berücksichtigen, die ich vermute. Diese Lösung wird zumindest Ihre E-Mails von Ihrem Make-Seite-Anfrage-Thread senden.

Testen sollte einfach sein. Sie können separate Google-Konten zum Testen registrieren.

2

Fügen Sie dem Code einen try/catch hinzu, und Ihnen geht es gut. Es wird im schlimmsten Fall irgendwann aussetzen. Es wird nicht ewig laufen, und Google wird die Verbindung nicht für immer offen halten (tatsächlich ist SMTP ziemlich unversöhnlich, wenn es um Timeouts geht ... wenn Sie langsam sind, wird die Verbindung beendet).

try 
    { 
     var client = new SmtpClient("smtp.gmail.com", 587) 
     { 
      Credentials = new NetworkCredential(fromAddr, pass), 
      EnableSsl = true 
     }; 
     MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body); 
     mail.IsBodyHtml = true; 
     client.Send(mail); 
    } 
    catch 
    { 
     // do something 
    } 

Wenn es zum Testen kommt ... verwenden Sie ein anderes gMail-Konto. Sie sollten auch überprüfen, wie viele E-Mails pro Tag Sie senden. Nicht sicher, was gMail Nummer ist, aber sie lassen Sie nicht nur senden, wie viele Sie senden möchten.

+0

-1: Sie sollten fast nie "catch {}" verwenden. Es werden alle Ausnahmen ausgeblendet.Ausnahmen verschwinden nicht, nur weil Sie sie nicht sehen können. –

+2

gut er sagte // etwas tun –

+4

-1 ?? Ich habe nicht {} gefangen. Ich hatte da einen Kommentar für sie ... etwas tun. Wie soll ich wissen, was sie tun müssen? –

0

Sie können die Timeout-Eigenschaft von SmtpClient festlegen und dann alle Ausnahmen behandeln, die durch den Aufruf Send ausgelöst werden. Dann blockiert es den Thread nicht, obwohl Sie die Ursache der Ausnahme behandeln müssen, wie Sie es für angemessen halten.

Verwandte Themen