Retry-Logik
Verstehen Sie, wie Mail.Land fehlgeschlagene Webhook-Zustellungen erneut versucht
Wenn eine Webhook-Zustellung fehlschlägt, versucht MailLand es automatisch mit zunehmenden Verzögerungen erneut. Diese Seite behandelt den Wiederholungsplan, Zustellstatus, Fehlerbehandlung und wie Sie Zustellungen überwachen und manuell erneut versuchen können.
Wiederholungsplan
Dieser Abschnitt behandelt jedes Ereignis, das der durable dispatcher zustellt: message.*,
suppression.*, account.* und inbound.received. Was speziell für eingehende Ereignisse gilt, steht unter
Eingehende Zustellungen weiter unten.
MailLand versucht eine fehlgeschlagene Zustellung insgesamt bis zu 6 Mal erneut, mit einer zunehmenden Verzögerung vor jedem Wiederholungsversuch:
| Versuch | Verzögerung vor diesem Versuch | Gesamte verstrichene Zeit |
|---|---|---|
| 1 | : (erster Versuch) | 0 |
| 2 | Sofort | ~0 |
| 3 | 1 Minute | ~1 Minute |
| 4 | 5 Minuten | ~6 Minuten |
| 5 | 15 Minuten | ~21 Minuten |
| 6 | 1 Stunde | ~1 Stunde 21 Minuten |
Schlägt der 6. Versuch fehl, wird die Zustellung als dauerhaft fehlgeschlagen markiert: es gibt keine weitere Wartezeit und keinen 7. Versuch.
Wiederholbar vs. Nicht-Wiederholbar
Wiederholbare Antworten
Diese Statuscodes lösen automatische Wiederholungen aus:
408Request Timeout429Too Many Requests500Internal Server Error502Bad Gateway503Service Unavailable504Gateway Timeout- Netzwerkfehler (Timeouts, Socket-Fehler, DNS-Ausfälle)
Nicht-wiederholbare Antworten
Diese Statuscodes werden als dauerhafte Fehler behandelt, kein Wiederholungsversuch:
400Bad Request401Unauthorized403Forbidden404Not Found- Alle anderen
4xx-Fehler (außer 408 und 429) - Eine Redirect-Antwort, die die Validierung nicht besteht (siehe Weiterleitungen) oder das Hop-Limit überschreitet
Wenn Ihr Endpunkt bei einer wiederholbaren Antwort einen Retry-After-Header zurückgibt, verwendet
MailLand diesen Wert anstelle des obigen Plans als Verzögerung vor dem nächsten Versuch: bei jedem
wiederholbaren Status, nicht nur bei 429. Es gibt keine Obergrenze und kein Jitter dafür:
respektieren Sie das auch auf Ihrer Seite, wenn Sie ihn senden, denn ein sehr großer Wert wird genau
so übernommen, wie angegeben.
Weiterleitungen
MailLand behandelt Ihren Endpunkt nicht wie ein Browser. Weiterleitungen werden manuell verfolgt, höchstens 3 Hops, und jeder Hop wird erneut validiert, bevor etwas an ihn gesendet wird:
- das Ziel muss
https://sein: eine Weiterleitung zuhttp://wird abgelehnt, nicht herabgestuft; - das Ziel muss zu einer öffentlichen Adresse aufgelöst werden: eine Weiterleitung zu einer privaten, loopback- oder link-lokalen Adresse wird abgelehnt, und die Anfrage wird nie gesendet;
- das Überschreiten von 3 Hops lässt die Zustellung fehlschlagen.
Eine abgelehnte Weiterleitung wird als Zustellfehler ohne Statuscode gemeldet. Wenn sich Ihr Endpunkt verschoben hat, richten Sie den Webhook auf die neue URL, statt sich auf eine Weiterleitung zu verlassen.
Zustellkonfiguration
| Einstellung | Standard | Beschreibung |
|---|---|---|
| HTTP-Timeout | 15 Sekunden | Maximale Wartezeit pro Zustellversuch |
| Maximale Wiederholungen | 6 Versuche | Gesamte Zustellversuche einschließlich des ersten |
| Automatische Pause-Schwelle | 10 aufeinanderfolgende Fehler | Webhook wird nach dieser Anzahl aufeinanderfolgender Fehler pausiert: verwendet den eigenen pauseThreshold des Webhooks, falls dieser auf einen Wert größer als 0 gesetzt ist, sonst diesen Standardwert |
| Deduplizierung | Solange der Zustelldatensatz existiert | Duplikate desselben Ereignisses werden durch den (WebhookId, EventId)-Constraint unterdrückt, solange die Zeile existiert: mindestens 30 Tage bei zugestellten Zustellungen |
Eingehende Zustellungen
inbound.received wird vom selben durable dispatcher zugestellt wie jedes andere Ereignis, mit demselben
Wiederholungsplan, derselben Behandlung von Retry-After, demselben Zustellverlauf und derselben automatischen
Pausierung wie oben beschrieben.
- Deduplizieren Sie wie bei jedem anderen Ereignis anhand von
event_id(identisch mitX-MLND-Event-Id). Die ID ist pro eingehender Nachricht und Webhook stabil, sodass jeder Versuch für dieselbe E-Mail dieselbe ID trägt. - Ein manueller Replay ist ein neues Ereignis: eine neue
event_id, die ursprüngliche steht indata.replay_of.data.idempotency_keybleibt gleich. - Die
download_urljedes Anhangs wird pro Versuch signiert und ist ab dann 15 Minuten gültig; dieiddes Anhangs ist bei jedem Versuch dieselbe. Siehe Eingehende Webhooks.
Zustellverlauf anzeigen
Anzeigen der vergangenen Zustellungen für einen Webhook:
GET https://api.mail.land/v1/webhooks/{id}/deliveriescurl -X GET "https://api.mail.land/v1/webhooks/wh_abc123/deliveries?limit=20" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Abfrageparameter
| Parameter | Typ | Standard | Beschreibung |
|---|---|---|---|
cursor | string | - | Opaker Cursor aus dem nextCursor der vorherigen Seite. Für die erste Seite weglassen. |
limit | int | 20 | Elemente pro Seite |
status | string | - | Filter: success oder failed |
eventType | string | - | Nach Ereignistyp filtern (z.B. message.delivered) |
from | datetime | - | Startdatum |
to | datetime | - | Enddatum |
{
"items": [
{
"publicId": "p8r2kx7m9wq4rtz",
"eventType": "message.delivered",
"messageId": "t_a1b2c3d4e5f6",
"statusCode": 200,
"responseTimeMs": 145,
"success": true,
"errorMessage": null,
"createdAt": "2026-02-17T12:34:58.000Z",
"attemptNumber": 1
},
{
"publicId": "p8r2kx7m3nq1abc",
"eventType": "message.bounced",
"messageId": "t_d4e5f6a1b2c3",
"statusCode": 503,
"responseTimeMs": 15000,
"success": false,
"errorMessage": "Service Unavailable",
"createdAt": "2026-02-17T12:30:00.000Z",
"attemptNumber": 3
}
],
"nextCursor": "eyJ2IjoxLCJzIjoiY3JlYXRlZGF0OmRlc2MiLCJrIjoi...",
"hasMore": true
}Eine fehlgeschlagene Zustellung erneut versuchen
Versuchen Sie eine bestimmte fehlgeschlagene Zustellung manuell erneut:
POST https://api.mail.land/v1/webhooks/{id}/deliveries/{publicId}/retrycurl -X POST https://api.mail.land/v1/webhooks/wh_abc123/deliveries/p8r2kx7m3nq1abc/retry \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Gibt bei Erfolg 202 Accepted zurück. Der Wiederholungsversuch wird in die Warteschlange eingereiht und verwendet die ursprüngliche Ereignis-Payload.
| Status | Code | Beschreibung |
|---|---|---|
202 | - | Wiederholungsversuch erfolgreich in die Warteschlange eingereiht |
202 | - | Zustellung ist bereits zur Wiederholung eingereiht, kein Fehler, sondern ein No-op |
400 | ALREADY_SUCCEEDED | Eine bereits erfolgreiche Zustellung kann nicht wiederholt werden |
400 | INVALID_REQUEST | Zustellung stammt aus der Zeit vor der dauerhaften Wiederholungsverfolgung oder ist gerade in Bearbeitung |
404 | WEBHOOK_NOT_FOUND | Webhook existiert nicht |
404 | DELIVERY_NOT_FOUND | Zustellungs-ID existiert nicht |
Automatische Pause bei Fehlern
Wenn ein Webhook genügend aufeinanderfolgende fehlgeschlagene Zustellversuche ansammelt, pausiert
MailLand ihn automatisch. Die Schwelle ist der eigene pauseThreshold des Webhooks, falls dieser
auf einen Wert größer als 0 gesetzt ist, sonst der Standardwert von 10 aufeinanderfolgenden
fehlgeschlagenen Zustellversuchen:
- Das
isActivedes Webhooks wird auffalsegesetzt, undpausedAt/pausedReasonwerden befüllt:pausedReasonnennt die Anzahl der Fehler und den letzten Fehler - Eine In-App-Benachrichtigung wird erstellt
- Bis zur Wiederaufnahme des Webhooks werden keine weiteren Ereignisse zugestellt
Der Zähler zählt Versuche, nicht Ereignisse: Ein Ereignis, das seine gesamte Wiederholungs-Leiter ausschöpft, trägt mehrere Fehler bei.
Es gibt keine frühere Warnbenachrichtigung, bevor die Schwelle erreicht wird: prüfen Sie
consecutiveFailures proaktiv (siehe Best Practices unten), statt darauf zu warten, informiert zu
werden.
Einen pausierten Webhook fortsetzen
POST https://api.mail.land/v1/webhooks/{id}/resumecurl -X POST https://api.mail.land/v1/webhooks/wh_abc123/resume \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIs..."Dies aktiviert den Webhook wieder: Es löscht den Pausenstatus, setzt den Zähler für aufeinanderfolgende Fehler auf null zurück und setzt ihn wieder auf aktiv. Der nächste Ereigniszustellversuch wird normal durchgeführt.
Jede erfolgreiche Zustellung setzt den Zähler für aufeinanderfolgende Fehler automatisch auf null zurück. Ein einziger Erfolg nach 9 Fehlern verhindert, dass der Webhook pausiert wird.
Best Practices
- Geben Sie 200 schnell zurück: verarbeiten Sie Webhook-Payloads asynchron. Stellen Sie das Ereignis in die Warteschlange und geben Sie sofort
200zurück. Langwierige Handler riskieren Timeouts. - Verwenden Sie die Ereignis-ID für die idempotente Verarbeitung: der Header
X-MLND-Event-Id(und das entsprechendeevent_id-Feld in den Nutzdaten) ist über Wiederholungen und erneute Zustellungen hinweg stabil: dasselbe zugrunde liegende Ereignis kommt immer mit derselben ID an, egal wie oft es erneut zugestellt wird. Speichern Sie verarbeitete IDs und überspringen Sie bereits bearbeitete, sodass eine doppelte Zustellung bei Ihnen ein No-op ist. - Überwachen Sie aufeinanderfolgende Fehler: prüfen Sie das Feld
consecutiveFailuresbeim Auflisten von Webhooks. Untersuchen Sie die Ursache, bevor die automatische Pause-Schwelle erreicht wird. - Behandeln Sie 429 korrekt: wenn Ihr Endpunkt überlastet ist, geben Sie
429mit einemRetry-After-Header zurück. MailLand wird dies respektieren.
Nächste Schritte
- Signaturverifizierung: Webhook-Authentizität überprüfen
- Ereignisse: vollständige Ereignistyprreferenz
- Webhooks-Übersicht: Webhooks erstellen und verwalten