Dashboard
Übersicht über Ihre E-Mail-Gateway-Aktivitäten (heute)
Letzte Nachrichten
| Empfänger | Betreff | Status | Quelle | Gesendet |
|---|---|---|---|---|
| Lade Daten... | ||||
Nachrichten
Übersicht aller versendeten E-Mails
| ID | Empfänger | Betreff | Status | Quelle | Erstellt | Aktionen |
|---|---|---|---|---|---|---|
| Lade Daten... | ||||||
Nachrichtendetails
Templates
Vorschau
Testdaten (JSON) für die Variableninterpolation:
E-Mail senden
Senden Sie eine E-Mail direkt oder mit einem Template
Bounce-Management
Bounce-Raten, Schwellenwerte und automatische Schutzmaßnahmen (siehe BOUNCE_THRESHOLDS.md)
Konfigurierte Schwellenwerte
| Scope | Ziel | Schwelle | Aktion | Mindeststichprobe | Cooldown |
|---|---|---|---|---|---|
| Lade Daten... | |||||
Protokollierte Schutzmaßnahmen
| Account | Scope | Aktion | Status | Bounce-Rate | Zeitpunkt | Aktionen |
|---|---|---|---|---|---|---|
| Lade Daten... | ||||||
Dokumentation
Wählen Sie einen Bereich.
API-Dokumentation
API-Keys und SMTP-Zugänge, Endpunkte für Versand, Versandstatus, Versanddomänen/DKIM, Templates, Webhooks, Hard-Bounce-Sperrliste und Blacklist – für die Integration per HTTP-API.
Templates & Variablen
Der visuelle Template-Editor (Text/Bild/Spacer/Button/Trenner) und wie Platzhalter/Variablen darin eingesetzt werden, inkl. Formeln für Zahlen und Datumswerte.
API-Dokumentation
Wie API-Keys funktionieren, welche Endpunkte damit erreichbar sind und welche Daten jeweils nötig sind.
1. API-Key erstellen und verwenden
Unter Einstellungen » API-Keys einen neuen Key anlegen (nur key_name ist Pflicht). Das Token wird nur einmal im Klartext angezeigt – direkt bei der Erstellung bzw. bei POST /v1/api-keys/{id}/regenerate. Sicher aufbewahren, es lässt sich danach nicht erneut anzeigen.
Ein API-Key hat dieselben Rollen/Berechtigungen wie der Benutzer, dem er gehört – es gibt keine separate, eingeschränktere Rechtevergabe pro Key (außer dem optional zugewiesenen IP-Pool).
Jeder Request wird mit einem Bearer-Token authentifiziert:
Authorization: Bearer <IHR-API-TOKEN>
Beispiel (curl, https://ihre-domain.tld durch Ihre tatsächliche Basis-URL ersetzen):
curl https://ihre-domain.tld/v1/messages \ -H "Authorization: Bearer <IHR-API-TOKEN>"
2. SMTP-Zugänge (echte SMTP-Authentifizierung)
Verwaltung unter Einstellungen » SMTP-Zugänge oder per API:
| Endpunkt | Beschreibung |
|---|---|
POST /v1/smtp-credentials | Zugang anlegen – Body: {"username": "...", "password": "min. 12 Zeichen", "description": "..." (optional), "ip_pool_id": ... (optional)} |
GET /v1/smtp-credentials | eigene Zugänge auflisten (ohne Passwort) |
DELETE /v1/smtp-credentials/{id} | Zugang löschen |
Das Passwort wird nur in der Erstellungsantwort zurückgegeben – es gibt kein /regenerate. Geht es verloren, muss der Zugang gelöscht und neu angelegt werden.
curl -X POST https://ihre-domain.tld/v1/smtp-credentials \
-H "Authorization: Bearer <IHR-API-TOKEN>" \
-H "Content-Type: application/json" \
-d '{"username": "mein-smtp-user", "password": "ein-sehr-sicheres-passwort"}'
SMTP-Verbindungsdaten: Port 587 (STARTTLS) oder 465 (implizites TLS), AUTH LOGIN/PLAIN mit obigem Benutzername/Passwort. Auch hier gilt Abschnitt 5: Die Absenderdomäne im MAIL FROM muss für den Account als bestätigte Versanddomäne registriert sein, sonst wird die Nachricht beim RCPT TO abgelehnt.
3. E-Mail senden
POST /v1/send – E-Mail ohne Template
| Feld | Pflicht | Beschreibung |
|---|---|---|
to | ja | E-Mail-Adresse oder Array von Adressen (String oder {"email": "..."}) |
subject | ja | Betreff |
content.html / content.text | ja (mind. eines) | HTML- und/oder Text-Inhalt |
from | empfohlen | Absenderadresse. Ohne Angabe wird die Server-Standardadresse verwendet – siehe Hinweis unten. |
send_at | nein | Geplanter Versandzeitpunkt (muss in der Zukunft liegen, max. 1 Jahr) – "YYYY-MM-DD HH:MM:SS"/"YYYY-MM-DDTHH:MM:SS" (als UTC interpretiert) oder ISO-8601 mit Zeitzonen-Offset. Ohne Angabe: sofortiger Versand. |
curl -X POST https://ihre-domain.tld/v1/send \
-H "Authorization: Bearer <IHR-API-TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"to": "empfaenger@beispiel.de",
"from": "absender@ihre-versanddomaene.de",
"subject": "Testmail",
"content": { "text": "Hallo Welt", "html": "<p>Hallo Welt</p>" },
"send_at": "2026-12-24T08:00:00+01:00"
}'
Antwort (201): {"message_id": "...", "status": "queued", "scheduled_for": "2026-12-24 07:00:00"} – scheduled_for ist null bei sofortigem Versand.
POST /v1/send-template – E-Mail mit gespeichertem Template versenden
| Feld | Pflicht | Beschreibung |
|---|---|---|
to | ja | wie oben |
template_id | ja | ID eines eigenen, aktiven Templates |
personalization | nein | Objekt mit Variablen für die Template-Interpolation |
from | empfohlen | wie oben |
send_at | nein | wie oben |
POST /v1/sending-domains registriert und über POST /v1/sending-domains/{id}/verify bestätigt worden sein (siehe Abschnitt 5). Es gibt keine Ausnahme mehr für eine Standard-/Plattformdomäne – ohne bestätigte Domäne liefert /v1/send einen 400-Fehler.
400 abgelehnt, bevor die Nachricht in die Warteschlange kommt (siehe Abschnitte 9 und 10).
send_at): Die Nachricht wird sofort angenommen (Status queued), aber erst ab dem angegebenen Zeitpunkt vom Worker abgeholt. Die Sperrlisten-Prüfung oben läuft dabei nur einmalig bei der Einreichung, nicht erneut unmittelbar vor dem tatsächlichen Versand - Details in QUEUE.md, Abschnitt "Geplanter Versand".
4. Versandstatus abfragen
GET /v1/messages – eigene Nachrichten, paginiert
| Parameter | Beschreibung |
|---|---|
limit | max. Ergebnisse (Standard 25, max. 100) |
offset | Offset für Paginierung |
status | z. B. queued, delivered, bounced, failed |
search | Teilstring-Suche über Empfänger/Betreff |
GET /v1/messages/{message_id} – Status und Event-Historie einer einzelnen Nachricht (nur eigene, per UUID aus der Sende-Antwort)
Jede zurückgegebene Nachricht enthält source_type (smtp/api/ui) und source_label (SMTP-Benutzername, API-Key-Name bzw. „Admin-Oberfläche“ für über „E-Mail senden“ eingereichte Testmails).
5. Versanddomänen & DKIM
Erforderlich, bevor eine Domäne als Absender genutzt werden kann (siehe Abschnitt 3). Registrierung legt sofort einen aktiven DKIM-Schlüssel an.
| Endpunkt | Beschreibung |
|---|---|
POST /v1/sending-domains | Domäne registrieren – Body: {"domain": "ihre-versanddomaene.de"} |
GET /v1/sending-domains | eigene Domänen mit Status (is_verified, is_active) auflisten |
GET /v1/sending-domains/{id}/dns-check | Live-Status der benötigten SPF-/DKIM-/DMARC-DNS-Einträge |
POST /v1/sending-domains/{id}/verify | Domainbesitz bestätigen (erst danach als Absender zulässig) – schlägt fehl, solange SPF/DMARC/DKIM nicht als "present" erkannt werden |
DELETE /v1/sending-domains/{id} | Domäne löschen |
Ablauf: Domäne registrieren → die von dns-check gemeldeten SPF-/DKIM-/DMARC-TXT-Einträge beim DNS-Provider veröffentlichen → verify aufrufen, bis alle Einträge als "present" erkannt werden.
Die im DMARC-Eintrag vorgeschlagene rua=mailto:...-Report-Adresse stammt aus der accountweiten dmarc_report_address (PUT /v1/accounts/self, auch unter Einstellungen > Versanddomänen editierbar) - ohne eigene Angabe wird nur ein nicht erreichbarer Platzhalter vorgeschlagen.
6. Templates
| Endpunkt | Beschreibung |
|---|---|
POST /v1/templates | Template anlegen – Body: {"name": "...", "description": "..." (optional)} |
GET /v1/templates | eigene Templates auflisten |
GET /v1/templates/{id} | Template mit aktiver Version laden |
PUT /v1/templates/{id}/versions | neue Version anlegen – Body: {"subject": "...", "html_content"/"mjml_source"/"blocks", "text_content", "is_active": true/false} |
POST /v1/templates/{id}/preview | Test-Rendering mit variables, ohne zu speichern – liefert bei fehlerhaften Platzhalter-Formeln zusätzlich data.errors |
DELETE /v1/templates/{id} | Template mit allen Versionen löschen |
POST /v1/template-assets | Bild für den Bild-Baustein hochladen (multipart/form-data, Feld image, max. 5 MB) |
Im Einstellungen-Bereich „Templates" kann eine neue Version statt per MJML/HTML-Quelltext auch über den visuellen Editor (Baustein-Palette Text/Bild/Spacer/Button/Trenner) zusammengestellt werden. Wie Platzhalter/Variablen darin funktionieren, inkl. Formeln für Zahlen und Datumswerte: Dokumentation „Templates & Variablen".
7. Webhooks (Zustellbenachrichtigungen)
Verwaltung unter Einstellungen » Webhooks oder per API. Jeder Webhook hat seine eigene Ereignisliste – es können mehrere Webhooks mit unterschiedlichen Events parallel registriert sein.
POST /v1/webhooks – Body: {"url": "https://...", "events": ["message.delivered", "message.bounced", ...]}. Das Secret zur Signaturprüfung eingehender Webhook-Requests wird nur bei Erstellung bzw. POST /v1/webhooks/{id}/rotate-secret im Klartext zurückgegeben.
Gültige Events: message.queued, message.processing, message.deferred, message.accepted, message.delivered, message.bounced, message.failed, message.complaint, message.opened, message.clicked. Weitere Endpunkte: GET /v1/webhooks, PUT /v1/webhooks/{id}, DELETE /v1/webhooks/{id}, GET /v1/webhooks/{id}/deliveries (Zustellprotokoll).
8. API-Keys verwalten
| Endpunkt | Beschreibung |
|---|---|
GET /v1/api-keys | eigene Keys auflisten (Token wird als präfix*** maskiert) |
POST /v1/api-keys | neuen Key anlegen – Body: {"key_name": "...", "ip_pool_id": ... (optional)} |
PUT /v1/api-keys/{id} | Key aktualisieren (z. B. Name, IP-Pool) |
POST /v1/api-keys/{id}/regenerate | neues Token erzeugen (altes wird sofort ungültig) |
DELETE /v1/api-keys/{id} | Key löschen |
GET /v1/api-keys/available-ip-pools | IP-Pools, die einem eigenen Key zugewiesen werden dürfen |
9. Hard-Bounce-Sperrliste
Bei einem endgültig fehlgeschlagenen Zustellversuch (Hard-Bounce) wird die Empfängeradresse automatisch für die sendende Identität gesperrt – für Session-/API-Key-Versand also den jeweiligen Benutzer, für SMTP-Versand den jeweiligen SMTP-Zugang (SMTP-Zugänge gehören einem Account, keinem Benutzer). Ein weiterer Sendeversuch an eine gesperrte Adresse wird vor dem Versand abgelehnt (400 bei /v1/send, REJECT bei SMTP-Submission). Die Sperre gilt ausschließlich für die betroffene Identität, nicht accountübergreifend – eine verbrannte Liste eines Senders blockiert keine anderen Sender desselben Accounts.
| Endpunkt | Beschreibung |
|---|---|
GET /v1/bounce-suppressions | eigene Sperrliste auflisten |
DELETE /v1/bounce-suppressions/{id} | Adresse wieder freischalten |
10. Blacklist (global / Account / Benutzer)
Manuell gepflegte, dreistufige Sperrliste – unabhängig von der automatischen Bounce-Sperrliste. Alle zutreffenden Stufen gelten beim Versand immer kumulativ: die globale Blacklist wirkt für jeden Versand der gesamten Instanz, die Account-Blacklist zusätzlich für den jeweiligen Account und dessen Subaccounts, die Benutzer-Blacklist zusätzlich nur für den jeweiligen Benutzer. Jede Stufe ist strikt getrennt – über die Endpunkte einer Stufe sind Einträge einer übergeordneten Stufe weder sichtbar noch bearbeitbar.
| Endpunkt | Stufe | Berechtigung |
|---|---|---|
GET/POST /v1/blacklist, DELETE /v1/blacklist/{id} | Benutzer (nur eigene) | blacklist.read/.create/.delete |
GET/POST /v1/blacklist/account, DELETE /v1/blacklist/account/{id} | eigener Account (inkl. Subaccounts) | blacklist.manage |
GET/POST /v1/blacklist/global, DELETE /v1/blacklist/global/{id} | global (gesamte Instanz) | nur Systemadministratoren (Backend Admin Center) |
Body für POST: {"email": "...", "reason": "..." (optional)}.
11. Fehler & Rate-Limits
Fehlerantworten haben immer dieselbe Struktur:
{ "error": true, "message": "...", "code": 400, "details": { ... } }
| Code | Bedeutung |
|---|---|
| 400 | Ungültige/fehlende Felder, ungültige Absenderdomäne |
| 401 | Kein oder ungültiges Bearer-Token |
| 403 | Authentifiziert, aber fehlende Berechtigung |
| 404 | Ressource nicht gefunden oder gehört nicht zum eigenen Account |
| 429 | Rate-Limit erreicht – Retry-After-Header beachten |
| 503 | Instanz noch nicht versandbereit (Ersteinrichtung unvollständig) oder kein IP-Pool verfügbar |
Rate-Limits gelten pro API-Key (nach erfolgreicher Authentifizierung) bzw. pro Client-IP (unauthentifizierte Requests), konfiguriert vom Betreiber der Instanz.
Templates & Variablen
« Zur Dokumentations-Übersicht
Der visuelle Template-Editor
Unter Templates kann eine neue Version statt per MJML-/HTML-Quelltext über den visuellen Editor zusammengestellt werden: Baustein-Palette (Text/Bild/Spacer/Button/Trenner), Blockliste mit Auf/Ab-Sortierung und Drag-and-Drop, Design-Einstellungen (Hintergrund, Breite, Schrift) sowie eine Live-Vorschau mit Anzeige von Formel-Fehlern. Ein Umschalter wechselt bei Bedarf zurück auf die klassische MJML-/HTML-Bearbeitung.
Variablen & Platzhalter
Beim Versand mit Template (/v1/send-template, Feld personalization) oder in der Vorschau (Button „Vorschau" im Editor bzw. /v1/templates/{id}/preview, Feld variables) wird ein Objekt mit Werten übergeben, das im Betreff, HTML- und Text-Inhalt per {{ ... }} eingesetzt wird:
{"to": "empfaenger@beispiel.de", "template_id": 1,
"personalization": {"name": "Frau Beispiel", "preis": 19.9, "sent_at": "2026-10-02 14:30"}}
| Schreibweise | Bedeutung |
|---|---|
{{ name }} | Wert der Variable name, HTML-escaped (Standard, XSS-sicher) |
{{{ name }}} | wie oben, aber unescaped – nur verwenden, wenn die Variable selbst bereits sicheres HTML enthält |
{{ user.city }} | Punktnotation für verschachtelte Objekte, z. B. personalization.user.city |
{{ }}) innerhalb der äußeren Klammern. Richtig: {{ preis | number_format(2) }}. Falsch: {{ {{preis}} | number_format(2) }} – das ergibt keinen gültigen Ausdruck.
Formeln (Arithmetik)
+ - * / und Klammern, Punkt-vor-Strich – wirken nur auf Zahlen:
{{ menge * preis }}
{{ (grundpreis + aufschlag) * 1.19 }}
Filter (Formatierung)
Ein oder mehrere Filter mit | hintereinanderhängen – der Wert links von | wird in den nächsten Filter eingespeist:
| Filter | Beispiel | Wirkung |
|---|---|---|
number_format(decimals, dec_point, thousands_sep) | {{ preis | number_format(2) }} | 1234.5 → 1.234,50 (Standard: Komma/Punkt wie im Deutschen) |
upper / lower | {{ name | upper }} | GROSS- bzw. kleinschreibung |
trim | {{ name | trim }} | entfernt Leerzeichen am Anfang/Ende |
default(wert) | {{ firma | default("Privatkunde") }} | Ersatzwert, falls die Variable fehlt oder leer ist |
date_parse(format) | {{ sent_at | date_parse("Y-m-d H:i") }} | liest einen Datums-String ein (ohne Format wird ein gängiges Standardformat automatisch erkannt) |
date_add(intervall) | {{ sent_at | date_add("+4 hours") }} | verschiebt ein Datum, Intervall z. B. "+1 day", "-30 minutes", "+2 months" |
date_format(format) | {{ sent_at | date_format("d.m.Y H:i") }} | gibt ein Datum in einem bestimmten Format aus |
Datumsformate
| Zeichen | Bedeutung | Beispiel |
|---|---|---|
Y | Jahr, vierstellig | 2026 |
m | Monat, zweistellig | 01–12 |
d | Tag, zweistellig | 01–31 |
H | Stunde, 24h, zweistellig | 00–23 |
i | Minute, zweistellig | 00–59 |
s | Sekunde, zweistellig | 00–59 |
Dieselben Zeichen gelten für Ein- und Ausgabeformat – {{ sent_at | date_parse("Y-m-d H:i") }} erwartet z. B. genau 2026-10-02 14:30. Ohne Formatangabe erkennt date_parse automatisch gängige Formate (Y-m-d H:i:s, Y-m-d H:i, Y-m-d, ISO 8601).
Kombiniertes Beispiel – Datum einlesen, 4 Stunden draufrechnen, dann in einem anderen Format ausgeben, alles in einem Ausdruck:
{{ sent_at | date_parse("Y-m-d H:i") | date_add("+4 hours") | date_format("d.m.Y H:i") }}
Aus sent_at = "2026-10-02 14:30" wird so 02.10.2026 18:30.
Einstellungen
Benutzer-, API-Key-, IP-Pool- und Versanddomänenverwaltung
- Benutzer
- API-Keys
- SMTP-Zugänge
- IP-Pools
- Versanddomänen
- Webhooks
- Bounce-Liste
- Meine Blacklist
- Account-Blacklist
| Benutzername | Aktiv | Aktionen | |
|---|---|---|---|
| Lade Daten... | |||
| Name | Präfix | Aktiv | Aktionen |
|---|---|---|---|
| Lade Daten... | |||
| Benutzername | Beschreibung | IP-Pool | Aktiv | Aktionen |
|---|---|---|---|---|
| Lade Daten... | ||||
SMTP-Server: Port 587 (STARTTLS) oder 465 (implizit TLS), Benutzername/Passwort wie oben. Diese Zugangsdaten sind unabhängig von API-Keys – ein API-Key funktioniert nicht als SMTP-Passwort.
| Name | Geteilt | Aktiv | Priorität | Gewicht |
|---|---|---|---|---|
| Lade Daten... | ||||
DMARC-Report-Adresse
Wird als rua=mailto:... im vorgeschlagenen DMARC-Eintrag aller eigenen Versanddomänen verwendet. Dieses Gateway versendet nur - es hostet selbst kein Postfach dafür. Ohne eigene Adresse wird nur ein nicht funktionsfähiger Platzhalter vorgeschlagen, an den gesendete DMARC-Aggregatreports nie ankommen (kein MX/Postfach dahinter).
| Domain | Verifiziert | Aktiv | Aktionen |
|---|---|---|---|
| Lade Daten... | |||
Domainverifizierung
| URL | Ereignisse | Aktiv | Max. Versuche | Aktionen |
|---|---|---|---|---|
| Lade Daten... | ||||
Webhook bearbeiten
Zustellprotokoll
| Ereignis | Status | HTTP-Code | Versuche | Zuletzt | Fehler |
|---|---|---|---|---|---|
| Lade Daten... | |||||
Adressen, die bei einer von Ihnen (Ihrem Benutzer bzw. Ihrem SMTP-Zugang) versendeten Nachricht mit einem endgültigen Fehler (Hard-Bounce) abgelehnt wurden. Diese Adressen werden vor jedem weiteren Versand automatisch geprüft und abgelehnt, bis sie hier wieder freigeschaltet werden. Gilt ausschließlich für Ihre eigenen Sendungen, nicht accountübergreifend.
| E-Mail-Adresse | Gesperrt seit | Aktionen |
|---|---|---|
| Lade Daten... | ||
Adressen, an die ausschließlich von Ihrem eigenen Benutzer nicht mehr gesendet werden soll. Zusätzlich gelten immer auch die Account-weite und die globale Blacklist - diese sehen Sie hier nicht und können sie nicht bearbeiten.
| E-Mail-Adresse | Grund | Gesperrt seit | Aktionen |
|---|---|---|---|
| Lade Daten... | |||
Adressen, an die von KEINEM Benutzer und KEINEM SMTP-Zugang dieses Accounts (inkl. Subaccounts) mehr gesendet werden soll. Zusätzlich gilt immer auch die globale Blacklist.
| E-Mail-Adresse | Grund | Gesperrt seit | Aktionen |
|---|---|---|---|
| Lade Daten... | |||
Backend Admin Center
Hauptaccounts, plattformweite Benutzer, IP-Pools und Health-/Bounce-Übersicht
| Name | Aktiv | Gesperrt | Sendelimit/Tag | Standard-Pool | Subaccounts | Benutzer | Erstellt | Aktionen |
|---|---|---|---|---|---|---|---|---|
| Lade Daten... | ||||||||
| Benutzername | Account | Aktiv | Erstellt | |
|---|---|---|---|---|
| Lade Daten... | ||||
Lade Daten...
| Name | Geteilt | Aktiv | Eigentümer-Account | Priorität | Gewicht | Aktionen |
|---|---|---|---|---|---|---|
| Lade Daten... | ||||||
| Pool | IP | Aktiv | Nachrichten (7T) | Bounces (7T) | Bounce-Rate |
|---|---|---|---|---|---|
| Lade Daten... | |||||
Globale "Super"-Blacklist: gilt für JEDEN Versand der gesamten Instanz, unabhängig von Account oder Benutzer. Nur hier im Backend Admin Center pflegbar.
| E-Mail-Adresse | Grund | Gesperrt seit | Aktionen |
|---|---|---|---|
| Lade Daten... | |||