# Von Postmark migrieren

> Wechseln Sie von Postmark zu Emailit. Server, Message Streams und Tokens zuordnen, API-Felder umwandeln, SMTP-Einstellungen austauschen und Webhooks, Sperrungen und Vorlagen umziehen.

Diese Anleitung ordnet Konzepte, API-Aufrufe, Webhooks, Sperrungen und Vorlagen von Postmark ihren Entsprechungen in Emailit zu. Lesen Sie zuerst [Zu Emailit migrieren](/de/docs/migrate/) für die allgemeine Reihenfolge und den parallelen Betrieb beider Anbieter.

## Konzepte

| Postmark | Emailit |
| --- | --- |
| Account | Konto |
| Server | [Workspace](/de/docs/workspaces/) oder ein Workspace mit mehreren Versanddomains |
| Server API token | [API-Schlüssel](/de/docs/developers/api-keys/) mit **Sending Only**, optional auf eine Domain beschränkt |
| Account API token | API-Schlüssel mit **Full Access** |
| Transaktionaler Message Stream | Die [E-Mail-API](/de/docs/email-api/) und das [SMTP-Relay](/de/docs/smtp/) |
| Broadcast-Message-Stream | [Kampagnen](/de/docs/campaigns/) an [Kontaktlisten](/de/docs/audiences/) oder die API mit eigenem Header `List-Unsubscribe` |
| Inbound-Message-Stream | [Eingehende E-Mails](/de/docs/inbound/) auf einer Subdomain wie `inbound.acme.com` |
| Sender Signatures und Domains | [Versanddomains](/de/docs/domains/). Sender Signatures für einzelne Adressen gibt es nicht. |
| Vorlagen und Layouts | [Vorlagen](/de/docs/templates/) mit Alias und Versionen. Layouts gibt es nicht. |
| Webhooks pro Stream | [Webhooks](/de/docs/webhooks/) pro Workspace |
| Sperrungen pro Stream | Eine [Sperrliste](/de/docs/suppressions/) pro Workspace |
| Activity | **Email API → Emails** und **Email API → Logs** |
| `Tag` und `Metadata` | `meta` |

Um die Reputation von transaktionalen und Marketing-E-Mails getrennt zu halten, senden Sie sie von unterschiedlichen Domains oder Subdomains, etwa `mail.acme.com` für Belege und `news.acme.com` für Newsletter.

## API-Aufrufe anpassen

Aus `POST /email` von Postmark mit einem `X-Postmark-Server-Token` wird `POST /v2/emails` mit einem Bearer-Token. Die Feldnamen wechseln von PascalCase zu snake_case:

```bash title="Before: 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="After: 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 |
| --- | --- |
| Header `X-Postmark-Server-Token` | `Authorization: Bearer secret_…` |
| `From` | `from` |
| `To`, `Cc`, `Bcc` (durch Kommas getrennte Strings) | `to`, `cc`, `bcc` als String oder Array mit jeweils bis zu 50 |
| `ReplyTo` | `reply_to` |
| `Subject` | `subject` |
| `HtmlBody`, `TextBody` | `html`, `text` |
| `Headers: [{ "Name": "…", "Value": "…" }]` | `headers: { "Name": "Value" }` |
| `Metadata`, `Tag` | `meta`, in Webhook-Events zurückgegeben |
| `TrackOpens`, `TrackLinks` | `tracking: { "loads": true, "clicks": true }` |
| `Attachments[]` mit `Name`, `Content`, `ContentType`, `ContentID` | `attachments[]` mit `filename`, `content`, `content_type`, `content_id` |
| `MessageStream` | Nicht nötig |
| `POST /email/withTemplate` mit `TemplateAlias` oder `TemplateId` und `TemplateModel` | Dasselbe `POST /v2/emails` mit `template` (ein Alias oder eine ID) und `variables` |
| Antwort mit `MessageID` und `ErrorCode: 0` | `200` mit `id` (`em_…`), `status: "accepted"` und `ids` pro Empfänger. Fehler verwenden HTTP-Statuscodes. |

Emailit hat keinen Batch-Endpunkt. Senden Sie eine Anfrage pro Nachricht, jeweils mit bis zu 50 Empfängern, und fügen Sie einen Header `Idempotency-Key` hinzu, damit Wiederholungen sicher sind. Siehe [E-Mail senden](/de/docs/email-api/send-email/).

## SMTP-Einstellungen umstellen

| Einstellung | Postmark | Emailit |
| --- | --- | --- |
| Host | `smtp.postmarkapp.com` | `smtp.emailit.com` |
| Port | `587`, `2525` oder `25` | `587` (STARTTLS), `465` (TLS), `2525`, `2587` oder `25` |
| Benutzername | Ihr Server API Token | `emailit` |
| Passwort | Ihr Server API Token | Ihr Emailit-API-Schlüssel |

Emailit liest keine `X-PM-*`-Header wie `X-PM-Message-Stream` oder `X-PM-Tag`. Entfernen Sie sie und legen Sie das Tracking stattdessen bei der Domain fest. Siehe [SMTP-Einstellungen](/de/docs/smtp/settings/).

## Webhook-Events zuordnen

| Postmark-Webhook | Emailit-Event |
| --- | --- |
| Delivery | `email.delivered` |
| Bounce, Typen für Hard Bounces | `email.bounced` |
| Bounce, Typen für Soft Bounces oder vorübergehende Fehler | `email.attempted`, während Emailit es erneut versucht, dann `email.bounced`, wenn alle Wiederholungen fehlschlagen |
| Spam Complaint | `email.complained` |
| Open | `email.loaded` |
| Click | `email.clicked` |
| Subscription Change | `email.unsubscribed` für Kampagnen-E-Mails sowie `suppression.created` oder `suppression.deleted` für Sperrungen, die Sie per API hinzufügen oder entfernen |
| Inbound | `email.received`, dann den Inhalt mit [`GET /emails/{id}`](/de/docs/api-reference/emails/get/) abrufen |

Emailit sendet außerdem `email.accepted`, wenn die API eine E-Mail annimmt. Dafür hat Postmark keinen Webhook.

Das Anfrageformat ändert sich:

- Postmark sendet einen Datensatz pro Anfrage und benennt ihn in `RecordType`. Emailit sendet ein JSON-Array mit bis zu 100 Events, mit dem Namen in `type` und der E-Mail in `data.object`.
- Verwenden Sie `data.object.id`, die `em_`-ID aus der Antwort auf den Versand, statt `MessageID`. Ihre `meta`-Werte stehen in `data.object.meta`.
- Postmark-Webhooks werden meist mit Basic-Authentication-Zugangsdaten in der URL geschützt. Emailit signiert stattdessen jede Anfrage: Verifizieren Sie `X-Emailit-Signature` anhand von `X-Emailit-Timestamp` und Ihrem `whsec_`-Secret. Siehe [Anfragesignatur](/de/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);
}
```

## Sperrungen umziehen

1. Exportieren Sie die Sperrungen jedes Message Streams von Postmark, über den Sie senden, auf der Suppressions-Seite des Streams oder mit der Suppressions-Dump-API. Nehmen Sie Hard Bounces, Spam-Beschwerden und manuelle Sperrungen mit.

2. Erstellen Sie eine CSV-Datei mit den Spalten `email,type,reason`:

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

   Verwenden Sie den Typ `recipient` für Adressen, die nie E-Mails erhalten dürfen. Er blockiert Versände per API, SMTP und Kampagne. Für Personen, die sich nur von Ihren Broadcasts abgemeldet haben, verwenden Sie den Typ `unsubscribe`, der Kampagnen stoppt, transaktionale E-Mails aber weiter durchlässt.

3. Wählen Sie unter **Email API → Suppressions** 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.

Siehe [Sperrungen verwalten](/de/docs/suppressions/manage/).

## Vorlagen umziehen

Kopieren Sie das HTML jeder Vorlage aus Postmark einschließlich ihres Layouts und importieren Sie es dann unter **Email Marketing → Templates** oder erstellen Sie die Vorlage mit der [Vorlagen-API](/de/docs/api-reference/templates/create/). Emailit hat keine Layouts, führen Sie Layout und Inhalt daher in einer Vorlage zusammen. Verwenden Sie denselben Alias wie in Postmark, damit Ihre Codeänderungen klein bleiben.

Postmark-Vorlagen verwenden Mustachio. Temple deckt einfache Werte und Bedingungen ab:

| Postmark (Mustachio) | Emailit (Temple) |
| --- | --- |
| `{{name}}` | `{{name}}` |
| `{{company.name}}` | `{{company.name}}` |
| Abschnitte `{{#company}}…{{/company}}` | `{{#if company}}…{{/if}}`, darin mit vollständigen Pfaden wie `{{company.name}}` |
| Invertierte Abschnitte `{{^name}}…{{/name}}` | `{{#if name}}{{else}}…{{/if}}` |
| `{{#each items}}…{{/each}}` | Nicht unterstützt. Rendern Sie die Liste in Ihrem Code und übergeben Sie sie als eine Variable. |
| `TemplateModel` | `variables` |

Temple maskiert HTML nie. Maskieren Sie Benutzereingaben daher, bevor Sie sie übergeben. Ein fehlender Wert wird als leerer String dargestellt, sofern Sie keinen Standardwert hinzufügen, etwa `{{name|"there"}}`. Siehe [Temple](/de/docs/templates/temple/).

## DNS ändern

Fügen Sie Ihre Domain unter **Email API → Domains** 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 weder mit dem DKIM-Eintrag von Postmark noch mit dessen Return-Path-CNAME `pm-bounces`. Behalten Sie Ihren DMARC-Eintrag. Entfernen Sie nach der Umstellung die Einträge von Postmark. Siehe [DNS-Einträge](/de/docs/domains/dns-records/).

Wenn Sie eingehende E-Mails mit Postmark verarbeiten, verlagern Sie das auf eine Inbound-Subdomain von Emailit und aktualisieren Sie die Adressen, die Ihre App herausgibt. Siehe [Eingehende E-Mails einrichten](/de/docs/inbound/set-up/).

## Nächste Schritte

- [Go-live-Checkliste](/de/docs/get-started/go-live/)
- [Webhook einrichten](/de/docs/webhooks/set-up/)
- [Priority migration](/de/docs/programs/priority-migration/): Lassen Sie Engineers von Emailit den Umzug gemeinsam mit Ihnen erledigen

---
Quelle: https://emailit.com/de/docs/migrate/postmark/
