Sign inGet Started

Zeitgesteuerter Versand

Setzen Sie scheduled_at, um eine Nachricht bis zu einem bestimmten Zeitpunkt zurückzuhalten. Wenn dieser Zeitpunkt erreicht ist, durchläuft die Nachricht den normalen Zustellungsprozess und erzeugt die gleichen Events wie ein sofortiger Versand. Ihre Anwendung braucht keinen eigenen Scheduler.

Versand planen

Fügen Sie einem normalen POST /v1/email/messages-Versand einen scheduled_at-Zeitstempel hinzu. Am Payload ändert sich sonst nichts.
const msg = await bird.email.send({
  from: "news@yourdomain.com",
  to: ["delivered@messagebird.dev"],
  subject: "Your weekly digest",
  html: '<p>Here is what happened this week...</p><p><a href="{{ bird.unsubscribe_url }}">Unsubscribe</a></p>',
  category: "marketing",
  scheduled_at: "2027-01-15T09:00:00Z",
});
console.log(msg.id, msg.status); // "em_…", "accepted"
Der Aufruf gibt sofort 202 Accepted mit der em_-präfixierten Nachrichten-ID und status: accepted zurück. Es ist dasselbe Nachrichtenobjekt, das ein sofortiger Versand liefert, plus scheduled_at in UTC, sodass Sie den Sendezeitpunkt ohne zusätzliches Lesen bestätigen können. Die Annahme ist synchron, der Versand ist verzögert. Lassen Sie scheduled_at in der Anfrage weg, wird die Nachricht sofort gesendet, und die Antwort enthält keinen scheduled_at-Schlüssel.
Leseergebnisse werden asynchron aktualisiert. Eine gerade geplante Nachricht kann bei Nachricht abrufen zunächst 404 zurückgeben und in der Nachrichtenliste oder im Dashboard fehlen. Große Inhalte oder Anhänge können die Wartezeit verlängern, während wir sie speichern. Bewahren Sie die ID und scheduled_at aus der 202-Antwort auf und wiederholen Sie die Leseanfragen mit Wartepausen unter Verwendung dieser ID. Sie können mit dieser ID auch stornieren, bevor die Nachricht erscheint.
Wenn eine Nachricht erscheint, während sie noch auf den Versand wartet, zeigen Leseanfragen status: scheduled und ihren Wert für scheduled_at an:
Codebeispiel
{
  "id": "em_01ky7q24hafjgvzfg02v3m177p",
  "status": "scheduled",
  "scheduled_at": "2027-01-15T09:00:00Z",
  "category": "marketing"
}
Wenn der Zeitpunkt erreicht ist, geben wir die Nachricht frei und ihr Status durchläuft die üblichen Zustände (accepted, dann processed, dann delivered usw.). scheduled_at bleibt danach gesetzt, sodass Sie immer sehen können, wofür eine Nachricht geplant war.
Der Versand einer Nachricht kann beginnen, bevor die Leseergebnisse aktualisiert sind. Deshalb sehen Sie möglicherweise zuerst einen späteren Status. Es gibt keine feste Wartezeit, nach der eine Leseanfrage die Nachricht garantiert anzeigt.
Das Planen verbraucht eine Einheit des Kontingents für geplante E-Mails Ihrer Organisation im Abrechnungszeitraum. Eine Überschreitung wird mit einem 422 (E10003) abgelehnt.

Inline-Inhalt oder eine Vorlage zum späteren Versand einplanen

Verwenden Sie scheduled_at mit Inline-Inhalt oder einer gespeicherten Vorlage, aufgebaut wie ein sofortiger Vorlagenversand. Wir legen bei Annahme der Anfrage die veröffentlichte Version, die ausgewählte Sprache und die Parameterwerte fest und senden diese Version zum geplanten Zeitpunkt. Die Veröffentlichung einer neueren Version ändert die Auswahl nicht. Wenn die Vorlage vor dem geplanten Zeitpunkt gelöscht wird, wird die Nachricht abgelehnt und nicht gesendet.
Eine Nachricht der Kategorie marketing erhält einen Abmeldelink als kleine Fußzeile am Ende ihres Nachrichtentexts. Um den Link selbst zu platzieren, fügen Sie {{ bird.unsubscribe_url }} in jeden übergebenen Nachrichtentext ein, bei einem Vorlagenversand in die Nachrichtentexte der Vorlage.
Ein Batch-Element akzeptiert scheduled_at zu den gleichen Bedingungen, sodass ein Batch geplante und sofortige Nachrichten mischen kann. Jedes geplante Element verbraucht eine eigene Einheit des Kontingents, und der gesamte Batch wird abgelehnt, wenn der Zeitpunkt eines Elements außerhalb des zulässigen Bereichs liegt. Jedes geplante Element enthält sein eigenes scheduled_at in der Batch-Antwort, und ein Element, das sofort gesendet wird, hat keinen scheduled_at-Schlüssel; die Batch-Referenz zeigt beides in einer Antwort.
Ein Payload für sofortigen Versand kann dennoch zu groß zum Planen sein. Wenn Body, Empfängerliste oder Metadaten das Planungslimit überschreiten, gibt API einen 422 zurück. Reduzieren Sie diese Felder oder senden Sie die Nachricht sofort.

Sendezeitpunkt wählen

scheduled_at ist ein absoluter RFC 3339-Zeitstempel. Zwei Regeln gelten dafür:
  • Er muss zwischen 30 Sekunden und 30 Tagen in der Zukunft liegen. Näher als 30 Sekunden oder weiter als 30 Tage wird mit einem 422 abgelehnt. Die Untergrenze verhindert, dass eine geplante Nachricht mit einem sofortigen Versand konkurriert. 30 Tage sind der weiteste Horizont, für den wir eine Nachricht vorhalten.
  • Geben Sie einen exakten Zeitpunkt an. Verwenden Sie einen UTC-Z (2027-01-15T09:00:00Z) oder ein explizites Offset (2026-07-30T09:00:00-04:00, derselbe Zeitpunkt wie 13:00:00Z). Wir vergleichen den Zeitpunkt mit der aktuellen Uhrzeit und interpretieren nie eine reine Ortszeit oder wenden die Zeitzone eines Empfängers an. Um um 9 Uhr in der jeweiligen Ortszeit jedes Empfängers zu senden, berechnen Sie diese Zeitpunkte selbst und planen Sie einen Versand pro Zeitzone.
Relative Ausdrücke wie "in 2 hours" werden nicht akzeptiert. Senden Sie einen aufgelösten Zeitstempel.

Geplante Nachrichten auflisten

Filtern Sie die Nachrichtenliste nach Status, um bereits sichtbare Nachrichten zu sehen, die noch auf den Versand warten. Eine neu angenommene geplante Nachricht kann fehlen, während ihr Inhalt hochgeladen wird oder die Leseergebnisse noch aktualisiert werden:
for await (const message of bird.email.list({ status: "scheduled" })) {
  console.log(message.id, message.scheduled_at);
}
status=canceled listet die Nachrichten auf, die Sie vor dem Versand storniert haben. Sobald eine geplante Nachricht ausgelöst wird, gelangt sie in die Pipeline und erscheint mit den Zustellstatus wie jeder andere Versand. Das E-Mail-Protokoll im Dashboard bietet die gleichen Filter Scheduled und Canceled.

Geplanten Versand stornieren

Stornieren Sie eine Nachricht jederzeit, bevor der Versand beginnt, mit POST /v1/email/messages/{message_id}/cancel:
await bird.email.cancel("em_abc123");
Eine erfolgreiche Stornierung gibt 204 No Content zurück. Der Status der Nachricht wird canceled, sie wird nie gesendet, und ein email.canceled-Webhook wird ausgelöst. Vier Punkte sind wichtig:
  • Nur eine noch geplante Nachricht kann storniert werden. Eine Nachricht, deren Versand bereits begonnen hat, die bereits gesendet oder bereits storniert wurde, gibt 409 zurück:
    Codebeispiel
    {
      "error": {
        "type": "conflict_error",
        "code": "E10005",
        "name": "EmailNotCancelable",
        "message": "This message cannot be canceled.",
        "remediation": "Only a scheduled message that has not started sending can be canceled. Once sending begins there is no way to pull it back."
      }
    }
    Wenn der Sendezeitpunkt erreicht wird, kann eine Stornierung auch das Rennen gegen den Versand selbst verlieren und aus demselben Grund 409 zurückgeben.
  • Sie können den Versand stornieren, während Inhalte noch hochgeladen werden. Bei einer geplanten E-Mail mit Anhängen oder einem großen Nachrichtentext werden nach der Antwort 202 möglicherweise noch Inhalte gespeichert. Nach einer erfolgreichen Stornierung bleibt der Versand storniert, auch wenn der Upload später abgeschlossen wird.
  • Stornieren gibt das Kontingent für geplante E-Mails nicht zurück. Die beim Planen verbrauchte Einheit bleibt verbraucht. Das verhindert, dass eine Planen-und-Stornieren-Schleife das Kontingent umgeht. Ihr reguläres Versandkontingent bleibt unberührt, da es erst belastet wird, wenn eine Nachricht tatsächlich gesendet wird.
  • Stornieren kann sicher wiederholt werden mit einem Idempotency-Key, wie jeder andere Schreibvorgang.
Um einen geplanten Versand auf einen anderen Zeitpunkt zu verschieben, stornieren Sie ihn und reichen Sie einen neuen Versand mit dem neuen scheduled_at ein. Sie erhalten eine neue em_-ID.

Was zum Sendezeitpunkt passiert

Das Planen ändert nur, wann eine Nachricht freigegeben wird. Aufbau und Regeln bleiben gleich. Anhänge, Kategorie, Tags und Metadaten verhalten sich genau wie bei einem sofortigen Versand und werden auf den Webhook-Events genauso zurückgegeben. Fünf Prüfungen verteilen sich auf die beiden Zeitpunkte:
  • Payload- und Domain-Validierung laufen sofort. Ein fehlerhafter geplanter Versand schlägt beim API-Aufruf mit einem 422 fehl, sodass Sie es jetzt erfahren und nicht erst um 9 Uhr.
  • Die Absenderdomain wird zum Sendezeitpunkt erneut geprüft. Wenn Ihre from-Domain zum geplanten Zeitpunkt nicht mehr verifiziert ist, wird die Nachricht nicht gesendet. Ihre Empfänger werden als rejected mit einer Begründung zurückgegeben, statt E-Mails von einer nicht verifizierten Domain zu erhalten. Halten Sie die Domain für das gesamte Zeitfenster verifiziert.
  • Ihr Versandkontingent wird zum Sendezeitpunkt belastet. Das reguläre Versandkontingent wird verbraucht, wenn die Nachricht ausgelöst wird. Das Planen lässt das Kontingent unverändert. Ist das Kontingent zum Sendezeitpunkt erschöpft, werden die Empfänger abgelehnt.
  • Unterdrückung wird zum Sendezeitpunkt ausgewertet, anhand Ihrer Unterdrückungsliste in ihrem dann aktuellen Stand. Jemand, der sich zwischen Planung und Versand abmeldet, wird also trotzdem berücksichtigt.
  • Eine gespeicherte Vorlage muss zum Sendezeitpunkt noch existieren. Wenn Sie die Vorlage nach dem Planen löschen, wird die Nachricht nicht gesendet. Ihre Empfänger werden als rejected mit generation_failure zurückgegeben.

Fehler

StatusCodeWann
422E10003Das Kontingent für geplante E-Mails Ihrer Organisation im Abrechnungszeitraum ist aufgebraucht
422scheduled_at liegt weniger als 30 Sekunden oder mehr als 30 Tage in der Zukunft
422Der Payload ist zu groß zum Vorhalten; reduzieren Sie Body, Empfänger oder Metadaten, oder senden Sie sofort
409E10005Die Nachricht kann nicht mehr storniert werden: Versand hat bereits begonnen, wurde gesendet oder storniert
404Die Leseergebnisse berücksichtigen die Annahme noch nicht, oder in diesem Workspace gibt es keine Nachricht mit dieser ID

Webhooks

Zwei Events sind spezifisch für die Planung, zusätzlich zu den üblichen Zustellungs-Events:
  • email.scheduled meldet eine Nachricht, die auf den zukünftigen Zeitpunkt scheduled_at wartet. Bei Vorlagen wird die ausgewählte Version zum Sendezeitpunkt erneut geladen und ihr Inhalt vorbereitet. Dieses Ereignis kann eintreffen, bevor diese Arbeit abgeschlossen ist.
  • email.canceled wird ausgelöst, wenn eine geplante Nachricht vor dem Versand storniert wird.
Wenn die Nachricht ausgelöst wird, folgt die normale email.accepted-Kette unverändert.
Ereignisse zu geplanten Nachrichten werden asynchron veröffentlicht. Eine Nachricht kann den geplanten Status verlassen, bevor email.scheduled veröffentlicht wird. Der Empfang eines Webhooks bedeutet nicht, dass die Leseendpunkte diesen Status bereits anzeigen.

Nächste Schritte

Verwandte Ressourcen

Weiter mit der Dokumentation, Anleitungen und Beispielen zu diesem Thema. Die Ressourcen sind auf Englisch.

Implementierungs-Briefing erhalten