2 Stimmen

Klassische ASP-Website bricht beim Senden von E-Mails ab (IIS6, Standard-SMTP-Server)

Ich habe gerade die klassische ASP-Website eines Kunden auf seinen eigenen VPS-Server (Windows 2003, 32-Bit, IIS6, virtueller SMTP-Server) verschoben, und nach etwa 12 Stunden begann die Website zu versagen, wenn sie versuchte, E-Mails zu senden (CDO.Message).

Jedes Skript, das eine E-Mail verschickte, brauchte sehr lange, bevor es den Fehler zurückgab: Active Server Pages, ASP 0113, Zeitüberschreitung des Skripts. Die Standardzeitüberschreitung ist vorhanden. Seltsamerweise konnte die benutzerdefinierte Fehlerseite, die mir Fehler mit der gleichen E-Mail-Sendemethode und den gleichen Einstellungen (eigentlich die gleiche Funktion) sendet, mir die Fehlermeldung senden.

Ich musste die Website zum Laufen bringen, also habe ich den SMTP-Server gestoppt/gestartet, was nicht geholfen hat, dann habe ich IIS neu gestartet, was das Problem sofort behoben hat.

Ich bin besorgt, dass dies wieder passieren könnte. Haben Sie einen Vorschlag, was dieses Problem verursachen könnte, oder muss der Standard-SMTP-Server einige zusätzliche Einstellungen vornehmen, um mit einer Website mit hohem Datenaufkommen zurechtzukommen?

2voto

dmarietta Punkte 1930

Da klassischer ASP-Code eine externe COM-basierte Komponente aufrufen muss, um E-Mails zu versenden (das ist es, was Sie tun, wenn Sie eine CDO-Nachricht erstellen --- jedes Mal, wenn Sie einen CreateObject-Aufruf in Ihrem ASP-Code haben, ist das COM), scheint der ASP-Code zu hängen, wenn die externe Komponente lange braucht, um zu antworten. Zum Beispiel werden die meisten SMTP-Komponenten synchron versuchen, die Nachricht an den SMTP-Server zu senden, was die Ausführung Ihres ASP-Codes blockiert, bis die E-Mail-Nachricht gesendet wurde. Dies wird zu einem Problem bei stark ausgelasteten SMTP-Servern, da diese sehr langsam auf Verbindungsanfragen und SMTP-Befehle reagieren können. Ein weiterer Nachteil ist, dass viele ISPs/Hosts versuchen, die Geschwindigkeit, mit der Sie E-Mails versenden können, zu drosseln, indem sie ihre SMTP-Server absichtlich langsam reagieren lassen. Schlimmer noch, manche Hosts gehen sogar so weit, dass sie die nachfolgenden Verbindungen über einen bestimmten Zeitraum hinweg immer langsamer machen. Dies kann die Leistung Ihrer Website erheblich beeinträchtigen, da Ihr Seitencode während des SMTP-Versands in der Regel blockiert wird.

Die beste Lösung wäre die Verwendung eines Hosts oder SMTP-Servers, der solche restriktiven Maßnahmen nicht durchsetzt. Andernfalls gibt es eine Möglichkeit, dieses Problem durch die Verwendung von Nachrichten-Warteschlangen zu umgehen. Wenn Sie CDO verwenden, bedeutet dies, dass Sie den Microsoft SMTP-Dienst auf Ihrem IIS-Webserver für die Verwendung konfigurieren müssen. Dieser kann auch dann richtig konfiguriert werden, wenn Sie eine andere SMTP-Software auf dem IIS-Rechner haben. Sobald der Microsoft SMTP-Dienst auf Ihrem IIS-Server läuft, kann er E-Mails auf dem Server in eine Warteschlange stellen und sie asynchron zu Ihrem Anwendungs-/Seitencode an den konfigurierten SMTP-Server weiterleiten. Bei der Konfiguration des Microsoft SMTP-Dienstes müssen Sie einen so genannten "Smart Host" definieren. Dabei handelt es sich einfach um den SMTP-Server, an den die ausgehenden E-Mails zur Zustellung in Ihrem Netzwerk weitergeleitet werden sollen.

Sobald Sie das konfiguriert haben, müssen Sie nur noch Ihren Code ändern, der CDO verwendet, um die E-Mail-Nachricht in die Warteschlange zu stellen, anstatt zu versuchen, sie zu senden. In Ihrem CDO-Code sollten Sie eine Zeile haben, die CDO-Feldwerte setzt, die etwa so aussehen:

objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 

Sie möchten den Wert für das Feld "sendusing" von einem Wert von 2 auf einen Wert von 1 ändern. Dies sind die Aufzählungswerte für die Enums cdoSendUsingPort (2) und cdoSendUsingPickup (1). Wenn Sie dies getan haben, können Sie auch die Felder "smtpserver" und "smtpserverport" weglassen, da diese von der Konfiguration Ihres Microsoft SMTP-Dienstes überschrieben werden. Sobald Sie dies getan haben, wird Ihr Asp-Code die E-Mail-Nachricht schnell generieren und sie wird in die Warteschlange des IIS-Server-Ordners für die Postabholung gestellt. So wird Ihre Anwendung / Ihr Seitencode viel schneller ausgeführt. Die ausgehenden E-Mails werden sich möglicherweise im Warteschlangenordner ansammeln, da der SMTP-Dienst langsam im Hintergrund an der Zustellung arbeitet. Dadurch werden die E-Mails zwar nicht schneller versendet, aber es wird verhindert, dass Ihr Code aufgrund eines langsamen SMTP-Servers blockiert wird.

0 Stimmen

Obwohl ich Jmail schon früher benutzt hatte, um Mails zu versenden, indem ich sie in den Abholordner legte, wusste ich nicht, dass dies mit der CDO-Mailkomponente möglich ist, also +1 dafür, dass Sie gezeigt haben, wie das geht.

0voto

johna Punkte 10350

Später fand ich heraus, dass das eigentliche Versenden der E-Mail das Problem nicht verursachte, sondern die Tatsache, dass ich den HTML-Text für die E-Mail generierte, indem ich HTML von einer anderen ASP-Seite abrief (über das XML-Objekt).

Ich versuchte verschiedene Dinge, um das Problem zu beheben, einschließlich des Wechsels der E-Mail-Komponenten (zu Jmail) und der Verwendung verschiedener Versionen des XML-Objekts, aber das Problem trat immer noch sporadisch auf.

Schließlich änderte ich den Code, um den HTML-Code für den E-Mail-Text zu generieren, anstatt eine andere ASP-Seite aufzurufen und deren Antwort zu lesen.

Die Beseitigung der Verwendung des XML-Objekts scheint das Problem gelöst zu haben, aber die Ursache wurde nie gefunden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X