Sign inGet started

Invio programmato

Imposta scheduled_at per trattenere un messaggio fino a un orario specifico. Quando quell'orario arriva, il messaggio entra nel normale ciclo di vita della consegna e produce gli stessi eventi di un invio immediato. La tua applicazione non ha bisogno di un proprio scheduler.

Programmare un invio

Aggiungi un timestamp scheduled_at a un normale invio POST /v1/email/messages. Il resto del payload non cambia.
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>",
  category: "marketing",
  scheduled_at: "2027-01-15T09:00:00Z",
});
console.log(msg.id, msg.status); // "em_…", "accepted"
La chiamata restituisce subito 202 Accepted con l'ID del messaggio prefissato da em_ e status: accepted. È lo stesso oggetto messaggio restituito da un invio immediato, più scheduled_at riportato in UTC, così puoi confermare l'orario di invio senza una lettura successiva. L'accettazione è sincrona; la consegna è differita. Ometti scheduled_at dalla richiesta e il messaggio parte subito, e la risposta non contiene la chiave scheduled_at.
Sugli endpoint di lettura il messaggio mostra status: scheduled con il proprio scheduled_at fino all'arrivo dell'orario di invio:
Esempio di codice
{
  "id": "em_01ky7q24hafjgvzfg02v3m177p",
  "status": "scheduled",
  "scheduled_at": "2027-01-15T09:00:00Z",
  "category": "marketing"
}
Quando arriva il momento, il messaggio viene rilasciato e il suo stato avanza attraverso gli stati consueti (accepted, poi processed, poi delivered e così via). scheduled_at resta impostato anche dopo, così puoi sempre vedere per quando era programmato un messaggio.
La programmazione consuma un'unità della quota di email programmate della tua organizzazione per il periodo di fatturazione. Il superamento di tale quota viene rifiutato con un 422 (E10003).

Un invio programmato usa contenuto inline

scheduled_at e template si escludono a vicenda, e un invio che li imposta entrambi viene rifiutato con un 422. Questo è il contratto: un invio programmato ha il proprio subject e body, e un invio con template parte immediatamente. Per programmare il contenuto di un template, renderizza prima il suo subject e body. La dashboard e bird CLI mostrano in anteprima l'esatto subject, HTML e testo che un invio con template consegnerebbe. Programma quei valori renderizzati come contenuto inline.
Un elemento di un batch accetta scheduled_at alle stesse condizioni, quindi un singolo batch può mescolare messaggi programmati e immediati. Ogni elemento programmato consuma la propria unità della quota, e l'intero batch viene rifiutato se l'orario di un qualsiasi elemento è fuori intervallo. Ogni elemento programmato riporta il proprio scheduled_at nella risposta del batch, e un elemento inviato immediatamente non ha la chiave scheduled_at; il riferimento batch mostra entrambi in un'unica risposta.
Un payload di invio immediato può comunque essere troppo grande per la programmazione. Se il body, la lista dei destinatari o i metadati superano il limite di programmazione, API restituisce 422. Riduci quei campi o invia il messaggio immediatamente.

Scegliere l'orario di invio

scheduled_at è un timestamp assoluto RFC 3339. Due regole lo governano:
  • Deve essere tra 30 secondi e 30 giorni nel futuro. Meno di 30 secondi o più di 30 giorni viene rifiutato con un 422. Il limite inferiore impedisce a una programmazione di competere con un invio immediato. Trenta giorni è l'orizzonte massimo per cui tratteniamo un messaggio.
  • Fornisci un istante esatto. Includi un suffisso UTC Z (2027-01-15T09:00:00Z) o un offset esplicito (2026-07-30T09:00:00-04:00, lo stesso istante di 13:00:00Z). Confrontiamo l'istante con l'ora corrente e non interpretiamo mai un'ora locale senza offset né applichiamo il fuso orario del destinatario. Per inviare alle 9:00 nell'ora locale di ciascun destinatario, calcola tu quegli istanti e programma un invio per fuso orario.
Espressioni relative come "in 2 hours" non sono accettate. Invia un timestamp risolto.

Elencare i messaggi programmati

Filtra l'elenco messaggi per stato per vedere i messaggi che non sono ancora partiti:
for await (const message of bird.email.list({ status: "scheduled" })) {
  console.log(message.id, message.scheduled_at);
}
status=canceled elenca quelli che hai annullato prima dell'invio. Quando un messaggio programmato parte, entra nella pipeline e compare con gli stati di consegna, come qualsiasi altro invio. Il log email della dashboard offre gli stessi filtri Scheduled e Canceled.

Annullare un invio programmato

Annulla un messaggio in qualsiasi momento prima che inizi l'invio con POST /v1/email/messages/{message_id}/cancel:
await bird.email.cancel("em_abc123");
Un annullamento riuscito restituisce 204 No Content. Lo stato del messaggio diventa canceled, il messaggio non viene mai inviato e viene emesso un webhook email.canceled. Quattro cose da sapere:
  • Solo un messaggio ancora programmato può essere annullato. Un messaggio che ha già iniziato l'invio, è già stato inviato o è già stato annullato restituisce 409:
    Esempio di codice
    {
      "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."
      }
    }
    All'avvicinarsi dell'orario di invio, un annullamento può anche perdere la corsa con l'invio stesso e restituire 409 per lo stesso motivo.
  • Un invio di grandi dimensioni può impiegare alcuni secondi prima di diventare annullabile. Un invio programmato con allegati o un body di grandi dimensioni sta ancora salvando il contenuto dopo 202, quindi:
    1. Un annullamento in quella finestra restituisce 409 e il messaggio resta programmato.
    2. Rileggi il messaggio.
    3. Se mostra ancora status: scheduled, riprova l'annullamento.
  • L'annullamento non restituisce l'unità della quota di email programmate. L'unità consumata al momento della programmazione resta consumata: è ciò che impedisce a un ciclo programma-e-annulla di aggirare la quota. La tua quota di invio regolare non viene toccata, perché viene addebitata solo quando un messaggio viene effettivamente inviato.
  • L'annullamento è sicuro da riprovare con un Idempotency-Key, come qualsiasi altra scrittura.
Per spostare un invio programmato a un orario diverso, annullalo e invia un nuovo messaggio con il nuovo scheduled_at. Ottieni un nuovo ID em_.

Cosa succede al momento dell'invio

La programmazione cambia solo quando un messaggio viene rilasciato. La sua costruzione e le sue regole restano le stesse. Allegati, categoria, tag e metadati si comportano esattamente come in un invio immediato e vengono riportati negli eventi webhook allo stesso modo. Quattro controlli si dividono tra i due momenti:
  • La validazione del payload e del dominio avviene subito. Un invio programmato malformato fallisce nella chiamata API con un 422, così lo scopri ora e non alle 9 di mattina.
  • Il dominio del mittente viene ricontrollato al momento dell'invio. Se il tuo dominio from non è più verificato quando arriva l'orario programmato, il messaggio non viene inviato. I suoi destinatari vengono restituiti come rejected con un motivo, invece di ricevere email da un dominio non verificato. Mantieni il dominio verificato per tutta la finestra.
  • La quota di invio viene addebitata al momento dell'invio. La quota di invio regolare viene consumata quando il messaggio parte. La programmazione lascia la quota invariata. Se la quota è esaurita al momento dell'invio, i destinatari vengono rifiutati.
  • La soppressione viene valutata al momento dell'invio, in base alla tua lista di soppressione così com'è in quel momento, quindi chi si disiscrive tra la programmazione e l'invio viene comunque rispettato.

Errori

StatoCodiceQuando
422E10003La quota di email programmate della tua organizzazione per il periodo di fatturazione è esaurita
422scheduled_at è a meno di 30 secondi o a più di 30 giorni di distanza
422scheduled_at è stato combinato con template
422Il payload è troppo grande per essere parcheggiato; riduci body, destinatari o metadati, oppure invia subito
409E10005Il messaggio non può più essere annullato: ha già iniziato l'invio, è stato inviato o è stato annullato
404Nessun messaggio con quell'ID in questo spazio di lavoro

Webhook

Due eventi sono specifici della programmazione, oltre ai consueti eventi di consegna:
  • email.scheduled viene emesso quando un messaggio è accettato con un scheduled_at futuro e riporta quell'orario.
  • email.canceled viene emesso quando un messaggio programmato viene annullato prima dell'invio.
Quando il messaggio parte, la normale catena email.accepted prosegue invariata.

Passi successivi

Risorse correlate

Prosegui con la documentazione, le guide e gli esempi per questo argomento. Le risorse sono in inglese.

Ottieni un brief di implementazione