# Von SendGrid migrieren

> Wechseln Sie von SendGrid zu Emailit. Konzepte, API-Felder, SMTP-Einstellungen und Namen im Event Webhook zuordnen, dann Sperrungen, Dynamic Templates und DNS übernehmen.

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

| SendGrid | Emailit |
| --- | --- |
| Konto und Subuser | Konto und [Workspaces](/de/docs/workspaces/). Jeder Workspace hat eigene Domains, Schlüssel, Mitglieder und Credits. |
| API-Schlüssel mit Berechtigungen | [API-Schlüssel](/de/docs/developers/api-keys/): **Full Access** oder **Sending Only**, optional auf eine Domain beschränkt |
| Domain Authentication | [Versanddomain](/de/docs/domains/) mit Einträgen für SPF, DKIM und Return-Path |
| Link Branding | [Tracking-Subdomain](/de/docs/tracking/), ein CNAME wie `go.acme.com` |
| Single Sender Verification | Nicht verfügbar. Jede Absenderadresse muss auf einer verifizierten Domain liegen. |
| Dynamic Templates | [Vorlagen](/de/docs/templates/) mit Alias und Versionen, gerendert mit [Temple](/de/docs/templates/temple/) |
| Event Webhook | [Webhooks](/de/docs/webhooks/) |
| Inbound Parse | [Eingehende E-Mails](/de/docs/inbound/) |
| Suppressions | [Sperrungen](/de/docs/suppressions/) |
| Unsubscribe Groups | Nicht verfügbar. Verwenden Sie [Kontaktlisten](/de/docs/audiences/) und Abmeldelinks in Kampagnen. |
| Marketing-Kontakte und -Listen | [Kontakte](/de/docs/contacts/) und [Kontaktlisten](/de/docs/audiences/) |
| Single Sends | [Kampagnen](/de/docs/campaigns/) |
| Email Activity | **Email API → Emails** und **Email API → Logs** |
| Categories und Custom Args | `meta` |
| Dedizierte IPs und IP-Pools | [Dedizierte IPs](/de/docs/deliverability/dedicated-ips/) auf Anfrage |
| Validierung von E-Mail-Adressen | [E-Mail-Verifizierung](/de/docs/email-verification/) |

## API-Aufrufe anpassen

Aus `POST /v3/mail/send` von SendGrid wird `POST /v2/emails`. Die Anfrage ist flacher: Es gibt keine `personalizations`, und Adressen sind einfache Strings.

```bash title="Before: SendGrid"
curl https://api.sendgrid.com/v3/mail/send \
  -H "Authorization: Bearer $SENDGRID_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "personalizations": [{ "to": [{ "email": "ada@example.com" }] }],
    "from": { "email": "hello@acme.com", "name": "Acme" },
    "subject": "Your receipt",
    "content": [
      { "type": "text/plain", "value": "Thanks for your order." },
      { "type": "text/html", "value": "<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@acme.com>",
    "to": "ada@example.com",
    "subject": "Your receipt",
    "text": "Thanks for your order.",
    "html": "<p>Thanks for your order.</p>"
  }'
```

| SendGrid | Emailit |
| --- | --- |
| `Authorization: Bearer SG.…` | `Authorization: Bearer secret_…` |
| `from: { email, name }` | `from: "Name "` |
| `personalizations[].to[]` | `to`, ein String oder ein Array mit bis zu 50 Adressen |
| `personalizations[].cc[]`, `bcc[]` | `cc`, `bcc` |
| `reply_to: { email }` | `reply_to` |
| `subject` | `subject` |
| `content[]` mit `text/plain` und `text/html` | `text` und `html` |
| `template_id` | `template`, eine Vorlagen-ID oder ein Alias |
| `personalizations[].dynamic_template_data` | `variables` |
| `attachments[]` mit `content`, `filename`, `type`, `content_id` | `attachments[]` mit `content`, `filename`, `content_type`, `content_id` oder einer `url` statt `content` |
| `headers` | `headers` |
| `custom_args`, `categories` | `meta`, ein Objekt aus String-Werten, das in Webhook-Events zurückgegeben wird |
| `send_at` (Unix-Zeit) | `scheduled_at`, das dieselbe Unix-Zeit, ISO 8601 oder englischen Klartext akzeptiert |
| `tracking_settings.open_tracking` und `click_tracking` | `tracking: { "loads": true, "clicks": true }` |
| `asm` (Unsubscribe Groups) | Nicht verfügbar |
| `202 Accepted` mit einem Header `X-Message-Id` | `200` mit einem JSON-Body: `id`, `status: "accepted"` und `ids` mit einer ID pro Empfänger |

Jeder Empfänger in einer Anfrage an Emailit wird zu einer eigenen E-Mail mit eigener ID. Um unterschiedlichen Personen unterschiedliche Variablen zu senden, was SendGrid mit mehreren `personalizations` erledigt, senden Sie eine Anfrage pro Empfänger. 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 | SendGrid | Emailit |
| --- | --- | --- |
| Host | `smtp.sendgrid.net` | `smtp.emailit.com` |
| Port | `587`, `465`, `2525` oder `25` | `587` (STARTTLS), `465` (TLS), `2525`, `2587` oder `25` |
| Benutzername | `apikey` | `emailit` |
| Passwort | Ihr SendGrid-API-Schlüssel | Ihr Emailit-API-Schlüssel |

Emailit liest den Header `X-SMTPAPI` nicht. Entfernen Sie ihn und legen Sie das Tracking stattdessen bei der Domain fest. Siehe [SMTP-Einstellungen](/de/docs/smtp/settings/).

## Webhook-Events zuordnen

| SendGrid-Event | Emailit-Event |
| --- | --- |
| `processed` | `email.accepted` (nur API) |
| `deferred` | `email.attempted` |
| `delivered` | `email.delivered` |
| `bounce` | `email.bounced` |
| `dropped` | `email.suppressed`, wenn der Empfänger auf der Sperrliste steht |
| `open` | `email.loaded` |
| `click` | `email.clicked` |
| `spamreport` | `email.complained` |
| `unsubscribe`, `group_unsubscribe` | `email.unsubscribed`, nur für Kampagnen-E-Mails |
| POST von Inbound Parse | `email.received`, dann den Inhalt mit [`GET /emails/{id}`](/de/docs/api-reference/emails/get/) abrufen |

Wie SendGrid sendet Emailit ein JSON-Array von Events. Die Felder unterscheiden sich:

- 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) statt `sg_message_id` und `data.object.to` statt `email`.
- Ihre `meta`-Werte kommen in `data.object.meta` zurück.
- Emailit signiert Anfragen mit HMAC-SHA256 statt mit dem öffentlichen ECDSA-Schlüssel von SendGrid. Verifizieren Sie `X-Emailit-Signature` mit 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 in SendGrid Ihre **Bounces**, **Spam Reports**, **Invalid Emails** und **Global Unsubscribes**, über die Suppression-Seiten oder mit den API-Endpunkten `/v3/suppression/*`. Blocks sind meist vorübergehend, Sie können sie also weglassen.

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

```csv
email,type,reason
old-address@example.com,recipient,sendgrid bounce
angry@example.com,recipient,sendgrid spam report
```

   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, teilen Sie größere Listen also auf. Duplikate werden übersprungen.

Importieren Sie Personen, die sich über Gruppen von Marketing-E-Mails abgemeldet haben, als Kontakte mit gesetztem **unsubscribed**, statt sie für alle E-Mails zu sperren. Siehe [Sperrungen verwalten](/de/docs/suppressions/manage/).

## Vorlagen umziehen

Exportieren Sie das HTML jedes Dynamic Template aus SendGrid 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 jeder Vorlage einen Alias, etwa `receipt`, und senden Sie sie mit `"template": "receipt"`.

Beide verwenden doppelte geschweifte Klammern, aber Temple ist kleiner als Handlebars:

| SendGrid (Handlebars) | Emailit (Temple) |
| --- | --- |
| `{{first_name}}` | `{{first_name}}` |
| `{{{html_block}}}` | `{{html_block}}`. Temple maskiert HTML nie, maskieren Sie Benutzereingaben also selbst. |
| `{{insert name "default=there"}}` | `{{name\|"there"}}` |
| `{{#if plan}}…{{else}}…{{/if}}` | Identisch |
| `{{#each items}}…{{/each}}` | Nicht unterstützt. Rendern Sie die Liste in Ihrem Code und übergeben Sie sie als eine Variable. |
| `{{#equals plan "pro"}}…{{/equals}}` | Nicht unterstützt. Übergeben Sie einen Boolean wie `is_pro` und verwenden Sie `{{#if is_pro}}`. |

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

## 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 nicht mit den CNAMEs für Domain Authentication oder Link Branding von SendGrid. Behalten Sie Ihren DMARC-Eintrag. Entfernen Sie nach der Umstellung die CNAMEs von SendGrid. Siehe [DNS-Einträge](/de/docs/domains/dns-records/).

Wenn Sie Inbound Parse genutzt haben, richten Sie den MX-Eintrag Ihres Parse-Hostnamens stattdessen auf Emailit. Um denselben Hostnamen zu behalten, etwa `parse.acme.com`, setzen Sie den `inbound_key` der Domain per API auf `parse`. 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/sendgrid/
