# Migrer depuis Mailgun

> Passez de Mailgun à Emailit. Faites correspondre les domaines, les clés et les routes, convertissez les appels API encodés en formulaire en JSON, et transférez SMTP, webhooks, adresses bloquées et modèles.

Ce guide fait correspondre les concepts, les appels API, les webhooks, les adresses bloquées et les modèles de Mailgun à leurs équivalents dans Emailit. Lisez d’abord [Migrer vers Emailit](/fr/docs/migrate/) pour l’ordre général et la façon de faire fonctionner les deux fournisseurs en parallèle.

## Concepts

| Mailgun | Emailit |
| --- | --- |
| Compte et sous-comptes (subaccounts) | Compte et [espaces de travail](/fr/docs/workspaces/). Chaque espace de travail a ses propres domaines, clés, membres et crédits. |
| Domaine, avec son propre chemin d’API `/v3/<domain>/…` | [Domaine d’envoi](/fr/docs/domains/). Il n’y a qu’un endpoint d’envoi, et Emailit déduit le domaine de l’adresse `from`. |
| Clé API privée | [Clé API](/fr/docs/developers/api-keys/) **Full Access** |
| Clé d’envoi de domaine | Clé API **Sending Only** restreinte à un domaine |
| Identifiants SMTP par domaine | Votre clé API, utilisée comme mot de passe SMTP |
| Modèles par domaine, avec versions | [Modèles](/fr/docs/templates/) par espace de travail, avec un alias et des versions |
| Webhooks par domaine | [Webhooks](/fr/docs/webhooks/) par espace de travail |
| Routes | [E-mails entrants](/fr/docs/inbound/) avec le webhook `email.received`, ou l’[automatisation](/fr/docs/inbound/forward-with-automations/) **Forward received email** |
| Suppressions par domaine : bounces, unsubscribes, complaints | Une seule [liste d’adresses bloquées](/fr/docs/suppressions/) par espace de travail |
| Mailing lists | [Listes de contacts](/fr/docs/audiences/) |
| Tags et variables personnalisées | `meta` |
| Logs et événements | **Email API → Emails**, **Email API → Events** et **Email API → Logs** |
| Validation d’e-mails | [Vérification d’e-mails](/fr/docs/email-verification/) |

## Mettre à jour vos appels API

Le `POST /v3/<domain>/messages` de Mailgun reçoit des champs de formulaire avec une authentification basique. Le `POST /v2/emails` d’Emailit reçoit du JSON avec un jeton bearer :

```bash title="Before: Mailgun"
curl -s --user "api:$MAILGUN_API_KEY" \
  https://api.mailgun.net/v3/mg.acme.com/messages \
  -F from='Acme <hello@mg.acme.com>' \
  -F to='ada@example.com' \
  -F subject='Your receipt' \
  -F text='Thanks for your order.' \
  --form-string html='<p>Thanks for your order.</p>'
```

```bash title="After: Emailit"
curl https://api.emailit.com/v2/emails \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "Acme <hello@mg.acme.com>",
    "to": "ada@example.com",
    "subject": "Your receipt",
    "text": "Thanks for your order.",
    "html": "<p>Thanks for your order.</p>"
  }'
```

| Mailgun | Emailit |
| --- | --- |
| Authentification basique `api:<key>` | `Authorization: Bearer secret_…` |
| Champs `multipart/form-data` | Un corps JSON |
| `from`, `subject`, `text`, `html` | Les mêmes noms |
| `to`, `cc`, `bcc` (répétés ou séparés par des virgules) | `to`, `cc`, `bcc` sous forme de chaîne ou de tableau, 50 adresses au maximum pour chacun |
| `h:Reply-To` | `reply_to` |
| `h:X-My-Header` | `headers: { "X-My-Header": "…" }` |
| `v:order-id`, `h:X-Mailgun-Variables` | `meta: { "order-id": "…" }`, renvoyé dans les événements webhook |
| `template` et `t:variables` | `template` (un ID ou un alias) et `variables` |
| `attachment`, `inline` (envois de fichiers) | `attachments[]` avec un `content` en base64 ou une `url`, plus `content_type`. Ajoutez `content_id` pour les images intégrées. |
| `o:deliverytime` (date RFC 2822) | `scheduled_at` (ISO 8601, horodatage Unix ou anglais courant) |
| `o:tracking`, `o:tracking-opens`, `o:tracking-clicks` | `tracking: { "loads": true, "clicks": true }` |
| `o:tag` | `meta` |
| `o:testmode` | Non disponible |
| `recipient-variables` (envoi par lots) | Non disponible. Envoyez une requête par destinataire avec ses propres `variables`. |
| Réponse `{ "id": "<…>", "message": "Queued. Thank you." }` | `200` avec `id` (`em_…`), `message_id`, `status: "accepted"` et `ids` par destinataire |

Si vous envoyiez depuis un sous-domaine comme `mg.acme.com`, ajoutez exactement ce sous-domaine dans Emailit. Les sous-domaines sont vérifiés séparément du domaine parent. Les hôtes d’API UE et US de Mailgun correspondent tous deux à l’unique endpoint d’Emailit. Consultez [Envoyer un e-mail](/fr/docs/email-api/send-email/).

## Changer les paramètres SMTP

| Paramètre | Mailgun | Emailit |
| --- | --- | --- |
| Hôte | `smtp.mailgun.org`, ou l’hôte UE | `smtp.emailit.com` |
| Port | `587`, `465`, `2525` ou `25` | `587` (STARTTLS), `465` (TLS), `2525`, `2587` ou `25` |
| Nom d’utilisateur | Votre identifiant SMTP, par exemple `postmaster@mg.acme.com` | `emailit` |
| Mot de passe | Votre mot de passe SMTP | Votre clé API Emailit |

Emailit ne lit pas les en-têtes `X-Mailgun-*`. Supprimez-les et réglez plutôt le suivi au niveau du domaine. Consultez [Paramètres SMTP](/fr/docs/smtp/settings/).

## Faire correspondre les événements webhook

| Événement Mailgun | Événement Emailit |
| --- | --- |
| `accepted` | `email.accepted` (API uniquement) |
| `delivered` | `email.delivered` |
| `failed` avec la sévérité `temporary` | `email.attempted` |
| `failed` avec la sévérité `permanent` | `email.bounced` |
| `opened` | `email.loaded` |
| `clicked` | `email.clicked` |
| `complained` | `email.complained` |
| `unsubscribed` | `email.unsubscribed`, pour les e-mails de campagne uniquement |
| Route qui transfère vers une URL | `email.received`, puis récupérez le contenu avec [`GET /emails/{id}`](/fr/docs/api-reference/emails/get/) |

Le format des requêtes change :

- Mailgun envoie un événement par requête, avec les détails dans `event-data`. Emailit envoie un tableau JSON de 100 événements au maximum. Parcourez le tableau avec une boucle.
- Le nom de l’événement se trouve dans `type`, et l’e-mail dans `data.object`. Utilisez `data.object.id`, l’ID `em_` de la réponse d’envoi, pour associer les événements aux messages. Vos valeurs `meta` se trouvent dans `data.object.meta`.
- Mailgun signe un horodatage et un jeton à l’intérieur du corps. Emailit signe l’intégralité du corps brut : vérifiez `X-Emailit-Signature` à l’aide de `X-Emailit-Timestamp` et de votre secret `whsec_`. Consultez [Signature des requêtes](/fr/docs/webhooks/request-signature/).

```javascript
for (const event of req.body) {
  const email = event.data.object;
  if (event.type === 'email.bounced') markBounced(email.to, email.id);
  if (event.type === 'email.complained') unsubscribe(email.to);
}
```

## Transférer les adresses bloquées

1. Exportez les listes **Bounces**, **Complaints** et **Unsubscribes** de chaque domaine Mailgun depuis lequel vous envoyez, depuis le panneau de contrôle ou avec l’API de suppressions (`/v3/<domain>/bounces`, `/complaints` et `/unsubscribes`).

2. Constituez un seul CSV avec les colonnes `email,type,reason` :

```csv
email,type,reason
old-address@example.com,recipient,mailgun bounce
angry@example.com,recipient,mailgun complaint
```

   Utilisez le type `recipient` pour les adresses qui ne doivent jamais recevoir d’e-mail. Il bloque les envois par l’API, par SMTP et par les campagnes. Les types `bounce`, `complaint` et `unsubscribe` n’arrêtent que les campagnes.

3. Dans **Email API → Suppressions**, sélectionnez **Import** et chargez le fichier. Chaque fichier peut contenir 10 000 lignes et peser 8 Mo au maximum. Les doublons sont ignorés.

Emailit a une seule liste d’adresses bloquées par espace de travail : les adresses de tous vos domaines Mailgun vont donc dans la même liste. Il n’existe pas de liste d’autorisation (allowlist). Consultez [Gérer les adresses bloquées](/fr/docs/suppressions/manage/).

## Transférer les modèles

Copiez le HTML de chaque modèle depuis Mailgun, puis importez-le dans **Email Marketing → Templates** ou créez-le avec l’[API des modèles](/fr/docs/api-reference/templates/create/). Donnez-lui un alias et envoyez-le avec `"template": "<alias>"` et `variables`.

Les modèles Mailgun utilisent Handlebars. Temple couvre les usages courants :

| Mailgun (Handlebars) | Emailit (Temple) |
| --- | --- |
| `{{first_name}}` | `{{first_name}}` |
| `{{{html_block}}}` | `{{html_block}}`. Temple n’échappe jamais le HTML : échappez vous-même les saisies des utilisateurs. |
| `{{#if plan}}…{{else}}…{{/if}}` | Identique |
| `{{#unless plan}}…{{/unless}}` | `{{#if plan}}{{else}}…{{/if}}` |
| `{{#each items}}…{{/each}}` | Non pris en charge. Générez la liste dans votre code et transmettez-la comme une seule variable. |
| `{{#equal plan "pro"}}…{{/equal}}` | Non pris en charge. Transmettez un booléen comme `is_pro` et utilisez `{{#if is_pro}}`. |
| Pas de valeur par défaut intégrée | `{{first_name\|"there"}}` ajoute une valeur de repli |

Consultez [Temple](/fr/docs/templates/temple/) et [Importer et exporter des modèles](/fr/docs/templates/import-export/).

## Modifier le DNS

Ajoutez chaque domaine dans **Email API → Domains** et publiez les enregistrements Emailit. Ils utilisent leurs propres noms (`emailit._domainkey`, `emailit.<domain>`, et éventuellement `go` et `inbound`) : ils n’entrent donc pas en conflit avec l’enregistrement DKIM de Mailgun ni avec son CNAME de suivi `email.<domain>`. Vous n’avez pas besoin de modifier l’enregistrement SPF de votre domaine racine pour Emailit. Conservez votre enregistrement DMARC. Consultez [Enregistrements DNS](/fr/docs/domains/dns-records/).

Après la bascule, supprimez les enregistrements DKIM et de suivi de Mailgun, et retirez `include:mailgun.org` de votre enregistrement SPF. Si vous recevez des e-mails via les routes Mailgun, conservez ses enregistrements MX jusqu’à ce que vous ayez déplacé ce trafic vers la [réception Emailit](/fr/docs/inbound/set-up/), qui reçoit sur un sous-domaine comme `inbound.acme.com`.

## Étapes suivantes

- [Liste de contrôle avant la mise en production](/fr/docs/get-started/go-live/)
- [Configurer des webhooks](/fr/docs/webhooks/set-up/)
- [Migration prioritaire](/fr/docs/programs/priority-migration/) : laissez les ingénieurs d’Emailit effectuer la migration avec vous

---
Source: https://emailit.com/fr/docs/migrate/mailgun/
