Sign inGet Started

Testar a entrega de e-mails (sandbox de e-mail)

O sandbox de e-mail testa handlers de webhook, lógica de supressão e resultados de entrega sem enviar para uma caixa de entrada real. Envie pelo API normal para um endereço em messagebird.dev. A parte local determina o resultado: bounce@messagebird.dev gera um bounce e delivered@messagebird.dev é entregue.

Um envio no sandbox usa os caminhos normais de aceitação, eventos e webhooks. Ele retorna a mesma resposta 202 e produz os mesmos formatos de payload de evento por destinatário que um envio em produção. O payload não tem nenhuma flag de teste. A mensagem não chega à infraestrutura externa de entrega nem a uma caixa de entrada real. Bounces e reclamações simulados não afetam a reputação de envio nem gravam na lista de supressão, então você pode reutilizar os endereços.

O sandbox não exige configuração: não há chave de ativação, modo de teste nem chave API especial. Ele é acionado apenas pelo endereço do destinatário, nos endpoints de envio normais (POST /v1/email/messages e POST /v1/email/batches) e em um broadcast. Um contato do público cujo endereço é um endereço de sandbox é simulado em vez de receber o envio. É assim que você ensaia uma campanha sem enviar e-mail para ninguém. Um destinatário simulado ainda conta na sua cota de envio, então o ensaio consome a mesma cota que o envio real consumiria.

Endereços mágicos

Todos os endereços ficam em @messagebird.dev. A parte local seleciona o resultado:

EndereçoResultado simuladoSequência de webhooksObservações
delivered@O servidor de e-mail destinatário aceita a mensagememail.accepted → email.processed → email.deliveredO caminho de sucesso
bounce@ / hardbounce@Hard bounce: SMTP 550, 5.1.1 Unknown User, classe de bounce 10email.accepted → email.processed → email.bounced com bounce_type: "hard"Nenhuma gravação na lista de supressão, então o endereço continua reutilizável
softbounce@Soft bounce: SMTP 451, 4.3.0 Temporary failure, please retry, classe 20email.accepted → email.processed → email.bounced com bounce_type: "soft"Soft bounces nunca geram supressão, sejam reais ou simulados
deferred@ / delay@Adiamento: SMTP 451, 4.2.1 Mailbox temporarily unavailable, will retry, classe 21email.accepted → email.processed → email.deferredO adiamento simulado é final: nenhuma nova tentativa acontece, então o destinatário permanece deferred
complaint@ / spam@O destinatário denuncia a mensagem como spam (feedback_type: "abuse")email.accepted → email.processed → email.complainedNenhum registro de supressão; reutilizável
suppressed@O destinatário é tratado como se já estivesse na sua lista de supressãoemail.accepted → email.rejected com rejection_reason: "recipient_suppressed"O processamento é interrompido exatamente como com um destinatário suprimido real: nenhum email.processed, nenhum evento de entrega
reject@A mensagem é rejeitada antes de qualquer tentativa de entregaemail.accepted → email.rejected com rejection_reason: "transmission_failed"Nenhum email.processed nem evento de entrega vem em seguida

As sequências acima são os webhooks que um único envio produz. Em uma transmissão, desconsidere o email.accepted inicial: um destinatário de transmissão é aceito individualmente, mas registramos esse evento sem enviar um webhook para ele. Assim, cada sequência começa no evento seguinte, email.processed nos caminhos de entrega e email.rejected para suppressed@ e reject@. Todo o restante é idêntico, e a referência de eventos descreve a regra por completo.

Um envio pode misturar destinatários do sandbox e destinatários reais. Cada destinatário tem seu próprio ciclo de vida: os reais recebem a mensagem normalmente, e os do sandbox são simulados.

Os mesmos eventos também aparecem na linha do tempo da mensagem no log de e-mails e na API de eventos. Assim, você pode usar o sandbox sem um endpoint de webhook e consultar os resultados depois.

Regras de endereçamento

  • A detecção considera apenas a parte local, e somente no domínio messagebird.dev. bounce@yourdomain.com é um endereço normal.
  • Somente as partes locais da tabela de endereços mágicos são mágicas. Qualquer outro endereço em messagebird.dev é um destinatário normal. Quando você envia pelo domínio compartilhado de onboarding, esse endereço precisa pertencer a um membro verificado do espaço de trabalho.
  • A correspondência não diferencia maiúsculas de minúsculas: Bounce@messagebird.dev e bounce@messagebird.dev se comportam da mesma forma.
  • O subendereçamento com +label é removido antes da correspondência: bounce+signup-flow@messagebird.dev continua gerando bounce. Use rótulos para correlacionar casos de teste. O endereço completo, com o rótulo, aparece nos seus eventos e webhooks, então cada execução de teste pode marcar seus próprios destinatários.

Passo a passo: simule um bounce do início ao fim

Você não precisa de um domínio de envio verificado. Envie a partir de onboarding@messagebird.dev, conforme descrito em Envie seu primeiro email. Os endereços de sandbox reconhecidos ficam isentos da restrição do domínio de onboarding que exige membros verificados, mas ainda contam para a cota diária desse domínio.

Confirme que você tem um endpoint de webhook inscrito em eventos de email (consulte Webhooks) e então envie:

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 a sua chave começar com bk_eu1_, chame https://eu1.platform.bird.com em vez disso.

O API responde 202 Accepted com um ID de mensagem em_*, idêntico ao de um envio em produção. Assim, o caminho de código que você testa é o seu caminho real. Em seguida, seu endpoint de webhook recebe email.accepted, email.processed e, por fim, email.bounced. Todo evento repete o tags e o metadata do envio (null quando o envio não os tinha), e o payload de email.bounced traz a classificação completa do bounce:

Exemplo de código
{
  "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
  }
}

O significado dos campos está na referência de eventos. Nenhum indicador de simulação aparece no payload: o tipo e o formato do evento são exatamente os de um hard bounce real. O único elemento que identifica a simulação é o próprio endereço do destinatário. Se o seu handler precisar tratar o tráfego de teste de forma especial, use o domínio de destinatário messagebird.dev como critério.

Para verificar que um destinatário já suprimido nunca recebe envios, repita o envio com suppressed@messagebird.dev. Confirme que você recebe email.accepted e depois email.rejected com rejection_reason: "recipient_suppressed". Você não deve receber email.processed nem eventos de entrega. Isso reproduz exatamente um destinatário suprimido real: a mensagem é aceita e depois interrompida durante o processamento, antes de qualquer envio.

O que o sandbox faz e o que não faz

  • Nenhuma gravação na lista de supressão. Hard bounces e reclamações simulados não adicionam o destinatário à sua lista de supressão; é isso que mantém os endereços reutilizáveis. Seu webhook continua sendo disparado (email.bounced, email.complained), então sua própria lógica de supressão é testada por completo. Para testar o caminho de rejeição de destinatários já suprimidos, use o endereço dedicado suppressed@.
  • Nenhuma entrega real, em nenhum caso. Os destinatários de sandbox são interceptados antes que a mensagem chegue à infraestrutura de entrega. Nada é transmitido, nenhuma caixa de entrada é envolvida e sua reputação de envio não é afetada.
  • A validação da solicitação continua valendo. Um envio de sandbox usa os endpoints normais, então as verificações de schema, os limites de tamanho e as regras de cabeçalho rejeitam uma solicitação inválida como de costume. O sandbox ignora tudo o que vem depois da entrega à infraestrutura: a renderização e o comportamento de entrega a partir desse ponto não são testados.
  • Aberturas e cliques não são simulados. Um endereço mágico simula o resultado da transmissão, e ninguém abre a mensagem, então email.opened e email.clicked vêm apenas de emails reais.
  • As estatísticas incluem o tráfego do sandbox. Os envios para o sandbox contam nas estatísticas agregadas do seu espaço de trabalho e nas taxas de bounce e de reclamação. Muitos bounces no sandbox distorcem seus dashboards, mas não alteram sua reputação.

Próximos passos

Continue com a documentação, guias e exemplos sobre este tópico.