# Migra da Resend

> Passa da Resend a Emailit. Le API sono simili, quindi le modifiche sono poche. Fai corrispondere campi, impostazioni SMTP ed eventi webhook, verifica le firme e sposta i contatti.

Questa guida fa corrispondere concetti, chiamate API, webhook e template di Resend ai loro equivalenti in Emailit. Le due API hanno una struttura simile, quindi la maggior parte delle modifiche al codice è piccola. Leggi prima [Passa a Emailit](/it/docs/migrate/) per l’ordine generale e per sapere come usare entrambi i provider in parallelo.

## Concetti

| Resend | Emailit |
| --- | --- |
| Team | [Workspace](/it/docs/workspaces/). Ogni workspace ha i propri domini, chiavi, membri e crediti. |
| API key con accesso full o sending | [Chiave API](/it/docs/developers/api-keys/): **Full Access**, oppure **Sending Only** facoltativamente limitata a un dominio |
| Domains | [Domini di invio](/it/docs/domains/) |
| Audiences e contacts | [Contatti](/it/docs/contacts/) e [liste](/it/docs/audiences/) |
| Broadcasts | [Campagne](/it/docs/campaigns/) |
| Webhooks | [Webhook](/it/docs/webhooks/) |
| Emails e logs | **Email API → Emails** e **Email API → Logs** |
| `tags` | `meta` |
| Componenti React Email | HTML che generi nel tuo codice, oppure [template](/it/docs/templates/) progettati nel pannello |

## Aggiorna le chiamate API

`POST /emails` di Resend diventa `POST /v2/emails` di Emailit, con quasi gli stessi campi. In Node.js:

```javascript title="Prima: Resend"

const resend = new Resend(process.env.RESEND_API_KEY);

await resend.emails.send({
  from: 'Acme <hello@acme.com>',
  to: ['ada@example.com'],
  subject: 'Your receipt',
  html: '<p>Thanks for your order.</p>',
});
```

```javascript title="Dopo: Emailit"

const emailit = new Emailit(process.env.EMAILIT_API_KEY);

await emailit.emails.send({
  from: 'Acme <hello@acme.com>',
  to: ['ada@example.com'],
  subject: 'Your receipt',
  html: '<p>Thanks for your order.</p>',
});
```

| Resend | Emailit |
| --- | --- |
| `Authorization: Bearer re_…` | `Authorization: Bearer secret_…` |
| `from`, `subject`, `html`, `text`, `headers` | Uguali |
| `to`, `cc`, `bcc` | Uguali, fino a 50 ciascuno |
| `reply_to` (`replyTo` nell’SDK Node.js) | `reply_to` |
| `react` (SDK Node.js) | Non disponibile. Genera l’HTML dal componente e passa `html`. |
| `attachments[]` con `filename` e `content` o `path` | `attachments[]` con `filename` e `content` in base64 o un `url`. `content_type` è obbligatorio con `content`. |
| `tags: [{ "name": "…", "value": "…" }]` | `meta: { "name": "value" }`, restituito negli eventi webhook |
| `scheduled_at` | `scheduled_at` (ISO 8601, timestamp Unix o inglese semplice) |
| Header `Idempotency-Key` | Header `Idempotency-Key`, conservato per 24 ore |
| `POST /emails/batch` | Non disponibile. Invia una richiesta per messaggio. |
| Risposta `{ "id": "…" }` | `200` con `id` (`em_…`), `status: "accepted"` e `ids` con un ID per destinatario |

Ogni destinatario di una richiesta Emailit diventa un’email a sé, con il proprio ID. Quando invii a più destinatari, la mappa `ids` della risposta associa ogni indirizzo al suo ID. Emailit traccia anche aperture e clic per singola email con `tracking: { "loads": true, "clicks": true }`, quando il dominio ha un sottodominio di tracciamento verificato. Vedi [Invia un’email](/it/docs/email-api/send-email/).

### React Email

Se crei le email con React Email, mantieni i tuoi componenti e generali tu prima dell’invio:

```jsx

const html = await render(<Receipt order={order} />);
const text = await render(<Receipt order={order} />, { plainText: true });

await emailit.emails.send({ from, to, subject, html, text });
```

## Cambia le impostazioni SMTP

| Impostazione | Resend | Emailit |
| --- | --- | --- |
| Host | `smtp.resend.com` | `smtp.emailit.com` |
| Porta | `587`, `2587` o `25` (STARTTLS), `465` o `2465` (TLS) | `587`, `2587`, `2525` o `25` (STARTTLS), `465` (TLS) |
| Nome utente | `resend` | `emailit` |
| Password | La tua chiave API di Resend | La tua chiave API di Emailit |

Vedi [Impostazioni SMTP](/it/docs/smtp/settings/).

## Fai corrispondere gli eventi webhook

| Evento Resend | Evento Emailit |
| --- | --- |
| `email.sent` | `email.accepted` (solo API) |
| `email.delivered` | `email.delivered` |
| `email.delivery_delayed` | `email.attempted` |
| `email.bounced` | `email.bounced` |
| `email.complained` | `email.complained` |
| `email.opened` | `email.loaded` |
| `email.clicked` | `email.clicked` |
| `contact.created`, `contact.updated`, `contact.deleted` | Gli stessi nomi |
| `domain.created`, `domain.updated`, `domain.deleted` | Gli stessi nomi |

Cambia il formato della richiesta:

- Resend invia un evento per richiesta. Emailit invia un array JSON di massimo 100 eventi, quindi esegui un ciclo sul corpo.
- L’email si trova in `data.object`. Usa `data.object.id`, l’ID `em_` della risposta all’invio, al posto di `data.email_id`. I tuoi valori `meta` sono in `data.object.meta`.
- Le firme funzionano in modo diverso. Resend firma i webhook tramite Svix, con gli header `svix-*`. Emailit invia `X-Emailit-Signature`, l’HMAC-SHA256 in esadecimale di `<timestamp>.<raw body>`, calcolato con l’intero secret compreso il prefisso `whsec_`. Una libreria di verifica Svix non funziona, anche se entrambi i secret iniziano con `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 soppressioni e contatti

1. Raccogli tutti gli indirizzi che hanno generato bounce o segnalazioni mentre usavi Resend, dal pannello di Resend o dagli eventi salvati dai tuoi webhook.

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

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

   Usa il tipo `recipient` per gli indirizzi che non devono mai ricevere email. Blocca gli invii via API, SMTP e 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.

Se invii broadcast, esporta ogni audience di Resend in CSV e importala in **Email Marketing → Contacts** con **Import**, scegliendo la lista Emailit corrispondente. Mappa la colonna delle disiscrizioni, così chi ha rinunciato resta disiscritto. Vedi [Importa ed esporta i contatti](/it/docs/contacts/import-export/).

## Sposta i template

Se generi le email nel codice, con React Email o con qualsiasi altro strumento, non cambia nulla: invia l’HTML. Se tieni i template in Resend, ricreali in **Email Marketing → Templates** o con l’[API dei template](/it/docs/api-reference/templates/create/), assegna a ciascuno un alias e invialo con `template` e `variables`.

I template di Emailit usano [Temple](/it/docs/templates/temple/): `{{name}}`, valori annidati come `{{user.name}}`, valori predefiniti come `{{name|"there"}}` e `{{#if plan}}…{{else}}…{{/if}}`. Non ci sono cicli, quindi genera gli elenchi nel tuo codice. Temple non applica mai l’escape all’HTML, quindi esegui l’escape dell’input degli utenti prima di passarlo.

## 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 record di Resend, che di solito si trovano su `resend._domainkey` e su un sottodominio `send`. Mantieni il record DMARC. Dopo il passaggio, rimuovi i record di Resend. Vedi [Record DNS](/it/docs/domains/dns-records/).

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