Zur Dokumentation springen
CLI

Kontakte, Zielgruppen und Broadcasts

Jeder Befehl für das Adressbuch, die Zielgruppen, die Broadcasts und die Sperrliste, mit durchgerechneten Beispielen.

Wie sie zusammenhängen

Vier Namespaces decken die Menschen ab, denen Sie schreiben. Kontakte sind das Adressbuch des Workspace, Zielgruppen sind benannte Listen von Kontakten, ein Broadcast sendet eine Nachricht an alle in einigen Zielgruppen, und die Sperrliste enthält die Adressen, an die der Workspace nicht sendet. Jeder Befehl ruft eine SDK-Methode auf, die SDK-Seiten beschreiben dieselben Aufrufe also ausführlicher.

  • Ein Kontakt hat keine ID. Seine Adresse ist der Schlüssel, den jeder contacts-Befehl nimmt, ohne umgebende Leerzeichen und in Kleinbuchstaben, [email protected] und [email protected] sind also ein Kontakt. Eine Zielgruppe hat eine aud_-ID, ein Broadcast eine brd_-ID und ein Sperreintrag die ID, die suppressions list ausgibt.
  • Jeder Kontakt ist in der Standard-Zielgruppe, solange es ihn gibt. Diese Zielgruppe lässt sich nicht löschen, leeren oder verkleinern, und builtin ist bei ihr default.
  • Das Adressbuch gehört dem Workspace, daher lesen und schreiben jedes Mitglied und jeder Schlüssel dasselbe.
  • Jeder Namespace hört auch auf seinen Singular, wie in openemail contact get, und die üblichen Aliasse funktionieren: ls, show, new, edit und rm. In suppressions, dessen Verben add und remove heißen, führt new zu add und rm zu remove.

openemail <namespace> <verb> --help zeigt jedes Flag mit seinem Typ, die Scopes, den Endpunkt und was der Befehl zurückgibt. Fügen Sie --json hinzu, um dieselbe Seite als Daten zu erhalten.

Kontakte

Das Adressbuch des Workspace: die Menschen, denen ein Mitglied aus dem Composer der App geschrieben hat, und alle, die von Hand gespeichert wurden. Eingehende Mail fügt niemanden hinzu, ebenso wenig ein Versand über die API oder die CLI.

BefehlWas es tut
openemail contacts listEine Seite der gespeicherten Kontakte, zuletzt angeschriebene zuerst. --source behält manual- oder auto-Kontakte, und --q durchsucht Namen und Adressen
openemail contacts get <email>Ein Kontakt, mit jeder Zielgruppe, in der er ist
openemail contacts create --email <value>Einen neuen Kontakt speichern, mit --name, --notes und --audience-ids. Eine Adresse, die schon im Adressbuch steht, wird mit 409 contact_exists abgelehnt
openemail contacts update <email>--name oder --notes ändern, wobei null einen Wert löscht. Die Adresse selbst lässt sich nicht ändern
openemail contacts delete <email>Den Kontakt mit Notizen, Foto und Mitgliedschaften löschen und die Adresse ausblenden, damit der Composer sie nicht erneut erfasst
openemail contacts set-audiences <email> --audience-ids <a,b>Die Zielgruppen des Kontakts genau auf diese Liste setzen. Die Standard-Zielgruppe bleibt immer erhalten
openemail contacts list-peopleAlle auf der Seite Kontakte: die gespeicherten Kontakte und, mit threads:read, jede Adresse, die in Mail vorkam, mit Thread-Zahlen. --sort, --q, --email und --blocked grenzen sie ein
openemail contacts save <email>Eine Adresse speichern, eine aus einem Versand erfasste behalten oder eine gelöschte zurückholen. Nie ein Fehler, egal in welchem Zustand die Adresse ist
openemail contacts delete-many <emails...>1 bis 200 Adressen in einem Aufruf löschen und ausblenden
openemail contacts set-photo <email> <data>Das Foto aus einer Datei oder über stdin mit - hochladen: PNG, JPEG, WebP oder GIF bis 5 MB
openemail contacts remove-photo <email>Das Foto entfernen und das gespeicherte Bild löschen
openemail contacts block <email>Die Adresse auf die Blockliste des Workspace setzen, sodass Mail von ihr abgelehnt wird. Ein Plus-Tag fällt weg
openemail contacts unblock <email>Jede Blocklisten-Regel entfernen, die die Adresse blockiert, einschließlich einer Regel für die ganze Domain
openemail contacts list-threads <email>Die Threads, die die Adresse geschrieben hat oder an die sie geschrieben wurde, in jedem Ordner. --q durchsucht sie
openemail contacts activity <email>Von der Adresse empfangene und an sie gesendete Mail über einen Zeitraum, 90 Tage, sofern --minutes nichts anderes sagt, mit den Threads, die auf eine Antwort warten, und der mittleren Antwortzeit in beide Richtungen

Zielgruppen

Benannte Listen von Kontakten, bis zu 100 in einem Workspace. Eine Adresse muss ein Kontakt sein, bevor sie einer beitritt, außer über import-contacts, das neue Adressen dabei speichert.

BefehlWas es tut
openemail audiences listEine Seite der Zielgruppen, die Standard-Zielgruppe zuerst und die übrigen neueste zuerst, jede mit ihrem contactCount
openemail audiences growthWie die Zielgruppen über einen Zeitraum gewachsen sind, 30 Tage, sofern --days oder --minutes nichts anderes sagt: Beitritte und Abmeldungen pro Intervall und Summen
openemail audiences get <id>Eine Zielgruppe, mit einem frischen contactCount
openemail audiences create --name <value>Eine leere Zielgruppe anlegen, mit optionaler --description. Namen sind nicht eindeutig
openemail audiences update <id>--name oder --description ändern. Die Mitgliedschaft bleibt unberührt
openemail audiences delete <id>Die Zielgruppe löschen und ihre Kontakte behalten. Die Standard-Zielgruppe lässt sich nicht löschen
openemail audiences empty <id>Jeden Kontakt herausnehmen und die Zielgruppe behalten, mit ihrer ID, ihrem Namen und ihrer Beschreibung
openemail audiences list-contacts <id>Eine Seite der Kontakte in der Zielgruppe, mit dem Beitrittsdatum jedes einzelnen und ob er sich abgemeldet hat. --sort, --q, --source und --statuses grenzen sie ein
openemail audiences add-contact <id> --email <value>Einen bestehenden Kontakt in die Zielgruppe aufnehmen. Jemanden hinzuzufügen, der schon darin ist, ändert nichts
openemail audiences remove-contact <id> <email>Einen Kontakt herausnehmen. Ein Kontakt, der nicht in der Zielgruppe ist, ist ein 404
openemail audiences add-contacts <id> --emails <a,b>Bis zu 200 bestehende Kontakte aufnehmen und die Adressen, die keine Kontakte sind, in missing melden
openemail audiences remove-contacts <id> --emails <a,b>Bis zu 200 Kontakte herausnehmen und die melden, die nicht darin waren
openemail audiences import-contacts <id> --contacts <json|@file|->Bis zu 500 { email, name }-Zeilen importieren und die Adressen speichern, die noch keine Kontakte sind

Broadcasts

Eine Nachricht an alle in bis zu 10 Zielgruppen, als eigene Kopie für jede Person gesendet, mit ausgefüllten Seriendruckfeldern und einem Abmeldelink. Jede Kopie ist eine gewöhnliche E-Mail mit eigener msg_-ID, eigenen Ereignissen und Webhooks.

BefehlWas es tut
openemail broadcasts preview --audience-ids <a,b>Zählen, wen ein Broadcast an diese Zielgruppen erreichen würde und wen er als abgemeldet oder gesperrt überspringen würde. Sendet nichts
openemail broadcasts send --audience-ids <a,b> --from <value>Mit --subject und --html oder --text oder einer gespeicherten --template senden, jetzt oder zu --scheduled-at
openemail broadcasts listEine Seite Broadcasts, neueste zuerst, mit Live-Zahlen. --audience-id behält die, die an diese Zielgruppe gesendet wurden
openemail broadcasts get <id>Ein Broadcast, mit Status und Live-Zahlen: der Befehl, den Sie abfragen, während er sendet
openemail broadcasts stats <id>Summen von zugestellt, gebounct, geöffnet, geklickt und abgemeldet, und eine Reihe pro --grain-Intervall, eine Stunde, sofern Sie nichts anderes sagen
openemail broadcasts list-recipients <id>An wen jede Kopie ging und was mit ihr passiert ist. --filter behält eine Gruppe, etwa bounced oder not_opened
openemail broadcasts get-recipient <id> <email-id>Die Kopie einer Person, mit Betreff, HTML und Text genau so, wie sie sie erhalten hat
openemail broadcasts cancel <id>Einen Broadcast stoppen, der geplant, in der Warteschlange oder noch im Versand ist. Bereits versandte Kopien lassen sich nicht zurückholen

Sperrliste

Die Adressen, an die dieser Workspace nicht sendet: Hard Bounces und Beschwerden, erfasst, sobald sie auftreten, und jede Adresse, die Sie von Hand hinzufügen. Ein Versand an eine davon wird für diesen Empfänger abgelehnt, bevor etwas hinausgeht.

BefehlWas es tut
openemail suppressions listEine Seite der Liste, neueste zuerst. --reason behält bounce, complaint oder manual, und --q sucht
openemail suppressions get <id>Eine Zeile: die Adresse, der Grund, das Detail, das der Bounce oder die Beschwerde mitbrachte, und ob sie sich entfernen lässt
openemail suppressions add --email <value>Das Senden an eine Adresse stoppen. Eine Adresse hinzuzufügen, die schon darin ist, gibt ihre bestehende Zeile zurück
openemail suppressions remove <id>Mail an die Adresse wieder zulassen. Ein Hard Bounce lässt sich nicht entfernen

Sperrliste und Blockliste sind verschiedene Listen. suppressions add stoppt ausgehende Mail an eine Adresse, und contacts block lehnt eingehende Mail von ihr ab.

Scopes

Die meisten Befehle brauchen den Lese- oder Schreib-Scope ihres Namespace. Einige brauchen einen anderen, weil sie etwas anderes lesen oder ändern:

ScopeBefehle
contacts:readcontacts list, get und list-people
contacts:writecontacts create, update, delete, save, delete-many, set-photo und remove-photo, und audiences import-contacts neben audiences:write
audiences:readaudiences list, growth, get und list-contacts sowie broadcasts preview, sodass ein Schlüssel, der nicht senden kann, trotzdem die Zahl zeigen kann
audiences:writeJeder andere audiences-Befehl und contacts set-audiences. contacts create --audience-ids braucht ihn neben contacts:write
threads:readcontacts list-threads und activity sowie die in Mail gesehenen Adressen in list-people
settings:readsuppressions list und get
settings:writesuppressions add und remove sowie contacts block und unblock
emails:readbroadcasts list, get, stats, list-recipients und get-recipient
emails:sendbroadcasts send, das auch audiences:read braucht, und broadcasts cancel
  • Ein Schlüssel, der auf bestimmte Adressen oder Domains beschränkt ist, liest und schreibt dasselbe Adressbuch wie jeder andere Schlüssel. Er sieht nur die Broadcasts, die von einer Adresse oder Domain gesendet wurden, die er umfasst, bekommt von list-people nur die gespeicherten Kontakte und wird mit 422 capability_unsupported abgelehnt von contacts list-threads, activity, block und unblock sowie von suppressions add und remove.
  • Eine Browser-Anmeldung eines Mitglieds, das nur einige Adressen erreicht, wird bei jedem contacts-, audiences- und broadcasts-Befehl mit 422 capability_unsupported abgelehnt. suppressions add lehnt eine Browser-Anmeldung von allen außer dem Eigentümer des Workspace ab.

Durchgerechnete Beispiele

Eine Zielgruppe aus einer Datei aufbauen und dann zählen, wen ein Broadcast an sie erreichen würde. import-contacts speichert die Adressen, die noch keine Kontakte sind, und ein erneuter Lauf legt nichts doppelt an und fügt nichts doppelt hinzu.

contacts.json
[  { "email": "[email protected]", "name": "Ada Lovelace" },  { "email": "[email protected]", "name": "Grace Hopper" },  { "email": "[email protected]" }]
Die Zielgruppe aufbauen und zählen
AUDIENCE=$(openemail audiences create --name 'Product updates' --json | jq -r .id)openemail audiences import-contacts "$AUDIENCE" --contacts @contacts.jsonopenemail broadcasts preview --audience-ids "$AUDIENCE"

Einen Broadcast mit --dry-run prüfen, das die Anfrage ausgibt und nichts sendet, und ihn dann senden. Der Broadcast wird sofort angelegt und im Hintergrund gesendet, fragen Sie also get ab, um ihn zu verfolgen. Dieser Body setzt {{unsubscribeUrl}} nicht ein, daher bekommt jede Kopie eine einzeilige Abmeldezeile am Ende.

broadcast.json
{  "audienceIds": ["aud_4c1b8e2a7d9f05c36b4e8a71"],  "from": "Acme <[email protected]>",  "subject": "{{firstName|Hello}}, the September release is out",  "html": "<p>Hi {{firstName|there}},</p><p>Here is what changed this month.</p>",  "scheduledAt": "2026-10-01T09:00:00Z"}
Den Broadcast prüfen, dann senden
openemail broadcasts send --data @broadcast.json --dry-runBROADCAST=$(openemail broadcasts send --data @broadcast.json --yes --json | jq -r .id)openemail broadcasts get "$BROADCAST"openemail broadcasts stats "$BROADCAST" --grain day

Sehen, wen ein Broadcast nicht erreicht hat. --ndjson gibt einen Empfänger pro Zeile aus, und --all --json ein Dokument mit jeder Seite.

Wen er nicht erreicht hat
openemail broadcasts list-recipients brd_5a8c1e3f7b2d94a06c8e1f3b --filter bounced --ndjson | jq -r .emailopenemail broadcasts list-recipients brd_5a8c1e3f7b2d94a06c8e1f3b --filter not_opened --all --json | jq ".items | length"openemail suppressions list --reason bounce --all --max 50

Die angemeldeten Mitglieder einer Zielgruppe in eine andere kopieren. jq macht aus dem Stream den Body, den add-contacts nimmt, und --data - liest ihn von stdin. --max 200 begrenzt ihn auf die 200 Adressen, die ein Aufruf annimmt.

Angemeldete Mitglieder kopieren
openemail audiences list-contacts aud_9f2c4b7e1a0d63d84c5f2e7b --statuses subscribed --max 200 --ndjson \  | jq -s '{ emails: map(.email) }' \  | openemail audiences add-contacts aud_1c4e7a9b2d0f36e85a7c1b4d --data -

Jeden Kontakt löschen, den der Composer bei einer Domain erfasst hat. delete-many nimmt bis zu 200 Adressen pro Aufruf, daher teilt xargs -n 200 eine längere Liste auf. Prüfen Sie die Stapel zuerst mit --dry-run, denn es gibt kein Rückgängig.

Nach Domain löschen
openemail contacts list --source auto --all --ndjson \  | jq -r 'select(.email | endswith("@old-vendor.example")) | .email' > leaving.txtxargs -n 200 openemail contacts delete-many --dry-run < leaving.txtxargs -n 200 openemail contacts delete-many --yes < leaving.txt

Das Senden an eine Adresse stoppen, eine wieder zulassen und einen Absender blockieren. removable sagt, welche Zeilen suppressions remove annimmt.

Sperren, zulassen und blockieren
openemail suppressions add --email [email protected]openemail suppressions list --q [email protected] --json | jq -r '.items[] | select(.removable) | .id'openemail suppressions remove 7b1e2c3d-4f5a-4b6c-8d7e-9f0a1b2c3d4e --yesopenemail contacts block [email protected]

Bestätigungen und Bestätigungscodes

Diese Befehle bitten in einem Terminal um Bestätigung, bevor sie laufen:

NamespaceBittet um Bestätigung
contactsdelete, delete-many, remove-photo und unblock
audiencesdelete, empty, remove-contact und remove-contacts
broadcastssend und cancel
suppressionsremove
  • --yes bestätigt für Sie. Unbeaufsichtigt, mit --json oder --no-input, in CI oder ohne Terminal, bricht ein Befehl, der fragen würde, mit Refusing to run unattended. Pass --yes to confirm. und Exit-Code 2 ab.
  • --dry-run gibt die Anfrage aus, die der Befehl senden würde, und endet mit Exit-Code 0, ohne zu fragen und ohne etwas zu ändern.
  • Mit einer Browser-Anmeldung fragt audiences delete zuerst nach einem Bestätigungscode, wie die Web-App. --yes überspringt ihn nie, und unbeaufsichtigt bricht der Befehl mit Exit-Code 4 ab. Führen Sie vorher openemail verify aus oder nutzen Sie einen API-Schlüssel, der nie gefragt wird.
  • audiences empty fragt nie nach einem Bestätigungscode, prüfen Sie also die ID, bevor Sie --yes übergeben.

Blättern

Jeder Befehl, der auflistet, liest eine Seite. Bleiben weitere, übergeben Sie den ausgegebenen Cursor an --cursor, mit denselben Filtern, oder lesen Sie alle:

  • --all liest jede Seite und streamt die Einträge: eine Tabelle in einem Terminal und ein JSON-Objekt pro Zeile, wenn weitergeleitet oder mit --ndjson.
  • --max <n> hört nach so vielen Einträgen auf und schließt --all ein.
  • --json gibt ein einziges { items, hasMore, nextCursor }-Dokument aus, auch mit --all.
  • Ein fehlerhafter oder veralteter Cursor ist ein 400 invalid_cursor. Beginnen Sie ohne ihn von vorn.
BefehlSeitengröße
openemail contacts list1 bis 200, 50, sofern --limit nichts anderes sagt
openemail contacts list-people1 bis 100, 25, sofern --limit nichts anderes sagt
openemail contacts list-threads1 bis 100, 25, sofern --limit nichts anderes sagt
openemail audiences list1 bis 100, 25, sofern --limit nichts anderes sagt
openemail audiences list-contacts1 bis 200, 50, sofern --limit nichts anderes sagt
openemail broadcasts list1 bis 100, 25, sofern --limit nichts anderes sagt
openemail broadcasts list-recipients1 bis 200, 50, sofern --limit nichts anderes sagt
openemail suppressions list1 bis 100, 25, sofern --limit nichts anderes sagt

Gut zu wissen

  • contacts create lehnt eine Adresse, die schon im Adressbuch steht, mit 409 contact_exists ab, sodass eine Wiederholung nie einen Namen überschreibt, den jemand bearbeitet hat. contacts save lehnt nie ab: Es speichert, behält oder holt die Adresse zurück, egal in welchem Zustand sie ist.
  • contacts delete nimmt auch eine Adresse, die nur in Mail vorkam, und nimmt diese Person damit aus list-people. Die Mail bleibt. Es gibt kein Rückgängig: Wird die Adresse erneut gespeichert, entsteht ein Kontakt ohne Namen, ohne Notizen und ohne Zielgruppe außer der Standard-Zielgruppe.
  • Die Adresse ist die Identität eines Kontakts, daher kann contacts update sie nicht ändern. Einen Kontakt zu verschieben ist ein delete und ein create.
  • contacts set-photo liest das Bild aus einer Datei oder über stdin mit -. Übergeben Sie --content-type, etwa image/jpeg: Ohne kann das Bild als application/octet-stream gehen, was der Server mit 422 invalid_image ablehnt.
  • broadcasts send --scheduled-at nimmt eine ISO-8601-Zeit wie 2026-10-01T09:00:00Z oder eine ISO-8601-Dauer wie PT2H oder P1D, bis zu 365 Tage in die Zukunft. Die kurzen Verzögerungen, die send --at nimmt, etwa 2h, werden hier abgelehnt.
  • Seriendruckfelder funktionieren in --subject, --html und --text: {{firstName}}, {{lastName}}, {{name}}, {{email}} und {{unsubscribeUrl}}, jeweils mit einem Ersatzwert nach einem senkrechten Strich, wie in {{firstName|there}}. Ein Body, der {{unsubscribeUrl}} nicht einsetzt, bekommt eine einzeilige Abmeldezeile am Ende. Eine Vorlage wird unverändert gesendet, setzen Sie den Link also in die Vorlage.
  • Ein Broadcast wird mit den monatlichen Versänden des Tarifs abgeglichen, bevor irgendetwas geschrieben wird, und jede Kopie zählt als ein Versand. Einer, den das Kontingent nicht abdecken kann, wird mit 429 send_quota_exceeded abgelehnt, und nichts bleibt zurück.
  • Übergeben Sie Ihren eigenen --idempotency-key an broadcasts send, wenn ein Skript den Schritt erneut ausführen könnte. Derselbe Schlüssel antwortet mit dem Broadcast, den er angelegt hat, statt einen neuen zu senden.
  • Ein Kontakt, der sich von einem Broadcast abmeldet, bleibt mit gesetztem unsubscribedAt in der Zielgruppe, und spätere Broadcasts an diese Zielgruppe überspringen ihn. audiences list-contacts --statuses unsubscribed listet sie auf.
  • Ein Hard Bounce bleibt auf der Sperrliste. suppressions remove lehnt ihn mit 409 suppression_not_removable ab, und removable sagt das bei jeder Zeile im Voraus.

Der Posteingang,
nach eigenen Regeln.

E-Mail-Infrastruktur für Unternehmen, KI, Agenten und persönliche E-Mail. Gebaut für Skalierung, Privatsphäre und Kontrolle. Alles, was E-Mail vom ersten Tag an hätte haben sollen.

OpenEmail

E-Mail-Infrastruktur für Unternehmen, KI, Agenten und persönliche E-Mail. Gebaut für Skalierung, Privatsphäre und Kontrolle. Alles, was E-Mail vom ersten Tag an hätte haben sollen.

© 2026 OpenEmail. Alle Rechte vorbehalten.