Zur Dokumentation springen
Entwicklerv1
CherryMail-Entwicklerdokumentation durchsuchen
Entwickler/Integrationen
Integrationen

Signierte Webhooks empfangen

Reagiere auf eingehende Nachrichten und Kontoereignisse, ohne die API wiederholt aufzurufen.

Abonnement erstellen

Verwende Integrations oder POST /webhooks/ mit den Zugangsdaten eines Kontoinhabers oder Administrators, für die webhook-Berechtigung vorliegt. Für E-Mail-Ereignisse ist außerdem die Berechtigung read, die Auswahl der Postfächer und eine aktuelle Freigabe für die Postfächer erforderlich. Wähle genau die benötigten Ereignisse und Postfach-IDs aus. Speichere das Signaturgeheimnis, sobald es angezeigt wird.

Beispielanfrage
curl -X POST 'https://cherrymail.net/api/v1/webhooks/' \
  -H "Authorization: Bearer $CHERRYMAIL_API_KEY" \
  -H "Idempotency-Key: example-request-1042" \
  -H "Content-Type: application/json" \
  -d '{
  "url": "https://your-app.example/cherrymail/events",
  "events": [
    "message.received"
  ],
  "mailbox_ids": [
    123
  ]
}'

Zieladressen müssen öffentliches HTTPS über Port 443 verwenden. Weiterleitungen, private Adressen und interne Netzwerke werden abgelehnt. Der DNS-Eintrag des Ziels wird beim Verbindungsaufbau erneut überprüft.

Verfügbare Ereignisse

EreignisZweck
message.receivedAktivität des E-Mail-Postfachs
message.submittedAktivität des E-Mail-Postfachs
domain.verifiedResource or service status
mailbox.readyResource or service status
mailbox.deletedResource or service status
alias.readyResource or service status
alias.deletedResource or service status
storage.80Storage threshold
storage.100Storage threshold
service.suspendedResource or service status
service.readyResource or service status
webhook.testLabelled test delivery

E-Mail-Ereignisse enthalten Kennungen und minimale Metadaten. Rufe Nachrichteninhalte und Anhänge über die autorisierte API ab.

Eingehende Nachrichten starten mit einem Ausgangswert
Abonnierte INBOX-Ordner werden alle 30 Sekunden abgefragt. Bereits vorhandene Nachrichten werden nicht gemeldet. Eine Änderung von UIDVALIDITY legt einen neuen Ausgangspunkt fest. Nachrichten, die entfernt werden, bevor sie bei einer Abfrage erfasst werden, können nicht gemeldet werden.

Jede Zustellung überprüfen

Lies den rohen Request-Body ein, bevor du das JSON parst. Berechne HMAC-SHA256 über timestamp + "." + rawBody mit deinem Signaturgeheimnis. Vergleiche das Ergebnis mit CherryMail-Signature, einschließlich des Präfixes v1=.

Signatur überprüfen
import { createHmac, timingSafeEqual } from 'node:crypto';

function verify(rawBody, timestamp, signature, secret) {
  if (!/^\d+$/.test(timestamp) ||
      Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) {
    return false;
  }
  const expected = Buffer.from('v1=' + createHmac('sha256', secret)
    .update(timestamp + '.').update(rawBody).digest('hex'));
  const actual = Buffer.from(signature);
  return actual.length === expected.length &&
    timingSafeEqual(actual, expected);
}

Verwende den CherryMail-Timestamp-Header, lehne Zeitstempel außerhalb eines Fünf-Minuten-Fensters ab, vergleiche Signaturen in konstanter Zeit und verhindere Duplikate anhand der stabilen Ereignis-ID.

Zustellung, Wiederholungsversuche & erneute Verarbeitung

Sende umgehend eine 2xx-Antwort und verarbeite das Ereignis anschließend asynchron. Die Zustellung erfolgt mindestens einmal; die Reihenfolge ist nicht garantiert. Es gibt bis zu zehn automatische Versuche mit exponentiellem Backoff.

Sieh dir den Zustellverlauf an, sende Testereignisse und spiele Zustellungen in Integrations manuell erneut ab. Bei einer erneuten Zustellung bleibt die ursprüngliche Ereignis-ID erhalten. Deine Deduplizierung muss daher auch absichtliche Wiederholungen berücksichtigen. Wenn du ein Zugangsmittel oder eine Berechtigung widerrufst, werden davon abhängige Zustellungen gestoppt.

Als NächstesMCP-Client verbinden