Průvodce
Přechod z Resendu
Přejděte z Resendu na Emailit. API jsou si blízká, takže změny jsou malé. Namapujte pole, nastavení SMTP a události webhooků, ověřujte podpisy a přesuňte kontakty.
Tento průvodce mapuje pojmy, volání API, webhooky a šablony z Resendu na jejich ekvivalenty v Emailitu. Obě API mají podobnou strukturu, takže většina změn v kódu je malá. Celkové pořadí a souběžný provoz obou poskytovatelů popisuje stránka Přechod na Emailit, přečtěte si ji jako první.
Principy
| Resend | Emailit |
|---|---|
| Team | Workspace. Každý workspace má vlastní domény, klíče, členy a kredity. |
| API key s oprávněním full access, nebo sending access | API klíč: Full Access, nebo Sending Only, volitelně omezený na jednu doménu |
| Domains | Odesílací domény |
| Audiences a contacts | Kontakty a seznamy kontaktů |
| Broadcasts | Kampaně |
| Webhooks | Webhooky |
| Emails a logs | Email APIEmails a Email APILogs |
tags |
meta |
| Komponenty React Email | HTML, které vykreslíte ve svém kódu, nebo šablony navržené ve webovém rozhraní |
Upravte volání API
Z POST /emails v Resendu se stane POST /v2/emails v Emailitu s téměř stejnými poli. V 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 |
Stejně |
to, cc, bcc |
Stejně, každé až 50 adres |
reply_to (replyTo v SDK pro Node.js) |
reply_to |
react (SDK pro Node.js) |
Není dostupné. Vykreslete komponentu do HTML a předejte html. |
attachments[] s filename a content nebo path |
attachments[] s filename a content v base64 nebo s url. S content je povinné content_type. |
tags: [{ "name": "…", "value": "…" }] |
meta: { "name": "value" }, vrací se v událostech webhooků |
scheduled_at |
scheduled_at (ISO 8601, unixový čas nebo běžná angličtina) |
Hlavička Idempotency-Key |
Hlavička Idempotency-Key, uchovává se 24 hodin |
POST /emails/batch |
Není dostupné. Odešlete jeden požadavek na zprávu. |
Odpověď { "id": "…" } |
200 s id (em_…), status: "accepted" a ids s jedním ID pro každého příjemce |
Každý příjemce v požadavku Emailitu se stane samostatným e-mailem s vlastním ID. Když odesíláte několika příjemcům, mapa ids v odpovědi přiřazuje každé adrese její ID. Emailit také měří otevření a prokliky u jednotlivých e-mailů pomocí tracking: { "loads": true, "clicks": true }, jakmile má doména ověřenou subdoménu pro měření. Viz Odeslání e-mailu.
React Email
Pokud e-maily vytváříte v React Email, ponechte své komponenty a před odesláním je vykreslete sami:
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 });Změňte nastavení SMTP
| Nastavení | Resend | Emailit |
|---|---|---|
| Server | smtp.resend.com |
smtp.emailit.com |
| Port | 587, 2587 nebo 25 (STARTTLS), 465 nebo 2465 (TLS) |
587, 2587, 2525 nebo 25 (STARTTLS), 465 (TLS) |
| Uživatelské jméno | resend |
emailit |
| Heslo | Váš API klíč Resendu | Váš API klíč Emailitu |
Viz Nastavení SMTP.
Namapujte události webhooků
| Událost Resendu | Událost Emailitu |
|---|---|
email.sent |
email.accepted (jen 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 |
Stejné názvy |
domain.created, domain.updated, domain.deleted |
Stejné názvy |
Mění se formát požadavku:
- Resend posílá jednu událost na požadavek. Emailit posílá pole JSON s až 100 událostmi, proto tělo procházejte ve smyčce.
- E-mail je v
data.object. Místodata.email_idpoužívejtedata.object.id, IDem_z odpovědi na odeslání. Vaše hodnotymetajsou vdata.object.meta. - Podpisy fungují jinak. Resend podepisuje webhooky přes Svix s hlavičkami
svix-*. Emailit posíláX-Emailit-Signature, hexadecimální HMAC-SHA256 z<timestamp>.<raw body>, jehož klíčem je celý tajný klíč včetně předponywhsec_. Knihovna pro ověřování Svix fungovat nebude, přestože oba tajné klíče začínají nawhsec_. Viz Podpis požadavku.
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);
}Přesuňte blokované adresy a kontakty
-
Shromážděte všechny adresy, na které se e-mail nedoručil nebo jejichž příjemci si stěžovali, dokud jste používali Resend, z webového rozhraní Resendu nebo z událostí, které uložily vaše webhooky.
-
Sestavte jedno CSV se sloupci
email,type,reason:email,type,reason old-address@example.com,recipient,resend bounce angry@example.com,recipient,resend complaintPro adresy, které nikdy nesmí dostat e-mail, použijte typ
recipient. Blokuje odeslání přes API, SMTP i kampaně. -
V Email APISuppressions vyberte Import a nahrajte soubor. Každý soubor může mít až 10 000 řádků a nejvýše 8 MB. Duplicity se přeskočí.
Pokud odesíláte broadcasts, vyexportujte každou audience v Resendu jako CSV a naimportujte ji v Email MarketingContacts přes Import do odpovídajícího seznamu kontaktů v Emailitu. Namapujte sloupec s odhlášením, aby lidé, kteří se odhlásili, zůstali odhlášení. Viz Import a export kontaktů.
Přesuňte šablony
Pokud e-maily vykreslujete v kódu, v React Email nebo čímkoli jiným, nic se nemění: odešlete HTML. Pokud máte šablony v Resendu, vytvořte je znovu v Email MarketingTemplates nebo přes API pro šablony, každé dejte alias a odesílejte ji s template a variables.
Šablony Emailitu používají Temple: {{name}}, vnořené hodnoty jako {{user.name}}, výchozí hodnoty jako {{name|"there"}} a {{#if plan}}…{{else}}…{{/if}}. Smyčky neexistují, proto seznamy vykreslujte ve svém kódu. Temple nikdy neescapuje HTML, proto vstupy od uživatelů escapujte dřív, než je předáte.
Změňte DNS
Přidejte doménu v Email APIDomains a publikujte záznamy Emailitu. Používají vlastní názvy (emailit._domainkey, emailit.<domain> a volitelně go a inbound), takže nejsou v konfliktu se záznamy Resendu, které obvykle leží na resend._domainkey a na subdoméně send. Záznam DMARC ponechte. Po přepnutí provozu záznamy Resendu odstraňte. Viz DNS záznamy odesílacích domén.
Další kroky
- Kontrolní seznam před ostrým provozem
- Nastavení webhooku
- Prioritní migrace: nechte inženýry Emailitu provést přechod s vámi