Laden...

ASP.net MVC 3: wie am besten Emails versenden

Erstellt von M@TUK vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.486 Views
M
M@TUK Themenstarter:in
402 Beiträge seit 2005
vor 12 Jahren
ASP.net MVC 3: wie am besten Emails versenden

Hi,

in einer MVC 3 Application sollen Emails versendet werden. Es sind nicht extrem viele aber die üblichen Bestätigungs- und Erinnerungs-Mails die man bei so manchen Funktionen braucht.

Diese Emails werden derzeit einfach per SmtpClient (Authentifiziert) versendet.

Nun ist es aber so dass durch den externen SMTP-Server der Versand hin und wieder etwas länger dauert und dadurch die Seite blockiert und die User dadurch manchmal mehrfach den Absenden-Button klicken.

Nun bin ich am überlegen wie ich das am Besten löse. Den Button zu disablen gehört hier aber schonmal nicht dazu.

Im Internet finden sich mehrere Varianten:

  • mittels ThreadPool.QueueUserWorkItem()
  • lokaler SMTP der als Relay des 'echten' SMTP fungiert
  • mittels MSMQ, also die Nachricht zuerst an die MQ übergeben und mittels eines zusätzlichen Dienstes oder Konsolen-App versenden

Welche ist aber nun die zu bevorzugende Lösung? (Schneller, sicherer Versand hat hier Prio) Was setzt ihr ein oder nehmt ihr blockierende Webseiten in Kauf?
Gibts noch andere Lösungen?

Thx....

16.806 Beiträge seit 2008
vor 12 Jahren

Den Button zu disablen gehört hier aber schonmal nicht dazu.

Das ist aber das normale Verhalten bei einer aktuellen RIA.
Wenn Du die EMail direkt im Controller versendest, statt dies asynchron zu halten, wundert mich auch nicht, dass das ganze etwas länger dauert, als ein normaler Request.

  • mittels ThreadPool.QueueUserWorkItem()

GANZ GANZ GANZ arg schlechte Idee: der IIS benutzt diesen Pool für das Handling der Requests. Daher sollte NIEMALS - an keinem Ort einer Webapplikation auf einem IIS - der ThreadPool verwendet werden.

Die anderen Lösungen... naja. Du hast hier mehr oder weniger überhaupt keine Einwirkung auf die Geschwindigkeit bei einer E-Mail.
Der SMTP Server kann zwar die Mail sofort versenden - aber dann liegt es nicht mehr in Deinen Händen. Virenscanner, Mailfilter, Routing, Entry-Queueing des Ziel-SMTP, Request-Frequenz...
Somit kann hier eigentlich keine Prio bestehen - Du hast ja keine Einwirkung drauf.
Ob die Mail nun in 2 oder 30 Sekunden da ist, wird den Benutzer auch nicht verwundern oder gar verunsichern.

Ich hab mir ne eigene Bibliothek gebastelt, die das ganze übernimmt. Eigenes E-Mail Objekt wird abgelegt, ein separater Thread schaut ständig, ob er etwas verschicken soll und wenn ja dann jagt er es über unsren Exchange Server raus.
Sie hat also einen Queue, sodass das ganze asynchron läuft; aber auch nur im Sekunden-Bereich. Hauptsache die Mail wird binnen der nächsten 30 Sekunden verschickt, dann hat der Anwender die E-Mail in der Regel innerhalb einer Minute.

Bedenke aber auch, dass Du beim gewerblichen Versand nachweisen musst, woher Du die E-Mail Adresse hast - und wann Du welche Mail an diese Adresse versendet hast. Du musst diese also archivieren.

M
M@TUK Themenstarter:in
402 Beiträge seit 2005
vor 12 Jahren

Hallo Abt,

das disablen des Buttons ändert ja nichts daran dass die Seite blockiert,
deswegen ist das keine Lösung. Zum Verhindern mehrfacher Requests aber wohl.

Es geh mir auch nicht darum dass das Email in kürzester Zeit beim User ankommt. Ob das 30 Sekunden oder 5 Minuten dauert ist mir egal. Es geht nur darum, dass das 'Versenden' anders gelöst wird um die Seite nicht zu blockieren.

Dass ThreadPool eher zu vermeiden ist, hab ich mittlerweile auch schon gelesen. Also bleiben mir noch die anderen Möglichkeiten (Queue oder SMTP-Relay).

Ich denke aber der Weg führt Richtung 'Queue' 😉

Wie auch immer ich das implementieren werde...

THX

16.806 Beiträge seit 2008
vor 12 Jahren

Was ich mit dem Button meine: löse es mit Ajax.
Sobald ein Mensch etwas sieht, was sich bewegt, ist die Wartezeit gefühlt geringer.

  1. Button Klicken
  2. Button disablen und ein Ajax-Loadin-Circle einblenden
    Ajax Anfrage an den Server, der die Mail versendet
  3. Sobald das fertig ist den Circle mit nem Tick-Icon ersetzen und dem Anwender zeigen, dass die Mail versendet wurde

Wenn Du die Zeit misst, wird der Request wahrscheinlich genauso lang dauern - doch es fühlt sich für den Anwender einfach nicht so an.