# Migrer depuis Resend

> Passez de Resend à Emailit. Les API sont proches, les changements sont donc limités. Faites correspondre les champs, les paramètres SMTP et les événements webhook, vérifiez les signatures et transférez les contacts.

Ce guide fait correspondre les concepts, les appels API, les webhooks et les modèles de Resend à leurs équivalents dans Emailit. Les deux API ont une structure similaire : la plupart des modifications de code sont donc limitées. 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

| Resend | Emailit |
| --- | --- |
| Équipe (Team) | [Espace de travail](/fr/docs/workspaces/). Chaque espace de travail a ses propres domaines, clés, membres et crédits. |
| Clé API à accès complet ou d’envoi | [Clé API](/fr/docs/developers/api-keys/) : **Full Access**, ou **Sending Only**, éventuellement restreinte à un domaine |
| Domaines | [Domaines d’envoi](/fr/docs/domains/) |
| Audiences et contacts | [Contacts](/fr/docs/contacts/) et [listes de contacts](/fr/docs/audiences/) |
| Broadcasts | [Campagnes](/fr/docs/campaigns/) |
| Webhooks | [Webhooks](/fr/docs/webhooks/) |
| E-mails et logs | **Email API → Emails** et **Email API → Logs** |
| `tags` | `meta` |
| Composants React Email | Du HTML dont vous effectuez le rendu dans votre code, ou des [modèles](/fr/docs/templates/) conçus dans le tableau de bord |

## Mettre à jour vos appels API

Le `POST /emails` de Resend devient le `POST /v2/emails` d’Emailit, avec presque les mêmes champs. En Node.js :

```javascript title="Before: Resend"

const resend = new Resend(process.env.RESEND_API_KEY);

await resend.emails.send({
  from: 'Acme <hello@acme.com>',
  to: ['ada@example.com'],
  subject: 'Your receipt',
  html: '<p>Thanks for your order.</p>',
});
```

```javascript title="After: Emailit"

const emailit = new Emailit(process.env.EMAILIT_API_KEY);

await emailit.emails.send({
  from: 'Acme <hello@acme.com>',
  to: ['ada@example.com'],
  subject: 'Your receipt',
  html: '<p>Thanks for your order.</p>',
});
```

| Resend | Emailit |
| --- | --- |
| `Authorization: Bearer re_…` | `Authorization: Bearer secret_…` |
| `from`, `subject`, `html`, `text`, `headers` | Identiques |
| `to`, `cc`, `bcc` | Identiques, 50 adresses au maximum pour chacun |
| `reply_to` (`replyTo` dans le SDK Node.js) | `reply_to` |
| `react` (SDK Node.js) | Non disponible. Effectuez le rendu du composant en HTML et transmettez `html`. |
| `attachments[]` avec `filename` et `content` ou `path` | `attachments[]` avec `filename` et un `content` en base64 ou une `url`. `content_type` est obligatoire avec `content`. |
| `tags: [{ "name": "…", "value": "…" }]` | `meta: { "name": "value" }`, renvoyé dans les événements webhook |
| `scheduled_at` | `scheduled_at` (ISO 8601, horodatage Unix ou anglais courant) |
| En-tête `Idempotency-Key` | En-tête `Idempotency-Key`, conservé 24 heures |
| `POST /emails/batch` | Non disponible. Envoyez une requête par message. |
| Réponse `{ "id": "…" }` | `200` avec `id` (`em_…`), `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. Quand vous envoyez à plusieurs destinataires, l’objet `ids` de la réponse associe chaque adresse à son ID. Emailit suit aussi les ouvertures et les clics par e-mail avec `tracking: { "loads": true, "clicks": true }`, dès que le domaine dispose d’un sous-domaine de suivi vérifié. Consultez [Envoyer un e-mail](/fr/docs/email-api/send-email/).

### React Email

Si vous construisez vos e-mails avec React Email, conservez vos composants et effectuez-en vous-même le rendu avant l’envoi :

```jsx

const html = await render(<Receipt order={order} />);
const text = await render(<Receipt order={order} />, { plainText: true });

await emailit.emails.send({ from, to, subject, html, text });
```

## Changer les paramètres SMTP

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

Consultez [Paramètres SMTP](/fr/docs/smtp/settings/).

## Faire correspondre les événements webhook

| Événement Resend | Événement Emailit |
| --- | --- |
| `email.sent` | `email.accepted` (API uniquement) |
| `email.delivered` | `email.delivered` |
| `email.delivery_delayed` | `email.attempted` |
| `email.bounced` | `email.bounced` |
| `email.complained` | `email.complained` |
| `email.opened` | `email.loaded` |
| `email.clicked` | `email.clicked` |
| `contact.created`, `contact.updated`, `contact.deleted` | Les mêmes noms |
| `domain.created`, `domain.updated`, `domain.deleted` | Les mêmes noms |

Le format des requêtes change :

- Resend envoie un événement par requête. Emailit envoie un tableau JSON de 100 événements au maximum : parcourez donc le corps avec une boucle.
- L’e-mail se trouve dans `data.object`. Utilisez `data.object.id`, l’ID `em_` de la réponse d’envoi, au lieu de `data.email_id`. Vos valeurs `meta` se trouvent dans `data.object.meta`.
- Les signatures fonctionnent différemment. Resend signe les webhooks via Svix, avec des en-têtes `svix-*`. Emailit envoie `X-Emailit-Signature`, le HMAC-SHA256 en hexadécimal de `<timestamp>.<raw body>`, calculé avec le secret complet, préfixe `whsec_` compris. Une bibliothèque de vérification Svix ne fonctionnera pas, même si les deux secrets commencent par `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 et les contacts

1. Rassemblez toutes les adresses qui ont rebondi ou porté plainte pendant que vous utilisiez Resend, depuis le tableau de bord de Resend ou à partir des événements enregistrés par vos webhooks.

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

```csv
email,type,reason
old-address@example.com,recipient,resend bounce
angry@example.com,recipient,resend 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.

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.

Si vous envoyez des broadcasts, exportez chaque audience Resend en CSV et importez-la dans **Email Marketing → Contacts** avec **Import**, en choisissant la liste de contacts Emailit correspondante. Faites correspondre la colonne de désinscription pour que les personnes désinscrites le restent. Consultez [Importer et exporter des contacts](/fr/docs/contacts/import-export/).

## Transférer les modèles

Si vous effectuez le rendu de vos e-mails dans votre code, avec React Email ou autre chose, rien ne change : envoyez le HTML. Si vous conservez des modèles dans Resend, recréez-les dans **Email Marketing → Templates** ou avec l’[API des modèles](/fr/docs/api-reference/templates/create/), donnez un alias à chacun et envoyez-les avec `template` et `variables`.

Les modèles Emailit utilisent [Temple](/fr/docs/templates/temple/) : `{{name}}`, des valeurs imbriquées comme `{{user.name}}`, des valeurs par défaut comme `{{name|"there"}}`, et `{{#if plan}}…{{else}}…{{/if}}`. Il n’y a pas de boucles : générez donc les listes dans votre code. Temple n’échappe jamais le HTML : échappez les saisies des utilisateurs avant de les transmettre.

## 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 enregistrements de Resend, qui se trouvent généralement sur `resend._domainkey` et un sous-domaine `send`. Conservez votre enregistrement DMARC. Après la bascule, supprimez les enregistrements Resend. Consultez [Enregistrements DNS](/fr/docs/domains/dns-records/).

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