Für den Administrator, Programmierung

Fehlerwerte beim E-Mail-Versand

Das Versenden einer E-Mail geschieht beim Aufruf der Funktion MailClose(). Bei der automatischen E-Mail-Benachrichtigung wird intern dieselbe Funktion verwendet, die einen eventuellen Fehlerwert in der Log-Datei speichert.


Der Versand einer E-Mail teilt sich in mehrere Schritte auf, wobei für jeden Schritt ein eigener Bereich von Fehlercodes definiert ist. Dies erleichert das Ermitteln der Fehlerursache. Die meisten Schritte entsprechen einer Interaktion mit dem Mailserver auf Basis des SMTP-Protokolls. Dabei wird ein SMTP-Kommando an den Server gesendet, worauf dieser mit einem Statuscode antwortet. Je nach Kommando kann der Server verschiedene Fehlercodes zurückliefern, die dann in eine Fehlernummer innerhalb des aktuellen Bereichs umgewandelt werden.

Die Fehlersuche ist oft einfacher, wenn der Mailserver zusätzlich ein SMTP-Log aufzeichnen kann. Die meisten Fehler werden durch Konfigurations-Einstellungen des Mailservers verursacht, die nicht zum beabsichtigten Mailversand passen. Ein SMTP-Log ermöglicht hier oft die Ermittlung der genauen Fehlerursache.

Im Folgendem die einzelnen Schritte, sowie die SMTP-Kommunikation zwischen Client (C) und Server (S):

  • Schritt 1: Prüfen der notwendigen Daten
    Es wird geprüft, ob ein Absender und ein Empfänger definiert wurde.

    Fehler:
    ERR_SMTP_NO_DEST (8) – Es wurde kein Empfänger definiert.
    ERR_SMTP_NO_SOURCE (9) – Es wurde kein Absender definiert.

  • Schritt 2: Mit dem SMTP-Server verbinden
    Es wird versucht, eine TCP/IP-Verbindung mit dem Mailserver aufzubauen.

    Fehler:
    ERR_SMTP_CONNECT (11) – Verbindung konnte nicht aufgebaut werden.

  • Schritt 3: Identifizierung des Servers
    Wenn der Verbindungsaufbau erfolgreich war, meldet sich der Mailserver und identifiziert sich beim Client mit einer Willkommensnachricht:

    S: 220 mail.resse.de SMTP Mailserver

    Fehlerbereich: ERR_SMTP_READY_NACK (20)

  • Schritt 4: Identifizierung des Clients
    Anschließend identifiziert sich der Client beim Server und startet die Sitzung. Dazu schickt dieser eine EHLO-Anfrage:

    C: EHLO mail.resse.de
    S: 250 Ok

    Falls das EHLO-Kommando einen Fehler liefert, kennt der Server kein ESMTP und der Client sendet anschließend ein HELO-Kommando.

    Sofern die Übertragung der E-Mail verschlüsselt erfolgen soll und der Server das auch unterstützt, folgt der Aufbau der SSL/TLS-Session.

    Danach führt der Client die optionale Authentifizierung durch.

    Fehlerbereich: ERR_SMTP_HOST_NACK (30)

  • Schritt 5: Absender übermitteln
    Der Client teilt dem Mailserver mit, mit welcher Absenderadresse die E-Mail verschickt werden soll:

    C: MAIL FROM: emil@resse.de
    S: 250 Ok

    Fehlerbereich: ERR_SMTP_FROM_NACK (50)

  • Schritt 6: Empfänger übermitteln
    Der Client teilt dem Mailserver mit, an welche Empfänger die E-Mail verschickt werden soll (inklusive CC und BCC):

    C: RCPT TO: support@vectorsoft.de
    S: 250 Ok

    Fehlerbereich: ERR_SMTP_TO_NACK (40)

  • Schritt 7: Daten übertragen
    Der eigentliche Nachrichteninhalt wird übertragen. Dazu zählt der Plain-Text, der HTML-Text und die Anhänge. SMTP erwartet an dieser Stelle immer einen Datenanfang, gekennzeichnet durch das Schlüsselwort DATA. Anschließend werden Header-Daten wie Sender, Empfänger und Zeichensatz geschrieben. Es folgen die Nutzdaten und das Datenende, welches durch einen . (Punkt) gekennzeichnet wird:

    C: DATA
    S: 354 End data with .
    C: From: emil@resse.de
    C: To: support@vectorsoft.de
    C: Subject: Neue E-Mail
    C: <Daten>
    C: .
    S: 250 Ok

    Fehlerbereich: ERR_SMTP_DATA_NACK (60)

  • Schritt 10: Vom Server abmelden
    Der Client meldet sich vom Server ab. Die Sitzung wird beendet und die Verbindung geschlossen:

    C: QUIT
    S: 221 Bye

    Fehlerbereich: ERR_SMTP_QUIT_NACK (70)

info

Die SMTP-Status-Codes und deren Bedeutung sind im RFC 3463 definiert. Eine Übersicht aller registrierten SMTP-Status-Codes ist auf der Seite der IANA zu finden.

Der Fehlerbereich gibt lediglich die Position des Fehlers, also an welcher Stelle dieser aufgetreten ist, an. Um feststellen zu können, welcher Fehler aufgetreten ist, wird abhängig vom SMTP-Status-Code ein Fehlerwert zugewiesen:

Fehlerwert Statuscode(s) Bedeutung
ERR_SMTPR_SYNTAX (1) 500; 501; 503 Syntaxfehler
ERR_SMTPR_COMMAND (2) 502; 504 Befehl unbekannt
ERR_SMTPR_UNAVL (3) 421 Service nicht verfügbar
ERR_SMTPR_MEMORY (4) 452; 552 Nicht genügend Speicher
ERR_SMTPR_PROCESSING (5) 451; 554 Interner Verarbeitungsfehler
ERR_SMTPR_MAILBOX (6) 450; 550; 551; 553 Fehler mit der Mailbox
ERR_SMTPR_OTHER (7) Sonstiger Fehler
ERR_SMTPR_AUTH (8) 530 Authentifizierung fehlgeschlagen

Dieser Fehlerwert addiert mit dem Fehlerbereich ergibt den Rückgabewert des Befehls MailClose(). Tritt kein Fehler auf ist das Resultat _ErrOK (0). Bricht die Verbindung während der Übertragung ab, liefert die Funktion den Wert ERR_SMTP_BREAK (12) zurück. Im Praxisfall tritt nur ein Bruchteil aller kombinierbaren Fehler auf.
Im folgendem zwei Beispiele:

Beispiel 1:

In der Protokolldatei eines CONZEPT 16-Servers steht der Eintrag Failed to send alert mail to emil@resse.de (code 38). 3x ist der Fehlerbereich für die Operation "Identifizierung des Clients". Der Fehlerwert 8 sagt aus, dass die Authentifizierung fehlgeschlagen ist.

Es kann davon ausgegangen werden, dass falsche Anmeldedaten für die automatische E-Mail-Benachrichtigung gespeichert wurden, diese sollten überprüft werden.

Beispiel 2:

Der Befehl MailClose() liefert den Rückgabewert 66 zurück. 6x ist der Bereich für den Schritt 7: "Daten übertragen". Der Fehlerwert 6 steht für einen Fehler der sich auf die Mailbox bezieht. Dies ist ein sehr allgemeiner Fehler. Um die Fehlerursache zu finden, schauen wir uns die Fälle an, in denen dieser eintreten kann:

Der Fehler (66) tritt auf, wenn der Mailserver mit einem der Statuscodes 450, 550, 551 und 553 antwortet. Die Fehler 450 und 550 sagen aus, dass die Mailbox nicht verfügbar ist. Dies ist ein Fehler, der durchaus auftreten kann, jedoch würde dieser bereits bei Schritt 6: "Empfänger definieren" auftreten und hätte dadurch den Fehlerwert 46. Der Statuscode 553 wird zurückgegeben, wenn der Name der Mailbox in einem falschen Zeichensatz oder Syntax angegeben wurde. Auch dieser Fehler würde früher auftreten. Bleibt also noch der Statuscode 551. Diesen liefert der Mailserver zurück, wenn die E-Mail weitergeleitet werden muss, der Server dies aber nicht erlaubt. Dies ist beispielsweise der Fall, wenn weder Empfänger- noch Absenderadresse zu einer beim Mail-Server registrierten Domain gehören.

Um dieses Problem zu beheben, muss der Mailserver so konfiguriert werden, dass das Weiterleiten der E-Mail erlaubt ist. Dafür muss die Domain der Senderadresse als erlaubter Sender beim Mailserver eingetragen werden.

5 Kommentare

5 Kommentare “Fehlerwerte beim E-Mail-Versand”

  1. In der Übersicht der IANA werden neben dem Enhanced Status Code, die dazu assoziierten Basic Status Codes aufgelistet.

    Die Enhanced Status Codes sind entstanden, da die Basic Status Codes für DSN (Delivery Status Notifications) nicht mehr ausreichten.

    Von uns ausgewertet wird der Basic Status Code, diese wurden ursprünglich im RFC 821 (http://tools.ietf.org/html/rfc821#page-36) definiert. Allerdings gilt dieses RFC als obsolet.

  2. @Th.Eichele
    Die Status-Codes können in verschiedenen Fällen zurückkommen und jeweils eine andere Bedeutung haben. Die obige Liste bezieht sich allgemein auf den Status-Code, unabhängig von seiner Bedeutung.

  3. @Patrick
    dort sind nur die Enhanced Status Codes erklärt.
    die obige Liste bezieht sich aber vermutlich auf die Basic Staus Codes.
    z.B. 452:
    x.5.2 bedeutet "Syntax Error", der BasicCode 452 ist aber bei 3 verschiedenen Enhanced Codes eingetragen. Ob man daraus
    "Nicht genügend Speicher" erkennt ist dann Glückssache

Kommentar abgeben