Guide
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 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. Chaque espace de travail a ses propres domaines, clés, membres et crédits. |
| Clé API avec permissions | Clé API : Full Access, ou Sending Only, éventuellement restreinte à un domaine |
| Domain authentication | Domaine d’envoi avec des enregistrements SPF, DKIM et return-path |
| Link branding | Sous-domaine de suivi, 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 avec un alias et des versions, dont le rendu est effectué avec Temple |
| Event Webhook | Webhooks |
| Inbound Parse | E-mails entrants |
| Suppressions | Adresses bloquées |
| Unsubscribe groups | Non disponible. Utilisez des listes de contacts et les liens de désinscription des campagnes. |
| Contacts et listes marketing | Contacts et listes de contacts |
| Single Sends | Campagnes |
| Email Activity | Email APIEmails et Email APILogs |
| Categories et custom args | meta |
| IP dédiées et pools d’IP | IP dédiées sur demande |
| Validation d’adresses e-mail | Vérification d’e-mails |
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.
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>" }
]
}'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 <email>" |
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.
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.
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} |
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 dansdata.object. Utilisezdata.object.id(l’IDem_de la réponse d’envoi) au lieu desg_message_id, etdata.object.toau lieu deemail. - Vos valeurs
metareviennent dansdata.object.meta. - Emailit signe les requêtes avec HMAC-SHA256 au lieu de la clé publique ECDSA de SendGrid. Vérifiez
X-Emailit-Signatureavec votre secretwhsec_. 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
-
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é. -
Constituez un seul CSV avec les colonnes
email,type,reason:email,type,reason old-address@example.com,recipient,sendgrid bounce angry@example.com,recipient,sendgrid spam reportUtilisez 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. Les typesbounce,complaintetunsubscriben’arrêtent que 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 : 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.
Transférer les modèles
Exportez le HTML de chaque modèle dynamique depuis SendGrid, puis importez-le dans Email MarketingTemplates ou créez-le avec l’API des modèles. 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 et Importer et exporter des modèles.
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 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.
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.
É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