# 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](/cs/docs/migrate/), přečtěte si ji jako první.

## Principy

| Resend | Emailit |
| --- | --- |
| Team | [Workspace](/cs/docs/workspaces/). 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íč](/cs/docs/developers/api-keys/): **Full Access**, nebo **Sending Only**, volitelně omezený na jednu doménu |
| Domains | [Odesílací domény](/cs/docs/domains/) |
| Audiences a contacts | [Kontakty](/cs/docs/contacts/) a [seznamy kontaktů](/cs/docs/audiences/) |
| Broadcasts | [Kampaně](/cs/docs/campaigns/) |
| Webhooks | [Webhooky](/cs/docs/webhooks/) |
| Emails a logs | **Email API → Emails** a **Email API → Logs** |
| `tags` | `meta` |
| Komponenty React Email | HTML, které vykreslíte ve svém kódu, nebo [šablony](/cs/docs/templates/) 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:

```javascript title="Před: 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="Po: 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` | 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](/cs/docs/email-api/send-email/).

### React Email

Pokud e-maily vytváříte v React Email, ponechte své komponenty a před odesláním je vykreslete sami:

```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 });
```

## 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](/cs/docs/smtp/settings/).

## 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ísto `data.email_id` používejte `data.object.id`, ID `em_` z odpovědi na odeslání. Vaše hodnoty `meta` jsou v `data.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ředpony `whsec_`. Knihovna pro ověřování Svix fungovat nebude, přestože oba tajné klíče začínají na `whsec_`. Viz [Podpis požadavku](/cs/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);
}
```

## Přesuňte blokované adresy a kontakty

1. 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.

2. Sestavte jedno CSV se sloupci `email,type,reason`:

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

   Pro adresy, které nikdy nesmí dostat e-mail, použijte typ `recipient`. Blokuje odeslání přes API, SMTP i kampaně.

3. V **Email API → Suppressions** 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 Marketing → Contacts** 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ů](/cs/docs/contacts/import-export/).

## 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 Marketing → Templates** nebo přes [API pro šablony](/cs/docs/api-reference/templates/create/), každé dejte alias a odesílejte ji s `template` a `variables`.

Šablony Emailitu používají [Temple](/cs/docs/templates/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 API → Domains** 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](/cs/docs/domains/dns-records/).

## Další kroky

- [Kontrolní seznam před ostrým provozem](/cs/docs/get-started/go-live/)
- [Nastavení webhooku](/cs/docs/webhooks/set-up/)
- [Prioritní migrace](/cs/docs/programs/priority-migration/): nechte inženýry Emailitu provést přechod s vámi

---
Zdroj: https://emailit.com/cs/docs/migrate/resend/
