# Von Mailgun migrieren

> Wechseln Sie von Mailgun zu Emailit. Domains, Schlüssel und Routes zuordnen, formularkodierte API-Aufrufe in JSON umwandeln und SMTP, Webhooks, Sperrungen und Vorlagen umziehen.

Diese Anleitung ordnet Konzepte, API-Aufrufe, Webhooks, Sperrungen und Vorlagen von Mailgun 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

| Mailgun | Emailit |
| --- | --- |
| Konto und Unterkonten | Konto und [Workspaces](/de/docs/workspaces/). Jeder Workspace hat eigene Domains, Schlüssel, Mitglieder und Credits. |
| Domain mit eigenem API-Pfad `/v3/<domain>/…` | [Versanddomain](/de/docs/domains/). Es gibt einen einzigen Sende-Endpunkt, und Emailit entnimmt die Domain der Adresse in `from`. |
| Private API key | [API-Schlüssel](/de/docs/developers/api-keys/) mit **Full Access** |
| Domain sending key | API-Schlüssel mit **Sending Only**, auf eine Domain beschränkt |
| SMTP-Zugangsdaten pro Domain | Ihr API-Schlüssel, als SMTP-Passwort verwendet |
| Vorlagen pro Domain, mit Versionen | [Vorlagen](/de/docs/templates/) pro Workspace, mit Alias und Versionen |
| Webhooks pro Domain | [Webhooks](/de/docs/webhooks/) pro Workspace |
| Routes | [Eingehende E-Mails](/de/docs/inbound/) mit dem Webhook `email.received` oder die [Automatisierung](/de/docs/inbound/forward-with-automations/) **Forward received email** |
| Sperrungen pro Domain: Bounces, Abmeldungen, Beschwerden | Eine [Sperrliste](/de/docs/suppressions/) pro Workspace |
| Mailinglisten | [Kontaktlisten](/de/docs/audiences/) |
| Tags und eigene Variablen | `meta` |
| Logs und Events | **Email API → Emails**, **Email API → Events** und **Email API → Logs** |
| E-Mail-Validierung | [E-Mail-Verifizierung](/de/docs/email-verification/) |

## API-Aufrufe anpassen

`POST /v3/<domain>/messages` von Mailgun nimmt Formularfelder mit Basic Authentication an. `POST /v2/emails` von Emailit nimmt JSON mit einem Bearer-Token an:

```bash title="Before: Mailgun"
curl -s --user "api:$MAILGUN_API_KEY" \
  https://api.mailgun.net/v3/mg.acme.com/messages \
  -F from='Acme <hello@mg.acme.com>' \
  -F to='ada@example.com' \
  -F subject='Your receipt' \
  -F text='Thanks for your order.' \
  --form-string html='<p>Thanks for your order.</p>'
```

```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@mg.acme.com>",
    "to": "ada@example.com",
    "subject": "Your receipt",
    "text": "Thanks for your order.",
    "html": "<p>Thanks for your order.</p>"
  }'
```

| Mailgun | Emailit |
| --- | --- |
| Basic Auth `api:<key>` | `Authorization: Bearer secret_…` |
| Felder in `multipart/form-data` | Ein JSON-Body |
| `from`, `subject`, `text`, `html` | Dieselben Namen |
| `to`, `cc`, `bcc` (wiederholt oder durch Kommas getrennt) | `to`, `cc`, `bcc` als String oder Array mit jeweils bis zu 50 |
| `h:Reply-To` | `reply_to` |
| `h:X-My-Header` | `headers: { "X-My-Header": "…" }` |
| `v:order-id`, `h:X-Mailgun-Variables` | `meta: { "order-id": "…" }`, in Webhook-Events zurückgegeben |
| `template` und `t:variables` | `template` (eine ID oder ein Alias) und `variables` |
| `attachment`, `inline` (Datei-Uploads) | `attachments[]` mit Base64-kodiertem `content` oder einer `url`, dazu `content_type`. Fügen Sie für eingebettete Bilder `content_id` hinzu. |
| `o:deliverytime` (Datum nach RFC 2822) | `scheduled_at` (ISO 8601, Unix-Zeit oder englischer Klartext) |
| `o:tracking`, `o:tracking-opens`, `o:tracking-clicks` | `tracking: { "loads": true, "clicks": true }` |
| `o:tag` | `meta` |
| `o:testmode` | Nicht verfügbar |
| `recipient-variables` (Batch-Versand) | Nicht verfügbar. Senden Sie pro Empfänger eine Anfrage mit eigenen `variables`. |
| Antwort `{ "id": "<…>", "message": "Queued. Thank you." }` | `200` mit `id` (`em_…`), `message_id`, `status: "accepted"` und `ids` pro Empfänger |

Wenn Sie von einer Subdomain wie `mg.acme.com` gesendet haben, fügen Sie genau diese Subdomain in Emailit hinzu. Subdomains werden getrennt von der übergeordneten Domain verifiziert. Die EU- und US-API-Hosts von Mailgun entsprechen beide dem einen Endpunkt von Emailit. Siehe [E-Mail senden](/de/docs/email-api/send-email/).

## SMTP-Einstellungen umstellen

| Einstellung | Mailgun | Emailit |
| --- | --- | --- |
| Host | `smtp.mailgun.org` oder der EU-Host | `smtp.emailit.com` |
| Port | `587`, `465`, `2525` oder `25` | `587` (STARTTLS), `465` (TLS), `2525`, `2587` oder `25` |
| Benutzername | Ihr SMTP-Login, etwa `postmaster@mg.acme.com` | `emailit` |
| Passwort | Ihr SMTP-Passwort | Ihr Emailit-API-Schlüssel |

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

## Webhook-Events zuordnen

| Mailgun-Event | Emailit-Event |
| --- | --- |
| `accepted` | `email.accepted` (nur API) |
| `delivered` | `email.delivered` |
| `failed` mit Schweregrad `temporary` | `email.attempted` |
| `failed` mit Schweregrad `permanent` | `email.bounced` |
| `opened` | `email.loaded` |
| `clicked` | `email.clicked` |
| `complained` | `email.complained` |
| `unsubscribed` | `email.unsubscribed`, nur für Kampagnen-E-Mails |
| Route, die an eine URL weiterleitet | `email.received`, dann den Inhalt mit [`GET /emails/{id}`](/de/docs/api-reference/emails/get/) abrufen |

Das Anfrageformat ändert sich:

- Mailgun sendet ein Event pro Anfrage, mit den Details in `event-data`. Emailit sendet ein JSON-Array mit bis zu 100 Events. Iterieren Sie über das Array.
- Der Event-Name steht in `type` und die E-Mail in `data.object`. Verwenden Sie `data.object.id`, die `em_`-ID aus der Antwort auf den Versand, um Events Nachrichten zuzuordnen. Ihre `meta`-Werte stehen in `data.object.meta`.
- Mailgun signiert einen Zeitstempel und ein Token im Body. Emailit signiert den gesamten unveränderten Body: 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 Listen **Bounces**, **Complaints** und **Unsubscribes** jeder Mailgun-Domain, von der Sie senden, im Control Panel oder mit der Suppressions-API (`/v3/<domain>/bounces`, `/complaints` und `/unsubscribes`).

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

```csv
email,type,reason
old-address@example.com,recipient,mailgun bounce
angry@example.com,recipient,mailgun 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. Die Typen `bounce`, `complaint` und `unsubscribe` stoppen nur Kampagnen.

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.

Emailit hat eine Sperrliste pro Workspace, daher kommen die Adressen aller Ihrer Mailgun-Domains in dieselbe Liste. Eine Allowlist gibt es nicht. Siehe [Sperrungen verwalten](/de/docs/suppressions/manage/).

## Vorlagen umziehen

Kopieren Sie das HTML jeder Vorlage aus Mailgun und importieren Sie es dann unter **Email Marketing → Templates** oder erstellen Sie die Vorlage mit der [Vorlagen-API](/de/docs/api-reference/templates/create/). Geben Sie ihr einen Alias und senden Sie sie mit `"template": "<alias>"` und `variables`.

Mailgun-Vorlagen verwenden Handlebars. Temple deckt die üblichen Teile ab:

| Mailgun (Handlebars) | Emailit (Temple) |
| --- | --- |
| `{{first_name}}` | `{{first_name}}` |
| `{{{html_block}}}` | `{{html_block}}`. Temple maskiert HTML nie, maskieren Sie Benutzereingaben also selbst. |
| `{{#if plan}}…{{else}}…{{/if}}` | Identisch |
| `{{#unless plan}}…{{/unless}}` | `{{#if plan}}{{else}}…{{/if}}` |
| `{{#each items}}…{{/each}}` | Nicht unterstützt. Rendern Sie die Liste in Ihrem Code und übergeben Sie sie als eine Variable. |
| `{{#equal plan "pro"}}…{{/equal}}` | Nicht unterstützt. Übergeben Sie einen Boolean wie `is_pro` und verwenden Sie `{{#if is_pro}}`. |
| Kein eingebauter Standardwert | `{{first_name\|"there"}}` fügt einen Ersatzwert hinzu |

Siehe [Temple](/de/docs/templates/temple/) und [Vorlagen importieren und exportieren](/de/docs/templates/import-export/).

## DNS ändern

Fügen Sie jede 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 Mailgun noch mit dessen Tracking-CNAME `email.<domain>`. Ihren SPF-Eintrag auf der Hauptdomain müssen Sie für Emailit nicht ändern. Behalten Sie Ihren DMARC-Eintrag. Siehe [DNS-Einträge](/de/docs/domains/dns-records/).

Entfernen Sie nach der Umstellung die DKIM- und Tracking-Einträge von Mailgun und entfernen Sie `include:mailgun.org` aus Ihrem SPF-Eintrag. Wenn Sie E-Mails über Routes von Mailgun empfangen, behalten Sie dessen MX-Einträge, bis Sie diesen Verkehr auf [eingehende E-Mails bei Emailit](/de/docs/inbound/set-up/) umgestellt haben, die auf einer Subdomain wie `inbound.acme.com` empfangen.

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