Guide
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 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. Chaque espace de travail a ses propres domaines, clés, membres et crédits. |
| Clé API à accès complet ou d’envoi | Clé API : Full Access, ou Sending Only, éventuellement restreinte à un domaine |
| Domaines | Domaines d’envoi |
| Audiences et contacts | Contacts et listes de contacts |
| Broadcasts | Campagnes |
| Webhooks | Webhooks |
| E-mails et logs | Email APIEmails et Email APILogs |
tags |
meta |
| Composants React Email | Du HTML dont vous effectuez le rendu dans votre code, ou des modèles 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 :
import { Resend } from '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>',
});import { Emailit } from '@emailit/node';
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.
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 :
import { render } from '@react-email/render';
import Receipt from './emails/receipt';
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.
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. Utilisezdata.object.id, l’IDem_de la réponse d’envoi, au lieu dedata.email_id. Vos valeursmetase trouvent dansdata.object.meta. - Les signatures fonctionnent différemment. Resend signe les webhooks via Svix, avec des en-têtes
svix-*. Emailit envoieX-Emailit-Signature, le HMAC-SHA256 en hexadécimal de<timestamp>.<raw body>, calculé avec le secret complet, préfixewhsec_compris. Une bibliothèque de vérification Svix ne fonctionnera pas, même si les deux secrets commencent parwhsec_. Consultez Signature des requêtes.
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
-
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.
-
Constituez un seul CSV avec les colonnes
email,type,reason:email,type,reason old-address@example.com,recipient,resend bounce angry@example.com,recipient,resend complaintUtilisez le type
recipientpour les adresses qui ne doivent jamais recevoir d’e-mail. Il bloque les envois par l’API, par SMTP et par les campagnes. -
Dans Email APISuppressions, 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 MarketingContacts 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.
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 MarketingTemplates ou avec l’API des modèles, donnez un alias à chacun et envoyez-les avec template et variables.
Les modèles Emailit utilisent 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 APIDomains 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.
Étapes suivantes
- Liste de contrôle avant la mise en production
- Configurer des webhooks
- Migration prioritaire : laissez les ingénieurs d’Emailit effectuer la migration avec vous