# Pourquoi mes e-mails sont-ils envoyés deux fois ?

> Découvrez d’où viennent les e-mails en double et évitez-les avec l’en-tête Idempotency-Key, qui permet de relancer les requêtes API sans risque.

Cet article vous aide quand des destinataires reçoivent le même e-mail deux fois ou plus. Emailit envoie chaque requête acceptée une seule fois : les doublons signifient donc presque toujours que la requête est parvenue plusieurs fois à Emailit.

## Symptômes

- Un destinataire signale deux e-mails identiques.
- **Email API → Emails** affiche deux e-mails ou plus avec le même destinataire et le même objet, chacun avec son propre ID `em_…`, créés à quelques secondes ou minutes d’intervalle.
- **Email API → Logs** affiche plusieurs requêtes `POST /v2/emails` pour le même message.

## Cause

Sources fréquentes de requêtes répétées :

- **Relances après un timeout.** Votre client HTTP ou votre file de tâches a expiré et relancé la requête, alors que la première avait déjà été acceptée.
- **Files de tâches « au moins une fois » (at-least-once).** Un processus s’est arrêté après l’envoi mais avant de marquer la tâche comme terminée : la tâche a donc été réexécutée.
- **Envois déclenchés par webhook.** Votre endpoint envoie un e-mail quand il reçoit un événement. S’il a répondu lentement, Emailit a renvoyé le webhook et votre code a envoyé l’e-mail de nouveau.
- **Deux intégrations.** Par exemple, un plugin SMTP WordPress et votre application envoient tous deux la même notification, ou une automatisation et votre code envoient tous deux un e-mail de bienvenue.
- **Doubles soumissions** d’un formulaire ou d’un bouton.

Emailit supprime déjà les adresses en double au sein d’une même requête, sans tenir compte de la casse, entre `to`, `cc` et `bcc`. Une même requête n’envoie jamais deux fois à la même personne.

## Solution

1. **Trouvez la source.** Dans **Email API → Emails**, filtrez par destinataire et comparez les doublons. Vérifiez la clé API et les horodatages, puis rapprochez-les des requêtes dans **Email API → Logs**. Des requêtes provenant de clés différentes indiquent généralement deux intégrations. Des requêtes provenant de la même clé indiquent des relances.

2. **Ajoutez un en-tête `Idempotency-Key`.** Générez une clé une seule fois par e-mail logique, par exemple à partir de l’ID de votre commande ou de votre événement, et réutilisez-la à chaque relance :

```bash
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>"}'
```

   Les clés comptent de 1 à 256 caractères (lettres, chiffres, `-` et `_`) et sont propres à votre espace de travail.

3. **Gérez les réponses.** Pendant 24 heures, une répétition avec la même clé renvoie la réponse d’origine sans envoyer ni débiter de nouveau. Une répétition qui arrive pendant que la première est encore en cours reçoit `409 Idempotency key in progress` : patientez, puis relancez avec la même clé. Les requêtes en échec ne sont pas stockées : vous pouvez donc les relancer avec la même clé.

4. **Dédupliquez dans vos gestionnaires de webhooks.** Stockez chaque `event_id` traité et ignorez les événements déjà traités.

5. **Supprimez la seconde intégration.** Assurez-vous qu’un seul système envoie chaque type de message.

Les clés d’idempotence fonctionnent avec [Envoyer un e-mail](/fr/docs/api-reference/emails/send/) et [Transférer un e-mail](/fr/docs/api-reference/emails/forward/). SMTP n’a pas d’équivalent : dédupliquez donc dans votre application avant de confier les e-mails au relais. Pour plus de détails, lisez [Idempotence](/fr/docs/email-api/idempotency/).

## Le problème persiste ?

[Contactez le support](/contact/) ou posez votre question sur [Discord](https://discord.emailit.com) en indiquant les ID de deux e-mails en double.

---
Source: https://emailit.com/fr/docs/kb/duplicate-emails-sent/
