Guida
Migra da SendGrid
Passa da SendGrid a Emailit. Fai corrispondere concetti, campi API, impostazioni SMTP e nomi dell’Event Webhook, poi porta con te soppressioni, dynamic templates e DNS.
Questa guida fa corrispondere concetti, chiamate API, webhook, soppressioni e template di SendGrid ai loro equivalenti in Emailit. Leggi prima Passa a Emailit per l’ordine generale e per sapere come usare entrambi i provider in parallelo.
Concetti
| SendGrid | Emailit |
|---|---|
| Account e subusers | Account e workspace. Ogni workspace ha i propri domini, chiavi, membri e crediti. |
| API key con permessi | Chiave API: Full Access, oppure Sending Only facoltativamente limitata a un dominio |
| Domain authentication | Dominio di invio con record SPF, DKIM e di return path |
| Link branding | Sottodominio di tracciamento, un CNAME come go.acme.com |
| Single sender verification | Non disponibile. Ogni indirizzo From deve trovarsi su un dominio verificato. |
| Dynamic templates | Template con un alias e versioni, elaborati con Temple |
| Event Webhook | Webhook |
| Inbound Parse | Email in entrata |
| Suppressions | Soppressioni |
| Unsubscribe groups | Non disponibile. Usa le liste e i link di disiscrizione delle campagne. |
| Marketing contacts e lists | Contatti e liste |
| Single Sends | Campagne |
| Email Activity | Email APIEmails e Email APILogs |
| Categories e custom args | meta |
| Dedicated IPs e IP pools | IP dedicati su richiesta |
| Email address validation | Verifica email |
Aggiorna le chiamate API
POST /v3/mail/send di SendGrid diventa POST /v2/emails. La richiesta è più piatta: non ci sono personalizations, e gli indirizzi sono semplici stringhe.
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, una stringa o un array di massimo 50 indirizzi |
personalizations[].cc[], bcc[] |
cc, bcc |
reply_to: { email } |
reply_to |
subject |
subject |
content[] con text/plain e text/html |
text e html |
template_id |
template, l’ID o l’alias di un template |
personalizations[].dynamic_template_data |
variables |
attachments[] con content, filename, type, content_id |
attachments[] con content, filename, content_type, content_id, oppure un url al posto di content |
headers |
headers |
custom_args, categories |
meta, un oggetto di valori stringa restituito negli eventi webhook |
send_at (timestamp Unix) |
scheduled_at, che accetta lo stesso timestamp Unix, ISO 8601 o inglese semplice |
tracking_settings.open_tracking e click_tracking |
tracking: { "loads": true, "clicks": true } |
asm (unsubscribe groups) |
Non disponibile |
202 Accepted con un header X-Message-Id |
200 con un corpo JSON: id, status: "accepted" e ids con un ID per destinatario |
Ogni destinatario di una richiesta Emailit diventa un’email a sé, con il proprio ID. Per inviare variabili diverse a persone diverse, cosa che SendGrid fa con più personalizations, invia una richiesta per destinatario. Aggiungi un header Idempotency-Key così i nuovi tentativi sono sicuri. Vedi Invia un’email.
Cambia le impostazioni SMTP
| Impostazione | SendGrid | Emailit |
|---|---|---|
| Host | smtp.sendgrid.net |
smtp.emailit.com |
| Porta | 587, 465, 2525 o 25 |
587 (STARTTLS), 465 (TLS), 2525, 2587 o 25 |
| Nome utente | apikey |
emailit |
| Password | La tua chiave API di SendGrid | La tua chiave API di Emailit |
Emailit non legge l’header X-SMTPAPI. Rimuovilo e imposta invece il tracciamento sul dominio. Vedi Impostazioni SMTP.
Fai corrispondere gli eventi webhook
| Evento SendGrid | Evento Emailit |
|---|---|
processed |
email.accepted (solo API) |
deferred |
email.attempted |
delivered |
email.delivered |
bounce |
email.bounced |
dropped |
email.suppressed quando il destinatario è nella lista di soppressione |
open |
email.loaded |
click |
email.clicked |
spamreport |
email.complained |
unsubscribe, group_unsubscribe |
email.unsubscribed, solo per le email delle campagne |
| POST di Inbound Parse | email.received, poi recupera il contenuto con GET /emails/{id} |
Come SendGrid, Emailit invia un array JSON di eventi. I campi sono diversi:
- Il nome dell’evento è in
type, e l’email è indata.object. Usadata.object.id(l’IDem_della risposta all’invio) al posto disg_message_id, edata.object.toal posto diemail. - I tuoi valori
metatornano indata.object.meta. - Emailit firma le richieste con HMAC-SHA256 invece che con la chiave pubblica ECDSA di SendGrid. Verifica
X-Emailit-Signaturecon il tuo secretwhsec_. Vedi Verifica le firme dei webhook.
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);
}Sposta le soppressioni
-
In SendGrid, esporta Bounces, Spam Reports, Invalid Emails e Global Unsubscribes, dalle pagine delle suppressions o con gli endpoint API
/v3/suppression/*. I blocks di solito sono temporanei, quindi puoi escluderli. -
Crea un unico CSV con le colonne
email,type,reason:email,type,reason old-address@example.com,recipient,sendgrid bounce angry@example.com,recipient,sendgrid spam reportUsa il tipo
recipientper gli indirizzi che non devono mai ricevere email. Blocca gli invii via API, SMTP e campagne. I tipibounce,complainteunsubscribefermano solo le campagne. -
In Email APISuppressions, seleziona Import e carica il file. Ogni file può avere fino a 10.000 righe e pesare al massimo 8 MB, quindi dividi le liste più grandi. I duplicati vengono saltati.
Per le disiscrizioni dai gruppi delle email di marketing, importa quelle persone come contatti con unsubscribed impostato, invece di sopprimerle da tutte le email. Vedi Gestisci le soppressioni.
Sposta i template
Esporta l’HTML di ogni dynamic template da SendGrid, poi importalo in Email MarketingTemplates o crealo con l’API dei template. Assegna a ogni template un alias, come receipt, e invialo con "template": "receipt".
Entrambi usano le doppie parentesi graffe, ma Temple è più ridotto di Handlebars:
| SendGrid (Handlebars) | Emailit (Temple) |
|---|---|
{{first_name}} |
{{first_name}} |
{{{html_block}}} |
{{html_block}}. Temple non applica mai l’escape all’HTML, quindi esegui tu l’escape dell’input degli utenti. |
{{insert name "default=there"}} |
{{name|"there"}} |
{{#if plan}}…{{else}}…{{/if}} |
Uguale |
{{#each items}}…{{/each}} |
Non supportato. Genera l’elenco nel tuo codice e passalo come un’unica variabile. |
{{#equals plan "pro"}}…{{/equals}} |
Non supportato. Passa un booleano come is_pro e usa {{#if is_pro}}. |
Vedi Temple e Importa ed esporta i template.
Cambia i DNS
Aggiungi il dominio in Email APIDomains e pubblica i record di Emailit. Usano nomi propri (emailit._domainkey, emailit.<domain> e, facoltativamente, go e inbound), quindi non entrano in conflitto con i CNAME di domain authentication o di link branding di SendGrid. Mantieni il record DMARC. Dopo il passaggio, rimuovi i CNAME di SendGrid. Vedi Record DNS.
Se usavi Inbound Parse, punta a Emailit il record MX del tuo hostname di parse. Per mantenere lo stesso hostname, come parse.acme.com, imposta l’inbound_key del dominio su parse con l’API. Vedi Configura le email in entrata.
Passaggi successivi
- Checklist per andare in produzione
- Configura un webhook
- Migrazione prioritaria: lascia che i tecnici di Emailit facciano la migrazione insieme a te