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.socketstd.net.dnsstd.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,toAddrodersubjectfü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.
