std.net.smtp

SMTP (Simple Mail Transfer Protocol, RFC 5321) ist das Standardprotokoll zum Versand von E-Mails. Die Unit implementiert den vollständigen SMTP-Dialog: EHLO-Aushandlung, MAIL FROM, RCPT TO, DATA-Sequenz und QUIT. Unterstützt werden alle drei Standard-Ports: SMTP (25), Submission (587) und SMTPS (465).

Einsatzbereiche sind Benachrichtigungssysteme, Alerting, automatisierte Reports, Transaktions-E-Mails und alle Anwendungen, die E-Mails direkt ohne externen Mail-Client versenden müssen.


Imports

  • std.net.socket
  • std.net.dns
  • std.net.types

Konstanten

Name Typ Wert Sichtbarkeit
SMTP_PORT int64 25 pub
SMTP_SUBMISSION_PORT int64 587 pub
SMTPS_PORT int64 465 pub
SMTP_READY int64 220 pub
SMTP_QUIT int64 221 pub
SMTP_OK int64 250 pub
SMTP_AUTH_CONTINUE int64 334 pub
SMTP_DATA_START int64 354 pub
SMTP_AUTH_SUCCESS int64 235 pub

Typen

SMTPConn (struct)

Feld Typ Bedeutung
conn TCPConn darunterliegende TCP-Verbindung
connected int64 1, sobald Verbindung steht und die Begrüßung gelesen ist

SMTPEmail (struct)

Feld Typ Bedeutung
from int64 Zeiger auf die Absenderadresse (pchar)
toAddr int64 Zeiger auf die Empfängeradresse (pchar)
subject int64 Zeiger auf den Betreff (pchar)
body int64 Zeiger auf den Nachrichtentext (pchar)

Funktionen

Signatur Sichtbarkeit Beschreibung
SMTPReadResponse(conn: SMTPConn, buf: int64): int64 pub SMTP-Antwortcode vom Server lesen
SMTPSendCmd(conn: SMTPConn, cmd: int64, len: int64): int64 pub SMTP-Kommando an Server senden
SMTPStrLen(s: int64): int64 pub Länge eines SMTP-Strings ermitteln
SMTPBuildEhlo(hostname: int64): int64 pub EHLO-Befehlsstring zusammenbauen
SMTPBuildMailFrom(sender: int64): int64 pub MAIL FROM-Befehlsstring zusammenbauen
SMTPBuildRcptTo(recipient: int64): int64 pub RCPT TO-Befehlsstring zusammenbauen
SMTPBuildMessage(email: SMTPEmail): int64 pub E-Mail-Nachrichteninhalt aufbauen
SMTPConnect(host: int64, port: int64): SMTPConn pub TCP-Verbindung zum SMTP-Server herstellen
SMTPEhlo(conn: SMTPConn, hostname: int64): int64 pub EHLO-Dialog mit Server durchführen
SMTPMailFrom(conn: SMTPConn, sender: int64): int64 pub Absenderadresse an Server übermitteln
SMTPRcptTo(conn: SMTPConn, recipient: int64): int64 pub Empfängeradresse an Server übermitteln
SMTPDataStart(conn: SMTPConn): int64 pub DATA-Sequenz am Server einleiten
SMTPSendMessage(conn: SMTPConn, email: SMTPEmail): int64 pub E-Mail-Daten in DATA-Phase senden
SMTPSend(conn: SMTPConn, email: SMTPEmail): int64 pub Vollständige E-Mail über SMTP versenden
SMTPQuit(conn: SMTPConn): int64 pub SMTP-Sitzung regulär beenden
SMTPClose(conn: SMTPConn) pub SMTP-Verbindung schließen und freigeben

—-

Grenzen und Ablehnung (#1610)

<WRAP alert> SMTPBuildMessage schrieb bis lyxc 1.1.1C bis zu 1305 Byte über den Puffer hinaus (#1610): die Schleifengrenze zählte die Eingabe, geschrieben wurde an der Schreibposition — und das Dot-Stuffing verdoppelt jeden Zeilenanfang mit Punkt. Dazu ließen sich über from und subject beliebige Kopfzeilen einschleusen (Header-Injection), etwa zusätzliche Empfänger. </WRAP>

Seither gilt:

  • Jede Schreibstelle prüft die Grenze. Der Nachrichtenpuffer fasst 8192 Byte.
  • Passt die Nachricht nicht hinein, wird sie abgelehnt — Rückgabewert 0, kein Versand. Eine halb gebaute Mail wäre schlimmer als keine.
  • CR oder LF in from, toAddr oder subject führt zur Ablehnung, und zwar vor der Allokation.

Der Rückgabewert von SMTPBuildMessage ist deshalb zu prüfen: 0 heißt „nicht gebaut„, nicht „leer“.

Letzte Aktualisierung: 2026-08-18 — Pufferüberlauf, Header-Injection und Ablehnungsverhalten ergänzt (#1610); Struct-Felder nachgetragen.