Solução de problemas
Por que os meus e-mails são enviados duas vezes?
Descubra de onde vêm os e-mails duplicados e evite-os com o cabeçalho Idempotency-Key, que torna seguras as novas tentativas de requisições à API.
Este artigo ajuda quando os destinatários recebem o mesmo e-mail duas ou mais vezes. O Emailit envia cada requisição aceita uma única vez, então duplicatas quase sempre significam que a requisição chegou ao Emailit mais de uma vez.
Sintomas
- Um destinatário relata ter recebido dois e-mails idênticos.
- Email APIEmails mostra dois ou mais e-mails com o mesmo destinatário e assunto, cada um com o próprio ID
em_…, criados com segundos ou minutos de diferença. - Email APILogs mostra mais de uma requisição
POST /v2/emailspara a mesma mensagem.
Causa
Origens comuns de requisições repetidas:
- Novas tentativas depois de um timeout. O seu cliente HTTP ou a sua fila de jobs deu timeout e tentou de novo, mas a primeira requisição já tinha sido aceita.
- Filas de jobs com entrega pelo menos uma vez. Um worker caiu depois de enviar, mas antes de marcar o job como concluído, e o job foi executado de novo.
- Envios disparados por webhooks. O seu endpoint envia um e-mail quando recebe um evento. Se ele respondeu devagar, o Emailit reenviou o webhook e o seu código enviou de novo.
- Duas integrações. Por exemplo, um plugin SMTP do WordPress e a sua aplicação enviam a mesma notificação, ou uma automação e o seu código enviam um e-mail de boas-vindas.
- Envios duplos de um formulário ou botão.
O Emailit já remove os endereços duplicados dentro de uma requisição, sem diferenciar maiúsculas de minúsculas, entre to, cc e bcc. Uma única requisição nunca envia duas vezes para a mesma pessoa.
Solução
-
Encontre a origem. Em Email APIEmails, filtre pelo destinatário e compare as duplicatas. Confira a chave de API e os horários e depois associe-os às requisições em Email APILogs. Requisições de chaves diferentes geralmente indicam duas integrações. Requisições da mesma chave indicam novas tentativas.
-
Adicione um cabeçalho
Idempotency-Key. Gere uma chave uma vez por e-mail lógico, por exemplo a partir do ID do pedido ou do evento, e reutilize-a em todas as novas tentativas:curl https://api.emailit.com/v2/emails \ -H "Authorization: Bearer $EMAILIT_API_KEY" \ -H "Idempotency-Key: order-1042-receipt" \ -H "Content-Type: application/json" \ -d '{"from":"Acme <hello@acme.com>","to":"ada@example.com","subject":"Your receipt","html":"<p>Thanks!</p>"}'As chaves têm de 1 a 256 caracteres entre letras, dígitos,
-e_e valem dentro do seu workspace. -
Trate as respostas. Durante 24 horas, uma repetição com a mesma chave retorna a resposta original sem enviar nem cobrar de novo. Uma repetição que chega enquanto a primeira ainda está em andamento recebe
409 Idempotency key in progress: espere e tente de novo com a mesma chave. As requisições com falha não são guardadas, então você pode tentar de novo com a mesma chave. -
Elimine as duplicatas nos handlers de webhook. Guarde cada
event_idprocessado e ignore os eventos que você já tratou. -
Remova a segunda integração. Garanta que apenas um sistema envie cada tipo de mensagem.
As chaves de idempotência funcionam em Enviar um e-mail e Encaminhar um e-mail. O SMTP não tem um equivalente, então elimine as duplicatas na sua aplicação antes de entregar os e-mails ao relay. Leia Idempotência para mais detalhes.
Ainda com problemas?
Fale com o suporte ou pergunte no Discord, informando os IDs de dois e-mails duplicados.