# Migra da Postmark

> Passa da Postmark a Emailit. Fai corrispondere server, message streams e token, converti i campi API, cambia le impostazioni SMTP e sposta webhook, soppressioni e template.

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

| Postmark | Emailit |
| --- | --- |
| Account | Account |
| Server | [Workspace](/it/docs/workspaces/), oppure un solo workspace con più domini di invio |
| Server API token | [Chiave API](/it/docs/developers/api-keys/) **Sending Only**, facoltativamente limitata a un dominio |
| Account API token | Chiave API **Full Access** |
| Transactional message stream | L’[API email](/it/docs/email-api/) e l’[SMTP relay](/it/docs/smtp/) |
| Broadcast message stream | [Campagne](/it/docs/campaigns/) inviate alle [liste](/it/docs/audiences/), oppure l’API con un tuo header `List-Unsubscribe` |
| Inbound message stream | [Email in entrata](/it/docs/inbound/) su un sottodominio come `inbound.acme.com` |
| Sender signatures e domini | [Domini di invio](/it/docs/domains/). Le sender signatures per un singolo indirizzo non sono disponibili. |
| Templates e layouts | [Template](/it/docs/templates/) con un alias e versioni. Non ci sono layout. |
| Webhook per stream | [Webhook](/it/docs/webhooks/) per workspace |
| Suppressions per stream | Una [lista di soppressione](/it/docs/suppressions/) per workspace |
| Activity | **Email API → Emails** e **Email API → Logs** |
| `Tag` e `Metadata` | `meta` |

Per tenere separate la reputazione transazionale e quella di marketing, invia da domini o sottodomini diversi, come `mail.acme.com` per le ricevute e `news.acme.com` per le newsletter.

## Aggiorna le chiamate API

`POST /email` di Postmark con un `X-Postmark-Server-Token` diventa `POST /v2/emails` con un bearer token. I nomi dei campi passano da PascalCase a snake_case:

```bash title="Prima: Postmark"
curl https://api.postmarkapp.com/email \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Postmark-Server-Token: $POSTMARK_SERVER_TOKEN" \
  -d '{
    "From": "Acme <hello@acme.com>",
    "To": "ada@example.com",
    "Subject": "Your receipt",
    "TextBody": "Thanks for your order.",
    "HtmlBody": "<p>Thanks for your order.</p>",
    "MessageStream": "outbound"
  }'
```

```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>"
  }'
```

| Postmark | Emailit |
| --- | --- |
| Header `X-Postmark-Server-Token` | `Authorization: Bearer secret_…` |
| `From` | `from` |
| `To`, `Cc`, `Bcc` (stringhe separate da virgole) | `to`, `cc`, `bcc` come stringa o array di massimo 50 ciascuno |
| `ReplyTo` | `reply_to` |
| `Subject` | `subject` |
| `HtmlBody`, `TextBody` | `html`, `text` |
| `Headers: [{ "Name": "…", "Value": "…" }]` | `headers: { "Name": "Value" }` |
| `Metadata`, `Tag` | `meta`, restituito negli eventi webhook |
| `TrackOpens`, `TrackLinks` | `tracking: { "loads": true, "clicks": true }` |
| `Attachments[]` con `Name`, `Content`, `ContentType`, `ContentID` | `attachments[]` con `filename`, `content`, `content_type`, `content_id` |
| `MessageStream` | Non serve |
| `POST /email/withTemplate` con `TemplateAlias` o `TemplateId` e `TemplateModel` | Lo stesso `POST /v2/emails` con `template` (un alias o un ID) e `variables` |
| Risposta con `MessageID` ed `ErrorCode: 0` | `200` con `id` (`em_…`), `status: "accepted"` e `ids` per destinatario. Gli errori usano i codici di stato HTTP. |

Emailit non ha un endpoint batch. Invia una richiesta per messaggio, ciascuna con un massimo di 50 destinatari, e 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 | Postmark | Emailit |
| --- | --- | --- |
| Host | `smtp.postmarkapp.com` | `smtp.emailit.com` |
| Porta | `587`, `2525` o `25` | `587` (STARTTLS), `465` (TLS), `2525`, `2587` o `25` |
| Nome utente | Il tuo server API token | `emailit` |
| Password | Il tuo server API token | La tua chiave API di Emailit |

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

## Fai corrispondere gli eventi webhook

| Webhook di Postmark | Evento Emailit |
| --- | --- |
| Delivery | `email.delivered` |
| Bounce, tipi di hard bounce | `email.bounced` |
| Bounce, tipi soft o transient | `email.attempted` mentre Emailit ritenta, poi `email.bounced` se tutti i nuovi tentativi non riescono |
| Spam complaint | `email.complained` |
| Open | `email.loaded` |
| Click | `email.clicked` |
| Subscription change | `email.unsubscribed` per le email delle campagne, e `suppression.created` o `suppression.deleted` per le soppressioni che aggiungi o rimuovi con l’API |
| Inbound | `email.received`, poi recupera il contenuto con [`GET /emails/{id}`](/it/docs/api-reference/emails/get/) |

Emailit invia anche `email.accepted` quando l’API accetta un’email, evento per cui Postmark non ha un webhook.

Cambia il formato della richiesta:

- Postmark invia un record per richiesta e ne indica il nome in `RecordType`. Emailit invia un array JSON di massimo 100 eventi, con il nome in `type` e l’email in `data.object`.
- Usa `data.object.id`, l’ID `em_` della risposta all’invio, al posto di `MessageID`. I tuoi valori `meta` sono in `data.object.meta`.
- I webhook di Postmark di solito sono protetti con credenziali di autenticazione basic nell’URL. Emailit invece firma ogni richiesta: 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 suppressions di ogni message stream di Postmark da cui invii, dalla pagina delle suppressions dello stream o con l’API suppressions dump. Includi hard bounce, segnalazioni di spam e soppressioni manuali.

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

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

   Usa il tipo `recipient` per gli indirizzi che non devono mai ricevere email. Blocca gli invii via API, SMTP e campagne. Per le persone che hanno solo rinunciato alle tue comunicazioni broadcast, usa il tipo `unsubscribe`, che ferma le campagne ma lascia passare le email transazionali.

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.

Vedi [Gestisci le soppressioni](/it/docs/suppressions/manage/).

## Sposta i template

Copia l’HTML di ogni template da Postmark, compreso il suo layout, poi importalo in **Email Marketing → Templates** o crealo con l’[API dei template](/it/docs/api-reference/templates/create/). Emailit non ha layout, quindi unisci layout e contenuto in un unico template. Usa lo stesso alias che usavi in Postmark, così le modifiche al codice restano minime.

I template di Postmark usano Mustachio. Temple copre i valori semplici e le condizioni:

| Postmark (Mustachio) | Emailit (Temple) |
| --- | --- |
| `{{name}}` | `{{name}}` |
| `{{company.name}}` | `{{company.name}}` |
| Sezioni `{{#company}}…{{/company}}` | `{{#if company}}…{{/if}}`, con percorsi completi come `{{company.name}}` all’interno |
| Sezioni invertite `{{^name}}…{{/name}}` | `{{#if name}}{{else}}…{{/if}}` |
| `{{#each items}}…{{/each}}` | Non supportato. Genera l’elenco nel tuo codice e passalo come un’unica variabile. |
| `TemplateModel` | `variables` |

Temple non applica mai l’escape all’HTML, quindi esegui l’escape dell’input degli utenti prima di passarlo. Un valore mancante diventa una stringa vuota, a meno che tu non aggiunga un valore predefinito, come `{{name|"there"}}`. Vedi [Temple](/it/docs/templates/temple/).

## 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 il record DKIM di Postmark né con il suo CNAME di return path `pm-bounces`. Mantieni il record DMARC. Dopo il passaggio, rimuovi i record di Postmark. Vedi [Record DNS](/it/docs/domains/dns-records/).

Se elabori la posta in entrata con Postmark, spostala su un sottodominio di ricezione di Emailit e aggiorna gli indirizzi che la tua app comunica. 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/postmark/
