Zuletzt aktualisiert: 2026-03-03•6 Min. Lesezeit
E-Mail-Bounce- und Rejection-Gründe
Wenn eine E-Mail nicht zugestellt werden kann, gibt der empfangende Mailserver einen Fehlergrund zurück. Truncus normalisiert diese in deterministische terminale Status.
Terminale Status
| Status | Bedeutung |
|---|---|
delivered | Mailbox hat die Nachricht akzeptiert |
bounced | Zustellung nach Transportversuch fehlgeschlagen |
rejected | Nachricht vor Zustellversuch abgelehnt |
Fehlergründe
| Grund | Bedeutung | Typischer SMTP-Code | Empfohlene Maßnahme |
|---|---|---|---|
mailbox_full | Postfachspeicher überschritten | 552 | Später erneut versuchen |
user_unknown | Adresse existiert nicht | 550 | Adresse entfernen |
domain_not_found | Domain-DNS nicht auflösbar | NXDOMAIN | Adresse entfernen |
spam_blocked | Vom Spamfilter abgelehnt | 554 | Domain-Reputation prüfen |
policy_block | Domain-Policy-Ablehnung | 550 | Absender-Konfiguration prüfen |
temporary_failure | Transientes Zustellungsproblem | 451 | Später erneut versuchen |
connection_timeout | Empfänger-Server nicht erreichbar | — | Später erneut versuchen |
suppression_list | Adresse zuvor gebounced | — | Nicht erneut versuchen |
mailbox_full
Das Postfach des Empfängers hat sein Speicherkontingent überschritten.
{ "status": "bounced", "reason": "mailbox_full" }
Dies ist ein Soft-Bounce — ein vorübergehender Zustand. Nach einer Verzögerung erneut versuchen.
user_unknown
Die E-Mail-Adresse existiert nicht auf dem Empfänger-Server.
{ "status": "bounced", "reason": "user_unknown" }
Dies ist ein Hard-Bounce. Adresse dauerhaft entfernen und nicht erneut versuchen.
suppression_list
Die Adresse befindet sich auf Truncus' Unterdrückungsliste — sie hat zuvor einen Hard-Bounce oder eine Spam-Beschwerde generiert.
{ "status": "rejected", "reason": "suppression_list" }
Nicht erneut versuchen.
Fehler programmatisch behandeln
const response = await truncus.emails.send({ to, from, subject, html })
switch (response.status) {
case 'delivered':
break
case 'bounced':
if (['user_unknown', 'domain_not_found'].includes(response.reason)) {
await removeEmailAddress(to)
} else {
await scheduleRetry(to, response.reason)
}
break
case 'rejected':
if (response.reason === 'suppression_list') {
await markAddressSuppressed(to)
}
break
}