# Přechod z Postmarku

> Přejděte z Postmarku na Emailit. Namapujte servery, message streams a tokeny, převeďte pole API, vyměňte nastavení SMTP a přesuňte webhooky, blokované adresy a šablony.

Tento průvodce mapuje pojmy, volání API, webhooky, blokované adresy a šablony z Postmarku na jejich ekvivalenty v Emailitu. 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

| Postmark | Emailit |
| --- | --- |
| Account | Účet |
| Server | [Workspace](/cs/docs/workspaces/), nebo jeden workspace s několika odesílacími doménami |
| Server API token | [API klíč](/cs/docs/developers/api-keys/) s oprávněním **Sending Only**, volitelně omezený na jednu doménu |
| Account API token | API klíč s oprávněním **Full Access** |
| Transactional message stream | [E-mailové API](/cs/docs/email-api/) a [SMTP relay](/cs/docs/smtp/) |
| Broadcast message stream | [Kampaně](/cs/docs/campaigns/) pro [seznamy kontaktů](/cs/docs/audiences/), nebo API s vlastní hlavičkou `List-Unsubscribe` |
| Inbound message stream | [Příchozí e-maily](/cs/docs/inbound/) na subdoméně, například `inbound.acme.com` |
| Sender signatures a domény | [Odesílací domény](/cs/docs/domains/). Sender signatures pro jednotlivé adresy nejsou dostupné. |
| Templates a layouts | [Šablony](/cs/docs/templates/) s aliasem a verzemi. Layouty neexistují. |
| Webhooky pro každý message stream | [Webhooky](/cs/docs/webhooks/) pro celý workspace |
| Suppressions pro každý message stream | Jeden [seznam blokovaných adres](/cs/docs/suppressions/) pro každý workspace |
| Activity | **Email API → Emails** a **Email API → Logs** |
| `Tag` a `Metadata` | `meta` |

Pokud chcete oddělit reputaci transakční a marketingové pošty, odesílejte je z různých domén nebo subdomén, například `mail.acme.com` pro účtenky a `news.acme.com` pro newslettery.

## Upravte volání API

Z `POST /email` s `X-Postmark-Server-Token` v Postmarku se stane `POST /v2/emails` s bearer tokenem. Názvy polí se mění z PascalCase na snake_case:

```bash title="Před: Postmark"
curl https://api.postmarkapp.com/email \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Postmark-Server-Token: $POSTMARK_SERVER_TOKEN" \
  -d '{
    "From": "Acme <hello@acme.com>",
    "To": "ada@example.com",
    "Subject": "Your receipt",
    "TextBody": "Thanks for your order.",
    "HtmlBody": "<p>Thanks for your order.</p>",
    "MessageStream": "outbound"
  }'
```

```bash title="Po: Emailit"
curl https://api.emailit.com/v2/emails \
  -H "Authorization: Bearer $EMAILIT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "Acme <hello@acme.com>",
    "to": "ada@example.com",
    "subject": "Your receipt",
    "text": "Thanks for your order.",
    "html": "<p>Thanks for your order.</p>"
  }'
```

| Postmark | Emailit |
| --- | --- |
| Hlavička `X-Postmark-Server-Token` | `Authorization: Bearer secret_…` |
| `From` | `from` |
| `To`, `Cc`, `Bcc` (řetězce oddělené čárkou) | `to`, `cc`, `bcc` jako řetězec nebo pole, každé až 50 adres |
| `ReplyTo` | `reply_to` |
| `Subject` | `subject` |
| `HtmlBody`, `TextBody` | `html`, `text` |
| `Headers: [{ "Name": "…", "Value": "…" }]` | `headers: { "Name": "Value" }` |
| `Metadata`, `Tag` | `meta`, vrací se v událostech webhooků |
| `TrackOpens`, `TrackLinks` | `tracking: { "loads": true, "clicks": true }` |
| `Attachments[]` s `Name`, `Content`, `ContentType`, `ContentID` | `attachments[]` s `filename`, `content`, `content_type`, `content_id` |
| `MessageStream` | Není potřeba |
| `POST /email/withTemplate` s `TemplateAlias` nebo `TemplateId` a `TemplateModel` | Stejný `POST /v2/emails` s `template` (alias nebo ID) a `variables` |
| Odpověď s `MessageID` a `ErrorCode: 0` | `200` s `id` (`em_…`), `status: "accepted"` a `ids` pro jednotlivé příjemce. Chyby používají stavové kódy HTTP. |

Emailit nemá endpoint pro dávky. Odešlete jeden požadavek na zprávu, každý až s 50 příjemci, a přidejte hlavičku `Idempotency-Key`, aby bylo opakování bezpečné. Viz [Odeslání e-mailu](/cs/docs/email-api/send-email/).

## Změňte nastavení SMTP

| Nastavení | Postmark | Emailit |
| --- | --- | --- |
| Server | `smtp.postmarkapp.com` | `smtp.emailit.com` |
| Port | `587`, `2525` nebo `25` | `587` (STARTTLS), `465` (TLS), `2525`, `2587` nebo `25` |
| Uživatelské jméno | Váš Server API token | `emailit` |
| Heslo | Váš Server API token | Váš API klíč Emailitu |

Emailit nečte hlavičky `X-PM-*`, například `X-PM-Message-Stream` nebo `X-PM-Tag`. Odstraňte je a měření místo toho nastavte na doméně. Viz [Nastavení SMTP](/cs/docs/smtp/settings/).

## Namapujte události webhooků

| Webhook Postmarku | Událost Emailitu |
| --- | --- |
| Delivery | `email.delivered` |
| Bounce, typy hard bounce | `email.bounced` |
| Bounce, typy soft nebo transient | `email.attempted`, dokud Emailit opakuje doručení, pak `email.bounced`, pokud selžou všechny pokusy |
| Spam complaint | `email.complained` |
| Open | `email.loaded` |
| Click | `email.clicked` |
| Subscription change | `email.unsubscribed` u e-mailů z kampaní a `suppression.created` nebo `suppression.deleted` u blokací, které přidáte nebo odeberete přes API |
| Inbound | `email.received`, pak načtěte obsah přes [`GET /emails/{id}`](/cs/docs/api-reference/emails/get/) |

Emailit navíc posílá `email.accepted`, když API e-mail přijme, pro což Postmark žádný webhook nemá.

Mění se formát požadavku:

- Postmark posílá jeden záznam na požadavek a jeho typ uvádí v `RecordType`. Emailit posílá pole JSON s až 100 událostmi, s názvem v `type` a e-mailem v `data.object`.
- Místo `MessageID` používejte `data.object.id`, ID `em_` z odpovědi na odeslání. Vaše hodnoty `meta` jsou v `data.object.meta`.
- Webhooky Postmarku se obvykle chrání přístupovými údaji pro základní autentizaci v URL. Emailit místo toho podepisuje každý požadavek: ověřujte `X-Emailit-Signature` vůči `X-Emailit-Timestamp` a vašemu tajnému klíči `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

1. Vyexportujte suppressions každého message streamu v Postmarku, ze kterého odesíláte, ze stránky suppressions daného streamu nebo přes suppressions dump API. Zahrňte hard bounces, spam complaints i ruční blokace.

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

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

   Pro adresy, které nikdy nesmí dostat e-mail, použijte typ `recipient`. Blokuje odeslání přes API, SMTP i kampaně. Pro lidi, kteří se odhlásili jen z vašich rozesílek, použijte typ `unsubscribe`, který zastaví kampaně, ale transakční e-maily propustí.

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čí.

Viz [Správa blokovaných adres](/cs/docs/suppressions/manage/).

## Přesuňte šablony

Zkopírujte HTML každé šablony z Postmarku včetně jejího layoutu a pak ho naimportujte v **Email Marketing → Templates**, nebo šablonu vytvořte přes [API pro šablony](/cs/docs/api-reference/templates/create/). Emailit layouty nemá, proto layout a obsah slučte do jedné šablony. Použijte stejný alias jako v Postmarku, aby změny v kódu zůstaly malé.

Šablony Postmarku používají Mustachio. Temple pokrývá jednoduché hodnoty a podmínky:

| Postmark (Mustachio) | Emailit (Temple) |
| --- | --- |
| `{{name}}` | `{{name}}` |
| `{{company.name}}` | `{{company.name}}` |
| Sekce `{{#company}}…{{/company}}` | `{{#if company}}…{{/if}}` a uvnitř úplné cesty, například `{{company.name}}` |
| Invertované sekce `{{^name}}…{{/name}}` | `{{#if name}}{{else}}…{{/if}}` |
| `{{#each items}}…{{/each}}` | Nepodporuje se. Vykreslete seznam ve svém kódu a předejte ho jako jednu proměnnou. |
| `TemplateModel` | `variables` |

Temple nikdy neescapuje HTML, proto vstupy od uživatelů escapujte dřív, než je předáte. Chybějící hodnota se vykreslí jako prázdný řetězec, pokud nepřidáte výchozí hodnotu, například `{{name|"there"}}`. Viz [Temple](/cs/docs/templates/temple/).

## 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áznamem DKIM Postmarku ani s jeho CNAME záznamem return path `pm-bounces`. Záznam DMARC ponechte. Po přepnutí provozu záznamy Postmarku odstraňte. Viz [DNS záznamy odesílacích domén](/cs/docs/domains/dns-records/).

Pokud zpracováváte příchozí poštu přes Postmark, přesuňte ji na příchozí subdoménu Emailitu a aktualizujte adresy, které vaše aplikace rozdává. Viz [Nastavení příchozích e-mailů](/cs/docs/inbound/set-up/).

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