Leitfaden
Von Resend migrieren
Wechseln Sie von Resend zu Emailit. Die APIs sind sich ähnlich, die Änderungen also klein. Felder, SMTP-Einstellungen und Webhook-Events zuordnen, Signaturen verifizieren und Kontakte umziehen.
Diese Anleitung ordnet Konzepte, API-Aufrufe, Webhooks und Vorlagen von Resend ihren Entsprechungen in Emailit zu. Die beiden APIs sind ähnlich aufgebaut, daher sind die meisten Codeänderungen klein. Lesen Sie zuerst Zu Emailit migrieren für die allgemeine Reihenfolge und den parallelen Betrieb beider Anbieter.
Konzepte
| Resend | Emailit |
|---|---|
| Team | Workspace. Jeder Workspace hat eigene Domains, Schlüssel, Mitglieder und Credits. |
| API-Schlüssel mit vollem Zugriff oder Sendezugriff | API-Schlüssel: Full Access oder Sending Only, optional auf eine Domain beschränkt |
| Domains | Versanddomains |
| Audiences und Contacts | Kontakte und Kontaktlisten |
| Broadcasts | Kampagnen |
| Webhooks | Webhooks |
| Emails und Logs | Email APIEmails und Email APILogs |
tags |
meta |
| React-Email-Komponenten | HTML, das Sie in Ihrem Code rendern, oder Vorlagen, die Sie in der Weboberfläche gestalten |
API-Aufrufe anpassen
Aus POST /emails von Resend wird POST /v2/emails von Emailit, mit nahezu denselben Feldern. 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 |
Identisch |
to, cc, bcc |
Identisch, jeweils bis zu 50 |
reply_to (replyTo im Node.js-SDK) |
reply_to |
react (Node.js-SDK) |
Nicht verfügbar. Rendern Sie die Komponente zu HTML und übergeben Sie html. |
attachments[] mit filename und content oder path |
attachments[] mit filename und Base64-kodiertem content oder einer url. Mit content ist content_type erforderlich. |
tags: [{ "name": "…", "value": "…" }] |
meta: { "name": "value" }, in Webhook-Events zurückgegeben |
scheduled_at |
scheduled_at (ISO 8601, Unix-Zeit oder englischer Klartext) |
Header Idempotency-Key |
Header Idempotency-Key, 24 Stunden lang gespeichert |
POST /emails/batch |
Nicht verfügbar. Senden Sie eine Anfrage pro Nachricht. |
Antwort { "id": "…" } |
200 mit id (em_…), status: "accepted" und ids mit einer ID pro Empfänger |
Jeder Empfänger in einer Anfrage an Emailit wird zu einer eigenen E-Mail mit eigener ID. Wenn Sie an mehrere Empfänger senden, ordnet ids in der Antwort jeder Adresse ihre ID zu. Emailit trackt außerdem Öffnungen und Klicks pro E-Mail mit tracking: { "loads": true, "clicks": true }, sobald die Domain eine verifizierte Tracking-Subdomain hat. Siehe E-Mail senden.
React Email
Wenn Sie E-Mails mit React Email bauen, behalten Sie Ihre Komponenten und rendern Sie sie vor dem Senden selbst:
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 });SMTP-Einstellungen umstellen
| Einstellung | Resend | Emailit |
|---|---|---|
| Host | smtp.resend.com |
smtp.emailit.com |
| Port | 587, 2587 oder 25 (STARTTLS), 465 oder 2465 (TLS) |
587, 2587, 2525 oder 25 (STARTTLS), 465 (TLS) |
| Benutzername | resend |
emailit |
| Passwort | Ihr Resend-API-Schlüssel | Ihr Emailit-API-Schlüssel |
Siehe SMTP-Einstellungen.
Webhook-Events zuordnen
| Resend-Event | Emailit-Event |
|---|---|
email.sent |
email.accepted (nur 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 |
Dieselben Namen |
domain.created, domain.updated, domain.deleted |
Dieselben Namen |
Das Anfrageformat ändert sich:
- Resend sendet ein Event pro Anfrage. Emailit sendet ein JSON-Array mit bis zu 100 Events. Iterieren Sie also über den Body.
- Die E-Mail steht in
data.object. Verwenden Siedata.object.id, dieem_-ID aus der Antwort auf den Versand, stattdata.email_id. Ihremeta-Werte stehen indata.object.meta. - Signaturen funktionieren anders. Resend signiert Webhooks über Svix, mit
svix-*-Headern. Emailit sendetX-Emailit-Signature, den hexadezimal kodierten HMAC-SHA256 von<timestamp>.<raw body>, mit dem vollständigen Secret einschließlich des Präfixeswhsec_als Schlüssel. Eine Svix-Bibliothek zur Verifizierung funktioniert nicht, obwohl beide Secrets mitwhsec_beginnen. Siehe Anfragesignatur.
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);
}Sperrungen und Kontakte umziehen
-
Sammeln Sie jede Adresse, die während Ihrer Nutzung von Resend gebounct ist oder sich beschwert hat, aus dem Dashboard von Resend oder aus den Events, die Ihre Webhooks gespeichert haben.
-
Erstellen Sie eine CSV-Datei mit den Spalten
email,type,reason:email,type,reason old-address@example.com,recipient,resend bounce angry@example.com,recipient,resend complaintVerwenden Sie den Typ
recipientfür Adressen, die nie E-Mails erhalten dürfen. Er blockiert Versände per API, SMTP und Kampagne. -
Wählen Sie unter Email APISuppressions die Option Import und laden Sie die Datei hoch. Jede Datei darf bis zu 10.000 Zeilen haben und höchstens 8 MB groß sein. Duplikate werden übersprungen.
Wenn Sie Broadcasts senden, exportieren Sie jede Audience von Resend als CSV-Datei und importieren Sie sie unter Email MarketingContacts mit Import, wobei Sie die passende Kontaktliste in Emailit wählen. Ordnen Sie die Spalte für Abmeldungen zu, damit abgemeldete Personen abgemeldet bleiben. Siehe Kontakte importieren und exportieren.
Vorlagen umziehen
Wenn Sie E-Mails im Code rendern, mit React Email oder etwas anderem, ändert sich nichts: Senden Sie das HTML. Wenn Sie Vorlagen in Resend pflegen, legen Sie sie unter Email MarketingTemplates oder mit der Vorlagen-API neu an, geben Sie jeder einen Alias und senden Sie sie mit template und variables.
Vorlagen in Emailit verwenden Temple: {{name}}, verschachtelte Werte wie {{user.name}}, Standardwerte wie {{name|"there"}} und {{#if plan}}…{{else}}…{{/if}}. Schleifen gibt es nicht, rendern Sie Listen also in Ihrem Code. Temple maskiert HTML nie. Maskieren Sie Benutzereingaben daher, bevor Sie sie übergeben.
DNS ändern
Fügen Sie Ihre Domain unter Email APIDomains hinzu und legen Sie die Einträge von Emailit an. Sie verwenden eigene Namen (emailit._domainkey, emailit.<domain> und optional go und inbound) und kollidieren daher nicht mit den Einträgen von Resend, die typischerweise auf resend._domainkey und einer Subdomain send liegen. Behalten Sie Ihren DMARC-Eintrag. Entfernen Sie nach der Umstellung die Einträge von Resend. Siehe DNS-Einträge.
Nächste Schritte
- Go-live-Checkliste
- Webhook einrichten
- Priority migration: Lassen Sie Engineers von Emailit den Umzug gemeinsam mit Ihnen erledigen