obhutDoku

Dokumentation durchsuchen

Dokumentationsseiten durchsuchen

Transaktions-E-Mails per API senden

Kontrollierter Pilot für kleine, transaktionale JSON-Nachrichten mit eigener Absenderdomain, Idempotenz und Unterdrückungslisten.

Die Transaktionsmail-API nimmt kleine, anwendungsbezogene Nachrichten als JSON an. Eine eigene Absenderdomain, ein eng begrenzter Mail-Zugang und ein Idempotenzschlüssel trennen diesen Pfad von Benutzerkonten, Einladungen und anderen Obhut-Systemmails.

Versand vorbereiten

Absenderdomain anlegen

Öffne im Dashboard E-Mail-Versand, lege die Domain an und veröffentliche den dort exakt angezeigten Ownership-TXT-Eintrag.

Ownership und DKIM prüfen

Starte die DNS-Prüfung. Für den Versand müssen die Domain als verifiziert und DKIM als aktiv angezeigt werden. Ein verifizierter Ownership-Eintrag allein reicht nicht aus.

Mail-Zugang erstellen

Erstelle einen Zugang für genau eine Domain oder für alle verifizierten Domains der Organisation. Das Token mit Präfix obhut_mail_ wird nur einmal angezeigt. Speichere es in deinem Secret Store und nie im Quellcode.

Erste Nachricht mit eindeutiger ID senden

Verwende je fachlichem Versandversuch einen stabilen Idempotency-Key. Wiederhole denselben Versuch nur mit demselben Schlüssel und unverändertem Body.

Anfrage

Der Maschinenendpunkt ist POST /v1/mail/send.

export OBHUT_MAIL_TOKEN='<einmal angezeigtes Token>'
export IDEMPOTENCY_KEY="$(openssl rand -hex 16)"

curl --fail-with-body https://api.obhut.io/v1/mail/send \
  --request POST \
  --header "Authorization: Bearer $OBHUT_MAIL_TOKEN" \
  --header "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
    "from": {
      "email": "rechnung@example.com",
      "name": "Example GmbH"
    },
    "replyTo": "service@example.com",
    "to": ["kunde@example.net"],
    "subject": "Ihre Rechnung 2026-0042",
    "text": "Guten Tag, Ihre Rechnung steht im Kundenportal bereit."
  }'

Erfolgreiche Annahme durch die Versandwarteschlange liefert 202:

{
  "submissionId": "41f65375-44ae-4cdd-9e9e-d6ffbc2c4021",
  "messageId": "<a1b2c3d4e5f6@example.com>",
  "state": "accepted",
  "recipientCount": 1
}

Die Antwort bestätigt die Annahme durch die Warteschlange, nicht die Zustellung im Empfängerpostfach und keine Platzierung im Posteingang.

Idempotenz und Wiederholungen

Der Idempotency-Key ist Pflicht und darf höchstens 128 Byte lang sein.

  • accepted: Die Warteschlange hat die Nachricht angenommen. Nicht erneut senden.
  • unknown: Die Verbindung brach in einem mehrdeutigen Moment ab. Derselbe Schlüssel liefert den gespeicherten Zustand und sendet nicht automatisch erneut.
  • failed mit HTTP 502: Die Annahme ist sicher fehlgeschlagen. Wiederhole den unveränderten Body mit demselben Schlüssel.
  • suppressed: Mindestens ein Empfänger steht auf der Unterdrückungsliste; die gesamte Nachricht wurde nicht versendet.

Ein anderer Body mit demselben Schlüssel liefert 409 idempotency_conflict. Bei einem Client-Timeout zuerst denselben Schlüssel erneut verwenden. Ein neuer Schlüssel kann eine doppelte Nachricht erzeugen.

Grenzen des Piloten

  • 1 bis 10 Empfänger in to;
  • gesamter JSON-Body höchstens 256 KiB;
  • Betreff höchstens 255 Byte;
  • text und html jeweils höchstens 128 KiB, mindestens eines ist Pflicht;
  • Anzeigename höchstens 128 Zeichen;
  • keine Anhänge, CC/BCC, frei gesetzten Header, Templates, Kampagnen, Terminierung, Listen oder Marketingmails;
  • Standardgrenzen: 60 Nachrichten pro Minute je Zugang, 200 Empfänger pro Minute je Organisation, 1.000 Nachrichten und 5.000 Empfänger pro UTC-Tag.

HTTP 429 quota_exceeded kann nach dem nächsten Zeitfenster mit demselben Idempotenzschlüssel wiederholt werden. Höhere Grenzen benötigen ein erneutes Zustellbarkeits- und Missbrauchsreview.

Wichtige Fehler

HTTPFehlerBedeutung
400idempotency_key_requiredSchlüssel fehlt oder ist zu lang.
400invalid_bodyJSON oder Feldgrenzen sind ungültig.
400domain_not_verifiedDie Absenderdomain ist nicht verifiziert.
400dkim_not_activeDer veröffentlichte DKIM-Schlüssel ist noch nicht aktiv.
401unauthorizedToken ist unbekannt, abgelaufen oder widerrufen.
403domain_out_of_scopeZugang ist nicht für diese Domain freigegeben.
403domain_suspendedVersand für die Domain wurde gestoppt.
409idempotency_conflictSchlüssel wurde bereits mit anderem Body verwendet.
413payload_too_largeGesamter JSON-Body überschreitet 256 KiB.
429quota_exceededMinuten- oder Tagesgrenze ist ausgeschöpft.
502Versandwarteschlange hat die Nachricht sicher nicht angenommen.
503mail_not_enabledPilot ist in dieser Umgebung nicht aktiviert.

Datenschutz und Unterdrückungen

Obhut speichert weder Betreff noch Body noch Empfängeradressen in den Versandmetadaten. Gespeichert werden der Zustand, Zähler, begrenzte Fehlercodes und für Unterdrückungen nur nicht umkehrbare Empfänger-Hashes. Hard Bounces und manuelle Beschwerden sperren den betroffenen Empfänger für weitere Versuche. Unter E-Mail-Versand kannst du eine Adresse prüfen, manuell unterdrücken oder nach dokumentierter Klärung wieder freigeben.