2009-03-09 2 views
4

Unser Unternehmen sendet jede Woche einen Newsletter an eine große Anzahl von Abonnenten. Als das Geschäft sehr jung war, nutzten sie eine "kostenlose" Version eines Massenmailers, die sechs Stunden benötigte, um 5K-Mails zu verschicken und jeden Reverse-DNS-Check im Internet zu treffen.Sinnvolle Interaktion mit IIS SMTP Server in .Net

Ich aktualisierte dies zu einem maßgeschneiderten .Net-Widget, das auf dem richtigen Server lief und bis zu 20k-Mails in einer halben Stunde mit voller DNS-Compliance senden konnte. Leider (oder zum Glück, abhängig von Ihrem Standpunkt) ist unsere Mailingliste diesem einfachen Tool mittlerweile entwachsen. Vor allem, weil es keine ausreichende Drosselung gibt, kann es mehr Mails erzeugen, als der Server bequem auf einmal senden kann. Ich muss tatsächlich überwachen, wie voll die verfügbare ausgehende E-Mail-Speicherzuweisung des IIS-SMTP-Servers ist, und die Last entsprechend drosseln.

Leider kann ich keine Informationen darüber finden, wo ein Mail-Objekt hingeht, wenn (oder auch wenn) es in eine Mail umgewandelt wird. Ich kann einen Dateisystemwächter implementieren, wenn ich einen Ort zum Anschauen habe, momentan nicht. Wenn keine echte Mail-Datei jemals erstellt wird, muss ich eine erstellen, um die Funktionalität zu implementieren, aber ich muss wissen, wo ich sie ablegen soll. Es würde auch beruhigender sein, dem System zu erlauben, das Senden irgendwie zu bestätigen, aber ich habe keine Ahnung, wie man Daten vom System abruft, die aussagen, dass eine Mail gesendet wurde.

Umfangreiches Googeln hat sich in diesen Punkten als vage erwiesen; also fragte ich mich, ob jemand hier wüsste, wo ich eine Anleitung zu diesen Problemen bekommen könnte oder ob er mir sonst in die richtige Richtung zeigen könnte.

Vielen Dank.

EDIT: Am Ende habe ich aufgegeben, den Durchsatz auf dem IIS-SMTP-Server als eine schlechte Arbeit zu messen. Es schien einfach nicht spielen zu wollen. Ich führe jetzt meine Anmeldung an einem separaten Ort durch und schicke sie danach einfach zum SMTP-Server. Ich kenne immer noch niemanden, der wirklich versucht, die Vorgänge auf dem IIS-SMTP-Server im Auge zu behalten, und daher bleibt diese Frage bei diesem Schreiben unbeantwortet.

Oh well ...

Antwort

7

Okay, so habe ich jetzt seit Ewigkeiten an diesem Projekt gearbeitet, und ich dachte, ich könnte meine Erkenntnisse mit der Welt teilen.

Die IIS SMTP-Server

Alle E-Mails unter Verwendung des IIS SMTP-Servers erstellt werden, in erster Linie auf das Pickup-Verzeichnis gesendet. Wenn Sie eine E-Mail senden, müssen Sie in der Matrix-Zeit arbeiten, um sie tatsächlich dort zu sehen, weil sie wahrscheinlich sofort losgeht.

Auf einer einzelnen Mail-Weg aus der Tür durchläuft es den Warteschlange-Ordner in IIS.

Wenn Sie den Leistungsindikator beobachten möchten, um diesen Prozess zu überwachen, sollten Sie sich die "Remote Queue Length" ansehen. (Der Grund dafür ist, dass die "Local Queue Length" Mails überwacht, die lokal im Netzwerk gesendet werden. "Remote" bezieht sich in diesem Fall auf "Outside into the world". Die spezifische Definition von "Local" entgeht mir beim Senden keine lokale Mail, aber ich stelle mir vor, dass es sich in der Warteschlange befindet, um zu Postfächern zu gelangen, die in der spezifischen Installation von IIS auf dem Server oder einer lokalen Gruppierung enthalten sind.)

Aus Exchange-Sicht scheint es das Äquivalent von Mails zu sein, die gesendet werden die Exchange Domain und diejenigen, die aus dieser Domain in die Welt geschickt werden.

Wie auch immer. Die Remote Queue Length erzählt nicht die ganze Geschichte. Sie müssen auch die Fernwiederholungswarteschlange, die Anzahl der aktuellen ausgehenden Verbindungen und, für Gürtel und geschweifte Klammern, die tatsächliche Anzahl der Dateien im Warteschlangenverzeichnis betrachten.

Hier ist der Grund:

  • Remote Queue: Alle Nachrichten, die noch nicht gesendet worden ist, aber oft dies versucht wurde. Die Anzahl der E-Mails, die derzeit offenen -Verbindungen zugewiesen sind, werden nicht gezählt, da sie in einem Zustand sind, in dem sie "versucht" werden.
  • Remote-Wiederholungswarteschlange: Alle Nachrichten, die noch nicht gesendet wurden, haben bei einen Punkt in der Vergangenheit einer offenen Verbindung für die Lieferung zugeordnet. Offensichtlich muss die Lieferung fehlgeschlagen sein oder die Nachricht wäre geliefert worden. Alle Nachrichten, die derzeit einer offenen Verbindung für einen Neuversuch zugewiesen sind, werden nicht gezählt.
  • Aktuelle ausgehende Verbindungen: Wird angezeigt, wenn der Server versucht, in die Warteschlange gestellte Nachrichten zu senden, kann mehr als eine Nachricht einer ausgehenden Verbindung zugewiesen werden. Die so zugewiesenen Nachrichten werden nicht in der Remote-Warteschlange oder in der Remote Retry-Warteschlange gezählt. Physikalisch
  • Dateien im Warteschlangenverzeichnis: Diese zeigt die Anzahl der E-Mails immer noch in das Warteschlange-Verzeichnis. Dies wird verringern, wie Mails erfolgreich geliefert werden.

Beispiel: Wenn Sie 0 ausgehende Verbindungen und 50 Mails im Queue-Verzeichnis haben dann die Remote Queue, Retry Queue und physische Dateien auf 50 alle lesen Wenn ein Wiederholungs Flag gesetzt wird (dies ist eine Einstellung in IIS) erhöht sich die Anzahl der Verbindungen und die Anzahl der Mails in den Warteschlangen sinkt. Bis eine E-Mail zugestellt wird, bleibt die Anzahl der physischen Dateien gleich. Da jedoch mehr als eine E-Mail über eine aktuelle Verbindung gesendet werden kann, kann eine Verbindung dazu führen, dass die Länge der Warteschlange für Warteschlangen und Wiederholungswarteschlangen 47 oder niedriger ist. Wenn während des Wiederholungsversuchs alle E-Mails erfolgreich zugestellt werden, nimmt die Anzahl der physischen Dateien im Warteschlangenverzeichnis ab. Wenn die Verbindung geschlossen wird, sollten sich die Warteschlangenzähler wieder stabilisieren.

Logging

Es ist möglich, mit.Net-Mail-Bibliothek zum Angeben eines Pickup-Verzeichnisses, das vom IIS-Standard getrennt ist. Hier können Sie E-Mails in Warteschlangen schreiben und einen maßgeschneiderten Service erhalten, um die E-Mails gelegentlich in das IIS-Verzeichnis zu verschieben, in dem der IIS-Dienst Aufgaben übernimmt und E-Mails in Warteschlangen versendet.

Um dies zu tun, suchen Sie nach der "DeliveryMethod" -Eigenschaft des SmtpClient-Objekts, die auf SmtpDeliveryMethod.SpecifiedPickupDirectory festgelegt werden sollte.

Um das SpecifiedPickupDirectory tatsächlich festzulegen, sollten Sie die PickupDirectoryLocation-Eigenschaft des SmtpClient festlegen.

Wenn E-Mails an diesen Ort gesendet werden, werden sie als .eml-Dateien gespeichert. Der Dateiname ist eine GUID. Dies bedeutet, dass mehrere E-Mails in einer im Wesentlichen zufälligen Reihenfolge versandt werden. Sie könnten theoretisch Code schreiben, um diese Situation zu adressieren, falls gewünscht. Die .eml-Datei folgt einem Standardformat, das durch Öffnen der .eml im Editor gelesen werden kann. Wenn Sie dies analysieren, können Sie Informationen für ein Protokoll extrahieren.

Ich hoffe, dass dieser hochrangige Überblick über die Funktionsweise des SMTP-Servers in IIS für jemanden hilfreich ist, der sich in einer ähnlichen Position befindet wie im März.

1

würde ich die PerformanceCounter Komponente verwenden Sie den SMTP-Dienst des Local Queue Length Zähler zu lesen. Das sollte Sie in der Kontrolle halten :-)

0

Wenn Ihr .net Widget maßgeschneidert ist, warum nicht einfach seine Ausgabe zu etwas (definierbar) Durchsatz drosseln?

Als eine Alternative können Sie möglicherweise einige Registry-Einstellungen für den SMTP-Server fiedeln.

http://blog.rednael.com/CommentView,guid,dc20366c-3629-490a-a8ee-7e8f496ef58b.aspx

Anscheinend gibt es auch einige WMI Zähler (SMTP Server \ Remote Queue Length und SMTP-Server \ Remote Retry Queue Length), die Ihnen nützliche Informationen geben.

http://www.tech-archive.net/Archive/Internet-Server/microsoft.public.inetserver.iis.smtp_nntp/2008-02/msg00011.html