# Migra da Mailgun

> Passa da Mailgun a Emailit. Fai corrispondere domini, chiavi e routes, converti in JSON le chiamate API con form encoding e sposta SMTP, webhook, soppressioni e template.

Questa guida fa corrispondere concetti, chiamate API, webhook, soppressioni e template di Mailgun 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

| Mailgun | Emailit |
| --- | --- |
| Account e subaccounts | Account e [workspace](/it/docs/workspaces/). Ogni workspace ha i propri domini, chiavi, membri e crediti. |
| Dominio, con un proprio percorso API `/v3/<domain>/…` | [Dominio di invio](/it/docs/domains/). C’è un solo endpoint di invio, ed Emailit ricava il dominio dall’indirizzo `from`. |
| Private API key | [Chiave API](/it/docs/developers/api-keys/) **Full Access** |
| Domain sending key | Chiave API **Sending Only** limitata a un dominio |
| Credenziali SMTP per dominio | La tua chiave API, usata come password SMTP |
| Template per dominio, con versioni | [Template](/it/docs/templates/) per workspace, con un alias e versioni |
| Webhook per dominio | [Webhook](/it/docs/webhooks/) per workspace |
| Routes | [Email in entrata](/it/docs/inbound/) con il webhook `email.received`, oppure l’[automazione](/it/docs/inbound/forward-with-automations/) **Forward received email** |
| Suppressions per dominio: bounces, unsubscribes, complaints | Una [lista di soppressione](/it/docs/suppressions/) per workspace |
| Mailing lists | [Liste](/it/docs/audiences/) |
| Tags e custom variables | `meta` |
| Logs ed events | **Email API → Emails**, **Email API → Events** e **Email API → Logs** |
| Email validation | [Verifica email](/it/docs/email-verification/) |

## Aggiorna le chiamate API

`POST /v3/<domain>/messages` di Mailgun accetta campi di un modulo con autenticazione basic. `POST /v2/emails` di Emailit accetta JSON con un bearer token:

```bash title="Prima: Mailgun"
curl -s --user "api:$MAILGUN_API_KEY" \
  https://api.mailgun.net/v3/mg.acme.com/messages \
  -F from='Acme <hello@mg.acme.com>' \
  -F to='ada@example.com' \
  -F subject='Your receipt' \
  -F text='Thanks for your order.' \
  --form-string html='<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@mg.acme.com>",
    "to": "ada@example.com",
    "subject": "Your receipt",
    "text": "Thanks for your order.",
    "html": "<p>Thanks for your order.</p>"
  }'
```

| Mailgun | Emailit |
| --- | --- |
| Autenticazione basic `api:<key>` | `Authorization: Bearer secret_…` |
| Campi `multipart/form-data` | Un corpo JSON |
| `from`, `subject`, `text`, `html` | Gli stessi nomi |
| `to`, `cc`, `bcc` (ripetuti o separati da virgole) | `to`, `cc`, `bcc` come stringa o array di massimo 50 ciascuno |
| `h:Reply-To` | `reply_to` |
| `h:X-My-Header` | `headers: { "X-My-Header": "…" }` |
| `v:order-id`, `h:X-Mailgun-Variables` | `meta: { "order-id": "…" }`, restituito negli eventi webhook |
| `template` e `t:variables` | `template` (un ID o un alias) e `variables` |
| `attachment`, `inline` (caricamento di file) | `attachments[]` con `content` in base64 o un `url`, più `content_type`. Aggiungi `content_id` per le immagini inline. |
| `o:deliverytime` (data RFC 2822) | `scheduled_at` (ISO 8601, timestamp Unix o inglese semplice) |
| `o:tracking`, `o:tracking-opens`, `o:tracking-clicks` | `tracking: { "loads": true, "clicks": true }` |
| `o:tag` | `meta` |
| `o:testmode` | Non disponibile |
| `recipient-variables` (invio in batch) | Non disponibile. Invia una richiesta per destinatario con le sue `variables`. |
| Risposta `{ "id": "<…>", "message": "Queued. Thank you." }` | `200` con `id` (`em_…`), `message_id`, `status: "accepted"` e `ids` per destinatario |

Se inviavi da un sottodominio come `mg.acme.com`, aggiungi esattamente quel sottodominio in Emailit. I sottodomini vengono verificati separatamente dal dominio principale. Gli host API UE e USA di Mailgun corrispondono entrambi all’unico endpoint di Emailit. Vedi [Invia un’email](/it/docs/email-api/send-email/).

## Cambia le impostazioni SMTP

| Impostazione | Mailgun | Emailit |
| --- | --- | --- |
| Host | `smtp.mailgun.org`, oppure l’host UE | `smtp.emailit.com` |
| Porta | `587`, `465`, `2525` o `25` | `587` (STARTTLS), `465` (TLS), `2525`, `2587` o `25` |
| Nome utente | Il tuo login SMTP, ad esempio `postmaster@mg.acme.com` | `emailit` |
| Password | La tua password SMTP | La tua chiave API di Emailit |

Emailit non legge gli header `X-Mailgun-*`. Rimuovili e imposta invece il tracciamento sul dominio. Vedi [Impostazioni SMTP](/it/docs/smtp/settings/).

## Fai corrispondere gli eventi webhook

| Evento Mailgun | Evento Emailit |
| --- | --- |
| `accepted` | `email.accepted` (solo API) |
| `delivered` | `email.delivered` |
| `failed` con severity `temporary` | `email.attempted` |
| `failed` con severity `permanent` | `email.bounced` |
| `opened` | `email.loaded` |
| `clicked` | `email.clicked` |
| `complained` | `email.complained` |
| `unsubscribed` | `email.unsubscribed`, solo per le email delle campagne |
| Route che inoltra a un URL | `email.received`, poi recupera il contenuto con [`GET /emails/{id}`](/it/docs/api-reference/emails/get/) |

Cambia il formato della richiesta:

- Mailgun invia un evento per richiesta, con i dettagli in `event-data`. Emailit invia un array JSON di massimo 100 eventi. Esegui un ciclo sull’array.
- Il nome dell’evento è in `type`, e l’email è in `data.object`. Usa `data.object.id`, l’ID `em_` della risposta all’invio, per associare gli eventi ai messaggi. I tuoi valori `meta` sono in `data.object.meta`.
- Mailgun firma un timestamp e un token all’interno del corpo. Emailit firma l’intero corpo grezzo: verifica `X-Emailit-Signature` rispetto a `X-Emailit-Timestamp` e al 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. Esporta le liste **Bounces**, **Complaints** e **Unsubscribes** di ogni dominio Mailgun da cui invii, dal pannello di controllo o con l’API delle suppressions (`/v3/<domain>/bounces`, `/complaints` e `/unsubscribes`).

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

```csv
email,type,reason
old-address@example.com,recipient,mailgun bounce
angry@example.com,recipient,mailgun complaint
```

   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. I duplicati vengono saltati.

Emailit ha una sola lista di soppressione per workspace, quindi gli indirizzi di tutti i tuoi domini Mailgun finiscono nella stessa lista. Non esiste una allowlist. Vedi [Gestisci le soppressioni](/it/docs/suppressions/manage/).

## Sposta i template

Copia l’HTML di ogni template da Mailgun, poi importalo in **Email Marketing → Templates** o crealo con l’[API dei template](/it/docs/api-reference/templates/create/). Assegnagli un alias e invialo con `"template": "<alias>"` e `variables`.

I template di Mailgun usano Handlebars. Temple copre le parti più comuni:

| Mailgun (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. |
| `{{#if plan}}…{{else}}…{{/if}}` | Uguale |
| `{{#unless plan}}…{{/unless}}` | `{{#if plan}}{{else}}…{{/if}}` |
| `{{#each items}}…{{/each}}` | Non supportato. Genera l’elenco nel tuo codice e passalo come un’unica variabile. |
| `{{#equal plan "pro"}}…{{/equal}}` | Non supportato. Passa un booleano come `is_pro` e usa `{{#if is_pro}}`. |
| Nessun valore predefinito integrato | `{{first_name\|"there"}}` aggiunge un valore di riserva |

Vedi [Temple](/it/docs/templates/temple/) e [Importa ed esporta i template](/it/docs/templates/import-export/).

## Cambia i DNS

Aggiungi ogni 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 il record DKIM di Mailgun né con il suo CNAME di tracciamento `email.<domain>`. Per Emailit non devi modificare il record SPF del dominio principale. Mantieni il record DMARC. Vedi [Record DNS](/it/docs/domains/dns-records/).

Dopo il passaggio, rimuovi i record DKIM e di tracciamento di Mailgun, e togli `include:mailgun.org` dal record SPF. Se ricevi posta tramite le routes di Mailgun, mantieni i suoi record MX finché non hai spostato quel traffico sulle [email in entrata di Emailit](/it/docs/inbound/set-up/), che ricevono su un sottodominio come `inbound.acme.com`.

## 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/mailgun/
