# 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](/it/docs/migrate/) per l’ordine generale e per sapere come usare entrambi i provider in parallelo.

## Concetti

| SendGrid | Emailit |
| --- | --- |
| Account e subusers | Account e [workspace](/it/docs/workspaces/). Ogni workspace ha i propri domini, chiavi, membri e crediti. |
| API key con permessi | [Chiave API](/it/docs/developers/api-keys/): **Full Access**, oppure **Sending Only** facoltativamente limitata a un dominio |
| Domain authentication | [Dominio di invio](/it/docs/domains/) con record SPF, DKIM e di return path |
| Link branding | [Sottodominio di tracciamento](/it/docs/tracking/), un CNAME come `go.acme.com` |
| Single sender verification | Non disponibile. Ogni indirizzo From deve trovarsi su un dominio verificato. |
| Dynamic templates | [Template](/it/docs/templates/) con un alias e versioni, elaborati con [Temple](/it/docs/templates/temple/) |
| Event Webhook | [Webhook](/it/docs/webhooks/) |
| Inbound Parse | [Email in entrata](/it/docs/inbound/) |
| Suppressions | [Soppressioni](/it/docs/suppressions/) |
| Unsubscribe groups | Non disponibile. Usa le [liste](/it/docs/audiences/) e i link di disiscrizione delle campagne. |
| Marketing contacts e lists | [Contatti](/it/docs/contacts/) e [liste](/it/docs/audiences/) |
| Single Sends | [Campagne](/it/docs/campaigns/) |
| Email Activity | **Email API → Emails** e **Email API → Logs** |
| Categories e custom args | `meta` |
| Dedicated IPs e IP pools | [IP dedicati](/it/docs/deliverability/dedicated-ips/) su richiesta |
| Email address validation | [Verifica email](/it/docs/email-verification/) |

## 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.

```bash title="Prima: 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="Dopo: 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`, 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](/it/docs/email-api/send-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](/it/docs/smtp/settings/).

## 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}`](/it/docs/api-reference/emails/get/) |

Come SendGrid, Emailit invia un array JSON di eventi. I campi sono diversi:

- Il nome dell’evento è in `type`, e l’email è in `data.object`. Usa `data.object.id` (l’ID `em_` della risposta all’invio) al posto di `sg_message_id`, e `data.object.to` al posto di `email`.
- I tuoi valori `meta` tornano in `data.object.meta`.
- Emailit firma le richieste con HMAC-SHA256 invece che con la chiave pubblica ECDSA di SendGrid. Verifica `X-Emailit-Signature` con il tuo secret `whsec_`. Vedi [Verifica le firme dei webhook](/it/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);
}
```

## Sposta le soppressioni

1. 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.

2. Crea un unico CSV con le colonne `email,type,reason`:

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

   Usa il tipo `recipient` per gli indirizzi che non devono mai ricevere email. Blocca gli invii via API, SMTP e campagne. I tipi `bounce`, `complaint` e `unsubscribe` fermano solo le campagne.

3. In **Email API → Suppressions**, 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](/it/docs/suppressions/manage/).

## Sposta i template

Esporta l’HTML di ogni dynamic template da SendGrid, poi importalo in **Email Marketing → Templates** o crealo con l’[API dei template](/it/docs/api-reference/templates/create/). 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](/it/docs/templates/temple/) e [Importa ed esporta i template](/it/docs/templates/import-export/).

## Cambia i DNS

Aggiungi il dominio in **Email API → Domains** 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](/it/docs/domains/dns-records/).

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](/it/docs/inbound/set-up/).

## Passaggi successivi

- [Checklist per andare in produzione](/it/docs/get-started/go-live/)
- [Configura un webhook](/it/docs/webhooks/set-up/)
- [Migrazione prioritaria](/it/docs/programs/priority-migration/): lascia che i tecnici di Emailit facciano la migrazione insieme a te

---
Fonte: https://emailit.com/it/docs/migrate/sendgrid/
