2010-04-12 13 views
7

Ich schreibe eine Anwendung, die eine große Anzahl von E-Mails an unsere Studenten senden müssen, die aus unserer Datenbank ausgewählt werden (jede E-Mail wird in dem Umfang personalisiert sein, der ihre enthält Name, Studienverlauf usw. ... muss also einzeln gesendet werden).Senden von mehr als 20.000 E-Mails mit asp.net

Ich könnte diese Schleife über einen SmtpClient machen, aber ich habe Angst, dass ich mit den Zahlen, die ich zu senden versuche, letztendlich Timeout-Probleme oder meinen Thread wegen mangelnder Maschinenressourcen getötet wird.

An diesem Punkt bin ich nur auf der Suche nach Vorschlägen für eine bessere Möglichkeit, dies zu umgehen, oder wenn SmtpClient Schleife ist eine gute Lösung, wie sollte ich damit umgehen, um zu verhindern, was ich oben gepostet.

Wäre ein Webservice eine bessere Alternative?

Bitte raten, TIA

+0

Sie müssen mit einigen Tools von Drittanbietern gehen – anishMarokey

+2

Sie brauchen nicht mit einigen Dritten zu gehen tools –

Antwort

11

Mein Vorschlag wäre, dies auszugleichen. Versuchen Sie nicht, ASP.NET-Code auszuführen, um 20K-E-Mails zu erstellen, und senden Sie sie, da Sie Probleme mit Timeout und Leistung haben. Füllen Sie stattdessen eine Tabelle mit Empfänger, Betreff und Nachrichtentext aus, und starten Sie einen Stapelprozess von einem Windows-Dienst. Auf diese Weise wird Ihr Code so ausgeführt, dass die Verzögerung verwaltet werden kann, anstatt dass eine Webseite auf die Rückgabe der Anfrage wartet.

+0

klingt dieser Ansatz vielversprechend. Ich speichere die E-Mails bereits in einer Tabelle. Entschuldigung für eine noobish Frage, aber wie würde ich diesen Windows-Dienst anrufen, damit er das Versenden der E-Mails initiiert, und wie würde ich dem Client zurückmelden, welche erfolgreich gesendet wurden und welche vom Windows-Dienst fehlgeschlagen sind? – Kyle

+0

müssen Sie den Windows-Dienst nicht aufrufen. lass es einfach laufen. Der Dienst könnte so gestaltet sein, dass er Ihren Tisch überprüft und prüft, ob noch etwas zu tun ist. Wenn E-Mails gesendet wurden, die nicht gesendet wurden, dann stapel Sie diese auf und senden Sie sie. Grundsätzlich sollte der Dienst entworfen werden, um diese Tabelle jemals 5 Minuten oder so abzufragen. (Beachten Sie, dass Sie eine Bool-Markierung auf die Tabelle setzen sollten, die angibt, ob sie gesendet wurde und zu Präformanzzwecken einen Index für die Bool-Markierung erstellt.) Wenn Sie jetzt die Tabelle nach allen nicht gesendeten Elementen abfragen, wird die Anzahl der Elemente überschritten Der Service beginnt mit der E-Mail. Wie für das Zurückmelden an den Client –

+0

cool. Ich werde es versuchen. danke – Kyle

6

Ok, zuerst - das ist kaum massiv, ich habe 50.000 E-Mails + worden Umgang

die E-Mails in einen Ordner geschrieben werden lassen - Verzeichnis. Verwenden Sie dann den lokalen SMTP-Dienst, den Sie installieren können, und weisen Sie ihn als Pickup-Verzeichnis auf den Ordner hin. Dies wird zumindest sicherstellen, dass Sie einen anständigen Puffer dazwischen haben (d. H. Sie können die asp.net-Seite beenden, während die E-Mails zu diesem Zeitpunkt nicht gesendet werden).

+0

gut erste Frage, die in den Sinn kommt ist, dass alle unsere Studenten eine "3rd Party" für ihre E-Mail verwenden (alle mit der gleichen), die unsere Exchange-Server weiß-Liste als "ein ok Absender". Leider habe ich keinen Zugriff auf den Exchange-Server, um ihm mitzuteilen, dass er die E-Mails aus diesem 'Ordner' abrufen soll ... das liegt an unserer Infrastruktur. Ich habe auch keinen Zugang, um den Webserver als "ok sender" auf unserer 3rd Party (wo alle E-Mail-Adressen sind) hinzuzufügen ... also kann er dort nicht als SMTP-Server verwendet werden. Wenn ich einen Web-Service erstellt habe, um das Senden der E-Mails über unsere Exchange zu behandeln ... würde das fliegen – Kyle

+0

Eigentlich wo ist das Problem? Ernsthaft ... Der LOCAL SMTP-Dienst kann so konfiguriert werden, dass er (a) den Exchange-Server als Relay verwendet und (b) sich dort mit einem Benutzernamen und einem Passwort wie bei Ihrem normalen SMTP-Dienst authentifiziert. – TomTom

+0

Ihre Antwort bietet keine Lösung, stattdessen stellen Sie nur mehr Fragen. Haben Sie erwartet, dass 20.000 Benutzer alle zum selben E-Mail-Anbieter gehören? Ihre Antwort zeigt, dass Sie keine Erfahrung beim Senden dieser Art von E-Mails haben. –

0

Sie könnten Javascript auf einem Timer verwenden, um das Skript anzufordern, das E-Mails in kleinen Stücken sendet, die keine Zeit verlieren. Dann würden Sie das Skript über den Browser aufrufen. Fügen Sie einen Fortschrittsbalken, eine Authentifizierung usw. hinzu.

0

Sie benötigen keinen Webservice, sondern eine Möglichkeit, die E-Mails in eine Warteschlange zu schreiben (möglicherweise eine Tabelle "Email_Queue" in der Datenbank). Dann könnte ein Windows-Dienst, der auf einem Server ausgeführt wird, die Warteschlange nach dem Prinzip "First-in/first-out" zu angemessenen Zeitpunkten an den SMTPClient durchlesen und Elemente aus der Warteschlange entfernen, während sie verarbeitet werden. Sie müssten wahrscheinlich einige Messungen durchführen, um festzustellen, wie groß die Chunk-Größe und die Verzögerung für Ihren Mail-Server sind.

2

Was ist mit der Verwendung Datenbank Mail Werkzeug von SQL Server selbst zur Verfügung gestellt. Sie können immer noch asp.net verwenden, aber E-Mail wird von SQL Server gesendet und alles, was Sie tun müssen, rufen Sie die gespeicherte Prozedur auf und belassen Dinge zu SQL Server.

Ich würde Batch-Option nicht empfehlen, da es keine Optimierung oder Warteschlange Sache geben wird, es sei denn, Sie müssen sich viel Mühe geben, dies zu tun.

Datenbank Mail-Tool bietet auch Warteschlange und Priorität Optionen. Wenn ein Problem auftritt, wird die E-Mail erneut in die Warteschlange gestellt und später gesendet, aber die anderen werden noch gesendet.

Es heißt Database Mail in SQL Server 2008 und SQL Mail in früheren Versionen.

Für weitere Informationen besuchen Sie bitte die folgenden Links:

+0

THat Sache einfach saugt und sollte nie in SQL Server zu Beginn gewesen sein. – TomTom

+0

Was lutscht einfach? – Tarik

+1

Bitte ignorieren Sie TomTom - er wurde betrunken geboren! Hast du einige seiner anderen Kommentare gesehen? –