Guida
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 per l’ordine generale e per sapere come usare entrambi i provider in parallelo.
Concetti
| Resend | Emailit |
|---|---|
| Team | Workspace. Ogni workspace ha i propri domini, chiavi, membri e crediti. |
| API key con accesso full o sending | Chiave API: Full Access, oppure Sending Only facoltativamente limitata a un dominio |
| Domains | Domini di invio |
| Audiences e contacts | Contatti e liste |
| Broadcasts | Campagne |
| Webhooks | Webhook |
| Emails e logs | Email APIEmails e Email APILogs |
tags |
meta |
| Componenti React Email | HTML che generi nel tuo codice, oppure template 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:
import { Resend } from '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>',
});import { Emailit } from '@emailit/node';
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.
React Email
Se crei le email con React Email, mantieni i tuoi componenti e generali tu prima dell’invio:
import { render } from '@react-email/render';
import Receipt from './emails/receipt';
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.
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. Usadata.object.id, l’IDem_della risposta all’invio, al posto didata.email_id. I tuoi valorimetasono indata.object.meta. - Le firme funzionano in modo diverso. Resend firma i webhook tramite Svix, con gli header
svix-*. Emailit inviaX-Emailit-Signature, l’HMAC-SHA256 in esadecimale di<timestamp>.<raw body>, calcolato con l’intero secret compreso il prefissowhsec_. Una libreria di verifica Svix non funziona, anche se entrambi i secret iniziano conwhsec_. 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 soppressioni e contatti
-
Raccogli tutti gli indirizzi che hanno generato bounce o segnalazioni mentre usavi Resend, dal pannello di Resend o dagli eventi salvati dai tuoi webhook.
-
Crea un unico CSV con le colonne
email,type,reason:email,type,reason old-address@example.com,recipient,resend bounce angry@example.com,recipient,resend complaintUsa il tipo
recipientper gli indirizzi che non devono mai ricevere email. Blocca gli invii via API, SMTP e 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. I duplicati vengono saltati.
Se invii broadcast, esporta ogni audience di Resend in CSV e importala in Email MarketingContacts con Import, scegliendo la lista Emailit corrispondente. Mappa la colonna delle disiscrizioni, così chi ha rinunciato resta disiscritto. Vedi Importa ed esporta i contatti.
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 MarketingTemplates o con l’API dei template, assegna a ciascuno un alias e invialo con template e variables.
I template di Emailit usano 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 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 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.
Passaggi successivi
- Checklist per andare in produzione
- Configura un webhook
- Migrazione prioritaria: lascia che i tecnici di Emailit facciano la migrazione insieme a te