Sign inGet Started

Testare la consegna email (mail sandbox)

Il mail sandbox testa i gestori webhook, la logica di soppressione e gli esiti di consegna senza inviare a una casella di posta reale. Invia attraverso la normale API a un indirizzo su messagebird.dev. La local part determina l'esito: bounce@messagebird.dev genera un bounce e delivered@messagebird.dev consegna.
Un invio sandbox utilizza i normali percorsi di accettazione, eventi e webhook. Restituisce la stessa risposta 202 e produce gli stessi payload evento per destinatario di un invio di produzione. Il payload non contiene alcun flag di test. Il messaggio non raggiunge l'infrastruttura di consegna esterna né una casella di posta reale. I bounce e le segnalazioni spam simulati non influenzano la reputazione di invio e non scrivono nella lista di soppressione, quindi puoi riutilizzare gli indirizzi.
Il sandbox non richiede configurazione: nessun toggle, nessuna modalità di test, nessuna chiave API speciale. Si attiva esclusivamente in base all'indirizzo del destinatario, sugli endpoint di invio normali (POST /v1/email/messages e POST /v1/email/batches) e su un broadcast: un contatto nell'audience il cui indirizzo è un indirizzo sandbox viene simulato anziché ricevere l'invio, ed è così che puoi provare una campagna senza inviare email a nessuno. Un destinatario simulato conta comunque ai fini della tua quota di invio, quindi la prova esercita la stessa quota dell'invio reale.

Indirizzi magici

Tutti gli indirizzi sono su @messagebird.dev. La local part seleziona l'esito:
IndirizzoEsito simulatoSequenza webhookNote
delivered@Il mail server ricevente accetta il messaggioemail.accepted → email.processed → email.deliveredIl percorso ideale
bounce@ / hardbounce@Hard bounce: SMTP 550, 5.1.1 Unknown User, bounce class 10email.accepted → email.processed → email.bounced con bounce_type: "hard"Nessuna scrittura nella lista di soppressione, quindi l'indirizzo resta riutilizzabile
softbounce@Soft bounce: SMTP 451, 4.3.0 Temporary failure, please retry, class 20email.accepted → email.processed → email.bounced con bounce_type: "soft"I soft bounce non generano mai soppressione, reali o simulati
deferred@ / delay@Deferral: SMTP 451, 4.2.1 Mailbox temporarily unavailable, will retry, class 21email.accepted → email.processed → email.deferredIl deferral simulato è terminale: non segue alcun tentativo, quindi il destinatario resta deferred
complaint@ / spam@Il destinatario segnala il messaggio come spam (feedback_type: "abuse")email.accepted → email.processed → email.complainedNessuna scrittura di soppressione; riutilizzabile
suppressed@Il destinatario viene trattato come già presente nella lista di soppressioneemail.accepted → email.rejected con rejection_reason: "recipient_suppressed"Cortocircuita durante l'elaborazione esattamente come un destinatario reale soppresso: nessun email.processed, nessun evento di consegna
reject@Il messaggio viene rifiutato prima di qualsiasi tentativo di consegnaemail.accepted → email.rejected con rejection_reason: "transmission_failed"Nessun email.processed o evento di consegna a seguire
Le sequenze sopra sono i webhook prodotti da un singolo invio. In un broadcast, elimina il email.accepted iniziale: un destinatario broadcast viene accettato autonomamente, ma registriamo quell'evento senza inviare un webhook per esso, quindi ogni sequenza si apre con ciò che segue, email.processed nei percorsi di consegna e email.rejected per suppressed@ e reject@. Tutto il resto è identico, e il riferimento eventi copre la regola in dettaglio.
Un invio può mescolare destinatari sandbox e reali. Ogni destinatario ha il proprio ciclo di vita: i destinatari reali vengono consegnati normalmente, quelli sandbox sono simulati.
Gli stessi eventi compaiono anche nella timeline del messaggio nel log email e nell'endpoint API degli eventi, quindi puoi usare il sandbox senza un endpoint webhook e leggere gli esiti in risposta.

Regole di indirizzamento

  • Il rilevamento si basa solo sulla local part e solo sul dominio messagebird.dev. bounce@yourdomain.com è un indirizzo normale.
  • Solo le local part nella tabella degli indirizzi magici sono magiche. Qualsiasi altro indirizzo su messagebird.dev è un destinatario normale. Quando invii dal dominio di onboarding condiviso, quell'indirizzo deve appartenere a un membro verificato dello spazio di lavoro.
  • Il matching è case-insensitive: Bounce@messagebird.dev e bounce@messagebird.dev si comportano in modo identico.
  • Il subaddressing +label viene rimosso prima del matching: bounce+signup-flow@messagebird.dev genera comunque un bounce. Usa le label per correlare i casi di test; l'indirizzo completo, label inclusa, compare nei tuoi eventi e webhook, così ogni esecuzione di test può etichettare i propri destinatari.

Procedura guidata: simulare un bounce, dall'inizio alla fine

Non serve un dominio di invio verificato. Invia da onboarding@messagebird.dev, come descritto in Invia la tua prima email. Gli indirizzi sandbox riconosciuti sono esenti dalla restrizione di membro verificato del dominio di onboarding, ma contano comunque ai fini della sua quota giornaliera.
Assicurati di avere un endpoint webhook iscritto agli eventi email (vedi Webhook), poi invia:
const msg = await bird.email.send({
  from: { email: "onboarding@messagebird.dev", name: "Bird" },
  to: ["bounce+signup-flow@messagebird.dev"],
  subject: "Sandbox bounce test",
  html: "<p>This message will hard-bounce.</p>",
  tags: [{ name: "flow", value: "signup" }],
  metadata: { test_run: "docs-capture-1" },
});
console.log(msg.id, msg.status); // "em_…", "accepted"
Se la tua chiave inizia con bk_eu1_, chiama https://eu1.platform.bird.com invece.
L'endpoint API risponde 202 Accepted con un ID messaggio em_*, indistinguibile da un invio di produzione. Questo è il punto: il percorso di codice che stai testando è quello reale. Il tuo endpoint webhook riceve quindi email.accepted, email.processed e infine email.bounced. Ogni evento riporta tags e metadata dell'invio (null quando l'invio non ne aveva), e il payload email.bounced contiene la classificazione completa del bounce:
Esempio di codice
{
  "type": "email.bounced",
  "timestamp": "2026-07-23T14:51:00.362Z",
  "data": {
    "email_id": "em_01ky7qanhrejer0bn34v38hrxh",
    "recipient_id": "er_01ky7qanhrejds4decpk83q5qq",
    "workspace_id": "ws_01ky7m21hjffh9s8kq76gyb1xf",
    "recipient": "bounce+signup-flow@messagebird.dev",
    "recipient_role": "to",
    "bounce_type": "hard",
    "bounce_class": 10,
    "bounce_code": "550",
    "bounce_description": "5.1.1 Unknown User",
    "sending_ip": null,
    "tags": [{ "name": "flow", "value": "signup" }],
    "metadata": { "test_run": "docs-capture-1" },
    "broadcast_id": null
  }
}
Il significato dei campi è nel riferimento eventi. Nessun flag di simulazione compare nel payload: il tipo e la struttura dell'evento sono esattamente quelli prodotti da un hard bounce reale. L'unico elemento che lo identifica come simulato è l'indirizzo del destinatario stesso, quindi se il tuo handler deve gestire diversamente il traffico di test, usa come chiave il dominio destinatario messagebird.dev.
Per verificare che un destinatario già soppresso non riceva mai l'invio, ripeti l'invio con suppressed@messagebird.dev. Verifica di ricevere email.accepted, poi email.rejected con rejection_reason: "recipient_suppressed". Non dovresti ricevere email.processed né eventi di consegna. Questo rispecchia esattamente un destinatario reale soppresso: il messaggio viene accettato, poi cortocircuitato durante l'elaborazione prima di qualsiasi invio.

Cosa fa e cosa non fa il sandbox

  • Nessuna scrittura nella lista di soppressione. I hard bounce e le segnalazioni spam simulati non aggiungono il destinatario alla tua lista di soppressione; è questo che mantiene gli indirizzi riutilizzabili. Il tuo webhook viene comunque attivato (email.bounced, email.complained), quindi la tua logica di soppressione è pienamente esercitata. Per testare il percorso di rifiuto per destinatario già soppresso, usa l'indirizzo dedicato suppressed@.
  • Nessuna consegna reale, mai. I destinatari sandbox vengono intercettati prima che il messaggio raggiunga l'infrastruttura di consegna. Non viene trasmesso nulla, nessuna casella di posta è coinvolta e la tua reputazione di invio resta intatta.
  • La validazione della richiesta si applica comunque. Un invio sandbox utilizza gli endpoint normali, quindi i controlli di schema, i limiti di dimensione e le regole sugli header rifiutano una richiesta non valida come di consueto. Ciò che il sandbox salta è tutto ciò che segue il handoff: il rendering e il comportamento di consegna oltre quel punto non vengono esercitati.
  • Aperture e clic non sono simulati. Un indirizzo magico simula il risultato della trasmissione, e nessuno apre il messaggio, quindi email.opened e email.clicked provengono solo da email reali.
  • Le statistiche includono il traffico sandbox. Gli invii sandbox contano ai fini delle statistiche aggregate del tuo spazio di lavoro e dei tassi di bounce e segnalazioni spam. Un uso intenso di bounce sandbox altera le tue dashboard lasciando inalterata la tua reputazione.

Prossimi passi

Risorse correlate

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

Prova l'esercitazione e ottieni un brief di implementazione