# Migrer depuis SendGrid

> Passez de SendGrid à Emailit. Faites correspondre les concepts, les champs de l’API, les paramètres SMTP et les noms d’événements de l’Event Webhook, puis transférez les adresses bloquées, les modèles dynamiques et le DNS.

Ce guide fait correspondre les concepts, les appels API, les webhooks, les adresses bloquées et les modèles de SendGrid à 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

| SendGrid | Emailit |
| --- | --- |
| Compte et sous-utilisateurs (subusers) | Compte et [espaces de travail](/fr/docs/workspaces/). Chaque espace de travail a ses propres domaines, clés, membres et crédits. |
| Clé API avec permissions | [Clé API](/fr/docs/developers/api-keys/) : **Full Access**, ou **Sending Only**, éventuellement restreinte à un domaine |
| Domain authentication | [Domaine d’envoi](/fr/docs/domains/) avec des enregistrements SPF, DKIM et return-path |
| Link branding | [Sous-domaine de suivi](/fr/docs/tracking/), un CNAME comme `go.acme.com` |
| Single sender verification | Non disponible. Chaque adresse d’expéditeur doit se trouver sur un domaine vérifié. |
| Dynamic templates | [Modèles](/fr/docs/templates/) avec un alias et des versions, dont le rendu est effectué avec [Temple](/fr/docs/templates/temple/) |
| Event Webhook | [Webhooks](/fr/docs/webhooks/) |
| Inbound Parse | [E-mails entrants](/fr/docs/inbound/) |
| Suppressions | [Adresses bloquées](/fr/docs/suppressions/) |
| Unsubscribe groups | Non disponible. Utilisez des [listes de contacts](/fr/docs/audiences/) et les liens de désinscription des campagnes. |
| Contacts et listes marketing | [Contacts](/fr/docs/contacts/) et [listes de contacts](/fr/docs/audiences/) |
| Single Sends | [Campagnes](/fr/docs/campaigns/) |
| Email Activity | **Email API → Emails** et **Email API → Logs** |
| Categories et custom args | `meta` |
| IP dédiées et pools d’IP | [IP dédiées](/fr/docs/deliverability/dedicated-ips/) sur demande |
| Validation d’adresses e-mail | [Vérification d’e-mails](/fr/docs/email-verification/) |

## Mettre à jour vos appels API

Le `POST /v3/mail/send` de SendGrid devient `POST /v2/emails`. La requête est plus plate : il n’y a pas de `personalizations`, et les adresses sont de simples chaînes.

```bash title="Before: SendGrid"
curl https://api.sendgrid.com/v3/mail/send \
  -H "Authorization: Bearer $SENDGRID_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "personalizations": [{ "to": [{ "email": "ada@example.com" }] }],
    "from": { "email": "hello@acme.com", "name": "Acme" },
    "subject": "Your receipt",
    "content": [
      { "type": "text/plain", "value": "Thanks for your order." },
      { "type": "text/html", "value": "<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@acme.com>",
    "to": "ada@example.com",
    "subject": "Your receipt",
    "text": "Thanks for your order.",
    "html": "<p>Thanks for your order.</p>"
  }'
```

| SendGrid | Emailit |
| --- | --- |
| `Authorization: Bearer SG.…` | `Authorization: Bearer secret_…` |
| `from: { email, name }` | `from: "Name "` |
| `personalizations[].to[]` | `to`, une chaîne ou un tableau de 50 adresses au maximum |
| `personalizations[].cc[]`, `bcc[]` | `cc`, `bcc` |
| `reply_to: { email }` | `reply_to` |
| `subject` | `subject` |
| `content[]` avec `text/plain` et `text/html` | `text` et `html` |
| `template_id` | `template`, un ID ou un alias de modèle |
| `personalizations[].dynamic_template_data` | `variables` |
| `attachments[]` avec `content`, `filename`, `type`, `content_id` | `attachments[]` avec `content`, `filename`, `content_type`, `content_id`, ou une `url` à la place de `content` |
| `headers` | `headers` |
| `custom_args`, `categories` | `meta`, un objet de valeurs de type chaîne renvoyé dans les événements webhook |
| `send_at` (horodatage Unix) | `scheduled_at`, qui accepte le même horodatage Unix, le format ISO 8601 ou de l’anglais courant |
| `tracking_settings.open_tracking` et `click_tracking` | `tracking: { "loads": true, "clicks": true }` |
| `asm` (unsubscribe groups) | Non disponible |
| `202 Accepted` avec un en-tête `X-Message-Id` | `200` avec un corps JSON : `id`, `status: "accepted"`, et `ids` avec un ID par destinataire |

Chaque destinataire d’une requête Emailit devient un e-mail distinct avec son propre ID. Pour envoyer des variables différentes à différentes personnes, ce que SendGrid fait avec plusieurs `personalizations`, envoyez une requête par destinataire. Ajoutez un en-tête `Idempotency-Key` pour sécuriser les relances. Consultez [Envoyer un e-mail](/fr/docs/email-api/send-email/).

## Changer les paramètres SMTP

| Paramètre | SendGrid | Emailit |
| --- | --- | --- |
| Hôte | `smtp.sendgrid.net` | `smtp.emailit.com` |
| Port | `587`, `465`, `2525` ou `25` | `587` (STARTTLS), `465` (TLS), `2525`, `2587` ou `25` |
| Nom d’utilisateur | `apikey` | `emailit` |
| Mot de passe | Votre clé API SendGrid | Votre clé API Emailit |

Emailit ne lit pas l’en-tête `X-SMTPAPI`. Supprimez-le 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 SendGrid | Événement Emailit |
| --- | --- |
| `processed` | `email.accepted` (API uniquement) |
| `deferred` | `email.attempted` |
| `delivered` | `email.delivered` |
| `bounce` | `email.bounced` |
| `dropped` | `email.suppressed` quand le destinataire figure dans la liste d’adresses bloquées |
| `open` | `email.loaded` |
| `click` | `email.clicked` |
| `spamreport` | `email.complained` |
| `unsubscribe`, `group_unsubscribe` | `email.unsubscribed`, pour les e-mails de campagne uniquement |
| POST Inbound Parse | `email.received`, puis récupérez le contenu avec [`GET /emails/{id}`](/fr/docs/api-reference/emails/get/) |

Comme SendGrid, Emailit envoie (POST) un tableau JSON d’événements. Les champs diffèrent :

- 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) au lieu de `sg_message_id`, et `data.object.to` au lieu de `email`.
- Vos valeurs `meta` reviennent dans `data.object.meta`.
- Emailit signe les requêtes avec HMAC-SHA256 au lieu de la clé publique ECDSA de SendGrid. Vérifiez `X-Emailit-Signature` avec 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. Dans SendGrid, exportez vos **Bounces**, **Spam Reports**, **Invalid Emails** et **Global Unsubscribes**, depuis les pages Suppressions ou avec les endpoints API `/v3/suppression/*`. Les Blocks sont généralement temporaires : vous pouvez les laisser de côté.

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

```csv
email,type,reason
old-address@example.com,recipient,sendgrid bounce
angry@example.com,recipient,sendgrid spam report
```

   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 : découpez donc les listes plus longues. Les doublons sont ignorés.

Pour les désinscriptions de groupe des e-mails marketing, importez ces personnes comme contacts avec **unsubscribed** activé, plutôt que de les bloquer pour tous les e-mails. Consultez [Gérer les adresses bloquées](/fr/docs/suppressions/manage/).

## Transférer les modèles

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

Les deux utilisent des doubles accolades, mais Temple est plus restreint que Handlebars :

| SendGrid (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. |
| `{{insert name "default=there"}}` | `{{name\|"there"}}` |
| `{{#if plan}}…{{else}}…{{/if}}` | Identique |
| `{{#each items}}…{{/each}}` | Non pris en charge. Générez la liste dans votre code et transmettez-la comme une seule variable. |
| `{{#equals plan "pro"}}…{{/equals}}` | Non pris en charge. Transmettez un booléen comme `is_pro` et utilisez `{{#if is_pro}}`. |

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

## Modifier le DNS

Ajoutez votre 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 les CNAME de domain authentication ou de link branding de SendGrid. Conservez votre enregistrement DMARC. Après la bascule, supprimez les CNAME de SendGrid. Consultez [Enregistrements DNS](/fr/docs/domains/dns-records/).

Si vous utilisiez Inbound Parse, faites plutôt pointer vers Emailit l’enregistrement MX de votre nom d’hôte de parsing. Pour conserver le même nom d’hôte, comme `parse.acme.com`, définissez l’`inbound_key` du domaine sur `parse` avec l’API. Consultez [Configurer la réception](/fr/docs/inbound/set-up/).

## É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/sendgrid/
