Zur Dokumentation springen
CLI

Domains und Adressen

Domains hinzufügen und verifizieren, die nötigen DNS-Einträge lesen, die Adressen darauf verwalten und prüfen, als wer Sie senden können.

Überblick

Zwei Namespaces decken Ihre Domains ab. openemail domains verwaltet die Domains des Workspace: sie hinzufügen und entfernen, die DNS-Einträge, die jede braucht, ob sie empfangen und senden kann, ihren Catch-all, ihre Tracking- und Datei-Domain und die Adressen darauf. openemail addresses beantwortet eine engere Frage: als welche Adressen der Schlüssel oder die Anmeldung, die Sie nutzen, senden darf.

  • Ein Domain-Befehl nimmt die Domain-ID, eine UUID aus domains list oder domains create. Der Hostname wird an ihrer Stelle nicht angenommen, openemail domains get acme.com ist also ein 404 und endet mit Exit-Code 5.
  • Ein Adressbefehl nimmt die Domain-ID und dann die Adress-ID, eine UUID aus domains list-addresses oder domains create-address.
  • domain und address funktionieren auch als Namespace-Namen. Die Domain-Verben hören auf die üblichen Aliasse wie ls, show, new, edit und rm, ebenso addresses list. Die fünf Verben für die Adressen einer Domain, etwa create-address, haben keine.
  • openemail <command> --help listet jedes Argument und Flag mit seinem Typ, dem Scope, den der Aufruf braucht, Methode und Pfad und dem, was zurückkommt. Fügen Sie --json hinzu, um dieselbe Seite als Daten zu erhalten.

Alle Befehle

BefehlWas es tut
openemail domains listDie Domains des Workspace alphabetisch auflisten, mit ihrem Stand bei Empfang, Versand, Tracking und Dateien
openemail domains get <id>Eine Domain lesen, mit ihren Adressen, jedem DNS-Eintrag, den sie nutzt, und ob er gefunden wurde, sowie ihrer DMARC-Auswertung
openemail domains create --domain <value>Eine Domain hinzufügen. Die Antwort enthält jeden zu veröffentlichenden DNS-Eintrag, bereits einmal geprüft
openemail domains verify <id>Das DNS der Domain sofort prüfen und die Domain so zurückgeben, wie die Prüfung sie hinterlassen hat
openemail domains update <id>Den Catch-all ein- oder ausschalten und die Tracking-Domain und die Datei-Domain setzen oder entfernen
openemail domains delete <id>Die Domain und jede Adresse darauf entfernen. Fragt nach einer Bestätigung
openemail domains list-addresses <id>Die Adressen einer Domain auflisten, mit ihren IDs, Bezeichnungen, ihrem Aktivierungsstatus und wann jede zuletzt Mail empfangen hat
openemail domains create-address <id> --local-part <value>Eine Adresse auf der Domain anlegen, aktiviert, mit optionalem --label
openemail domains get-address <id> <address-id>Eine Adresse auf einer Domain lesen
openemail domains update-address <id> <address-id>Eine Adresse mit --label umbenennen oder sie mit --no-enabled und --enabled aus- und einschalten
openemail domains delete-address <id> <address-id>Eine Adresse von ihrer Domain entfernen. Fragt nach einer Bestätigung
openemail addresses listDie Adressen auflisten, als die Sie mit diesem Schlüssel oder dieser Anmeldung senden dürfen, und den Empfangs- und Versandstatus jeder Domain

Jedes Flag steht in der Hilfe seines Befehls, zum Beispiel openemail domains update --help oder openemail domains create-address --help.

Empfang und Versand

Eine Domain meldet zwei voneinander unabhängige Tatsachen. receiving.verified ist true, sobald das öffentliche DNS mit ihren MX-Einträgen und ihrem TXT-Eintrag _openemail-challenge antwortet, und von da an empfängt sie Mail. sending.status ist der Signierstatus, wie ihn die letzte Prüfung gesehen hat: verified, pending, failed, no_identity oder unknown. sending.canSend sagt, ob ein Versand von der Domain gerade angenommen würde, und ein negatives Urteil, das älter als ein Tag ist, gilt als unbekannt, ein Skript sollte also nach canSend verzweigen statt nach status. Solange es false ist, wird ein Versand von der Domain mit 409 domain_not_sendable abgelehnt.

  • domains create führt die erste DNS-Prüfung während des Aufrufs aus, daher trägt jeder Eintrag in records bereits einen status: found, missing oder null, wenn er noch nicht geprüft wurde. Veröffentlichen Sie jeden Eintrag genau wie angegeben, denn die Werte sind spezifisch für die Domain.
  • domains verify prüft sofort. Innerhalb von 10 Sekunden nach der letzten Prüfung prüft es nichts Neues und gibt die Domain so zurück, wie sie ist. Bei einer verifizierten Domain prüft es die Signiereinträge erneut, sodass sending aktuell ist.
  • domains get prüft bei einer nicht verifizierten Domain erneut, wenn die letzte Prüfung mehr als 20 Sekunden zurückliegt, daher funktioniert auch das Abfragen mit get, und es braucht nur domains:read, wo verify domains:write braucht.
  • Ein gerade veröffentlichter Eintrag kann einige Minuten brauchen, bis er im öffentlichen DNS erscheint.

In einem Terminal geben get, create und verify ein Feld pro Zeile aus, mit verschachtelten Blöcken wie receiving, sending und records als kompaktem JSON. Fügen Sie --json hinzu und lesen Sie sie mit einem Tool wie jq, wie es die Beispiele unten tun.

Catch-all, Tracking- und Datei-Domains

domains update ändert drei Einstellungen, die nicht voneinander abhängen. Ein Flag, das Sie weglassen, bleibt unberührt, und ganz ohne Flags kommt die Domain unverändert zurück.

FlagWas es ändert
--catch-all, --no-catch-allEingeschaltet nimmt er Mail an jede Adresse der Domain an, die niemand angelegt hat, und die Adresse erscheint ab ihrer ersten Nachricht in list-addresses. Ausgeschaltet lehnt er Mail an jede Adresse ab, die nicht von Hand angelegt wurde, auch an die, die der Catch-all vorher aufgefangen hat. Eine neue Domain startet mit eingeschaltetem Catch-all
--tracking-host <value>Eine Subdomain wie links.acme.com für getrackte Links und das Öffnungs-Pixel. null entfernt sie
--storage-host <value>Eine Subdomain wie files.acme.com für die Download-Links von Dateien, die von der Domain gesendet werden. null entfernt sie
  • Ein neuer Host wird im selben Aufruf gespeichert und geprüft. Veröffentlichen Sie einen CNAME-Eintrag mit dem Namen record.name und dem Wert record.value aus dem Block tracking oder storage der Antwort, mit ausgeschaltetem Proxying. Wird ein Host erneut eingerichtet, kann er einen anderen Wert bekommen, veröffentlichen Sie also den, den die neueste Antwort meldet.
  • Bis eine Prüfung besteht, steht der Host auf pending, und neue Mail behält den Standard-Host von OpenEmail. Sobald eine besteht, steht er auf active. OpenEmail prüft selbstständig weiter, und ein aktiver Host, der drei Prüfungen in Folge nicht besteht oder dessen letzte bestandene Prüfung 2 Stunden zurückliegt, steht auf failed, während neue Mail zum Standard-Host zurückkehrt.
  • Entfernen Sie einen Host mit null, wie in --tracking-host null. Ein leerer Wert wie --tracking-host= ist in der CLI ein Nutzungsfehler und endet mit Exit-Code 2.
  • Ein neuer Host braucht eine verifizierte Domain oder zumindest ihren veröffentlichten TXT-Eintrag _openemail-challenge. Andernfalls wird der Aufruf mit 409 domain_not_verified abgelehnt.
  • Die Flags gelten der Reihe nach: der Catch-all, dann die Tracking-Domain, dann die Datei-Domain. Ein späteres Flag, das abgelehnt wird, kann eine frühere Änderung gespeichert lassen, senden Sie sie also in getrennten Aufrufen, wenn jede für sich bestehen muss.

Adressen auf einer Domain

Eine Domain enthält die Adressen, die von Hand oder über die API angelegt wurden, und die, die ihr Catch-all aufgefangen hat, als zum ersten Mal Mail für sie ankam. list-addresses zeigt beide Arten, deaktivierte eingeschlossen. Der Catch-all selbst ist keine Zeile: Er ist receiving.catchAll an der Domain.

  • create-address nimmt --local-part, den Teil vor dem @, und ein optionales --label. Die Domain muss noch nicht verifiziert sein, aber die Adresse empfängt nichts, bis sie es ist. * allein wird abgelehnt, da so der Catch-all geschrieben wird.
  • Eine Adresse anzulegen, die schon existiert oder entfernt wurde, ist kein Fehler. Sie kommt aktiviert zurück, mit der gesendeten Bezeichnung oder ohne, und behält ihre ID. Eine vom Catch-all aufgefangene Adresse wird zu einer von Hand angelegten, sodass sie weiter empfängt, nachdem der Catch-all ausgeschaltet wurde.
  • Mit eingeschaltetem Catch-all startet eine neue Adresse mit den adressbezogenen Einstellungen des Catch-all, etwa seiner Signatur und seinem Tracking, abgesehen von den Datenschutzeinstellungen. Sie werden einmal kopiert und nicht synchron gehalten.
  • update-address --no-enabled hindert die Adresse daran, Mail anzunehmen, sodass Absender einen Bounce bekommen, und von ihr kann nichts gesendet werden. Sie behält ihre Mail, ihre Einstellungen und die Personen, die sie erreichen können, und --enabled macht dort weiter, wo sie aufgehört hat. --label benennt sie um, und --label null entfernt den Namen.
  • delete-address geht weiter. Mail an die Adresse wird selbst mit eingeschaltetem Catch-all abgelehnt, ihre Weiterleitung endet, ihre Einstellungen werden gelöscht, die Personen, denen Zugriff gewährt wurde, verlieren ihn, und ihre Passwort-Anmeldung wird widerrufen. Mail, die sie schon empfangen hat, bleibt im Postfach. Wird sie erneut angelegt, kommt dieselbe ID zurück, ohne die alten Einstellungen oder Zugriffe.

Als wer Sie senden können

openemail addresses list beantwortet die Frage hinter einem 403 from_address_forbidden: welche Adressen der Schlüssel oder die Anmeldung, mit der Sie aufrufen, in From setzen darf. Es braucht emails:send statt eines Lese-Scopes, weil es beschreibt, was ein Versand annehmen würde.

  • In einem Terminal gibt es zwei Tabellen aus: die Adressen, jeweils damit, ob sie aktiviert ist und ob Sie von ihr senden können, dann die Domains, jeweils damit, ob sie für Empfang und Versand verifiziert ist, und ihrem Catch-all.
  • unrestricted ist true, wenn die Anmeldedaten durch nichts eingeschränkt sind. Dann kann von jedem Local-Part auf den Domains des Workspace gesendet werden, auch von solchen, die niemand angelegt hat. Andernfalls ist canSend nur für eine aktivierte Adresse true, die die Anmeldedaten abdecken, über eine ganze Domain, die sie umfassen, oder über ihre eigene Adressliste.
  • canSend ist false für eine deaktivierte Adresse, für eine, die die Anmeldedaten nicht abdecken, und für eine, deren Domain noch nicht signieren kann.
  • Aufgelistet werden nur angelegte Adressen. Anmeldedaten, die eine ganze Domain umfassen, können trotzdem als jeder Local-Part darauf senden, und von einer Adresse auf ihrer Liste ohne Postfach dahinter kann gesendet werden, ohne dass sie hier erscheint.
  • Mit --json gibt es für eine Seite { unrestricted, addresses, domains, hasMore, nextCursor } aus und mit --all { unrestricted, addresses, domains }, statt des { items, hasMore, nextCursor }-Dokuments, das andere Listen ausgeben. Mit --all in einer Pipe oder mit --ndjson gibt es eine Adresse pro Zeile aus.

status, open und DNS-Anbieter

openemail status liest Ihre Anmeldung, addresses list und domains list gleichzeitig und gibt sie zusammen aus. Seine Tabelle Sender addresses zeigt jede Adresse damit, ob sie senden kann und ob sie aktiviert ist. Seine Tabelle Domains zeigt jede Domain als verified oder not verified für den Empfang, ihren Versandstatus und ihren Catch-all. Es zeigt jeweils die ersten 100 und nennt den --all-Befehl für den Rest.

  • Ein Teil, den Ihre Anmeldedaten nicht lesen dürfen, etwa die Domains ohne domains:read oder die Adressen ohne emails:send, zeigt Not available mit dem Grund, und der Rest wird trotzdem ausgegeben.
  • Gibt es noch keine Adressen, schlägt es openemail domains create --domain example.com vor.
  • openemail status --json gibt ein Objekt mit account, addresses, domains und unavailable aus, wobei unavailable den Grund für jeden Teil nennt, der nicht gelesen werden konnte.

Das Verknüpfen eines DNS-Anbieters, damit die Einträge einer neuen Domain für Sie geschrieben werden, geht in 0.0.2 nur in der Web-App. openemail open providers oder open dns öffnet diese Seite. open domains öffnet die Domains und ihre DNS-Einträge, und open addresses die Adressen. Weiterleitung ist ebenfalls in der Web-App, und open forwarding <address> öffnet sie für eine Adresse. --print gibt den Link aus, statt einen Browser zu öffnen.

Wo OpenEmail das DNS einer Domain selbst geschrieben hat, nimmt domains delete diese Einträge zurück und listet alle, bei denen das nicht gelang, in leftBehind, damit Sie sie bei Ihrem DNS-Anbieter entfernen. Einträge, die Sie selbst veröffentlicht haben, werden nie angefasst, entfernen Sie sie also ebenfalls, sobald die Domain weg ist.

Beispiele

Eine Domain hinzufügen und ihre Einträge veröffentlichen
openemail domains create --domain acme.com --json > acme.jsonjq -r '.records[] | [.type, .name, .value, (.priority // "")] | @tsv' acme.jsonopenemail domains verify "$(jq -r .id acme.json)"
Warten, bis sie empfängt, dann den Versand prüfen
id=b3e1f0a4-6c2d-4e8a-9f17-2d5c8a0b4e6funtil openemail domains get "$id" --json | jq -e .receiving.verified > /dev/null; do  sleep 30doneopenemail domains get "$id" --json | jq '.sending | {status, canSend, error}'
Den Catch-all ausschalten und eine Adresse behalten
openemail domains list-addresses "$id" --allopenemail domains create-address "$id" --local-part invoices --label Invoicesopenemail domains update "$id" --no-catch-all --dry-runopenemail domains update "$id" --no-catch-all

Wird invoices von Hand angelegt, empfängt es weiter, sobald der Catch-all aus ist, während Mail an jede andere vom Catch-all aufgefangene Adresse abgelehnt wird. Der Probelauf gibt das PATCH und seinen Body aus, ohne es zu senden.

Eine Tracking-Domain setzen und wieder entfernen
openemail domains update "$id" --tracking-host links.acme.com --json | jq '.tracking | {status, record, error}'openemail domains update "$id" --tracking-host null
Eine Adresse stilllegen
address_id=$(openemail domains list-addresses "$id" --all | jq -r 'select(.address == "[email protected]") | .id')openemail domains update-address "$id" "$address_id" --no-enabledopenemail domains delete-address "$id" "$address_id" --yes

Die Adresse zuerst auszuschalten lässt sich mit --enabled rückgängig machen. Das Löschen nicht, und in einem Skript braucht es --yes. Mit einer Browser-Anmeldung fragt es auch nach einem Bestätigungscode, den --yes nie überspringt.

Aus einem Skript prüfen
openemail domains list --all | jq -r 'select(.sending.canSend | not) | [.domain, .sending.status] | @tsv'openemail addresses list --all --json | jq -r '.addresses[] | select(.canSend) | .address'

Scopes, Bestätigungen und Fehler

ScopeBefehle
domains:readdomains list, get, list-addresses, get-address
domains:writedomains create, verify, update, delete, create-address, update-address, delete-address
emails:sendaddresses list
  • Eine Anmeldung oder ein Schlüssel ohne den Scope bricht mit Exit-Code 4 ab, nennt den fehlenden Scope und sagt, wie Sie ihn bekommen.
  • domains delete und domains delete-address bitten um Bestätigung. Eine Antwort mit Nein endet mit Exit-Code 10 und ändert nichts. Unbeaufsichtigt und ohne --yes brechen sie mit Exit-Code 2 ab, bevor etwas gesendet wird.
  • Mit einer Browser-Anmeldung fragen diese beiden Löschbefehle auch nach einem Bestätigungscode, wie die Web-App. Unbeaufsichtigt kann ihn niemand eingeben, daher bricht der Befehl mit Exit-Code 4 ab. Führen Sie zuerst openemail verify aus, dann brauchen die nächsten 60 Minuten keinen Code. Ein API-Schlüssel wird nie gefragt.
  • --dry-run gibt die Anfrage aus, die eine Änderung senden würde, mit ihrem Body, und endet mit Exit-Code 0, ohne sie zu senden oder um Bestätigung zu bitten.
  • Eine Liste liest eine Seite: --limit nimmt 1 bis 100, und der Server sendet 25, wenn es fehlt, und --cursor nimmt den nextCursor der vorigen Seite. --all liest jede Seite, --max <n> hört nach so vielen Einträgen auf, und --ndjson oder --all in einer Pipe gibt ein JSON-Objekt pro Zeile aus. Mit --json geben domains list und list-addresses ein einziges { items, hasMore, nextCursor }-Dokument aus.
  • Ein Schlüssel oder eine Anmeldung, die auf bestimmte Domains oder Adressen beschränkt ist, sieht trotzdem jede Domain und Adresse. Er kann keine Domain hinzufügen, und jede andere Änderung braucht die ganze Domain unter den Domains, die er umfasst, sonst wird der Aufruf mit 422 capability_unsupported abgelehnt.
  • Eine Ablehnung endet mit dem Code ihres Status: 4 für ein 403, etwa domain_allowance_reached, wenn der Tarif keine weiteren Domains erlaubt, 5 für ein 404, 6 für ein 409, etwa domain_already_added oder domain_claimed, und 7 für ein 422, etwa invalid_tracking_host oder workspace_limit_reached.
  • Die letzte Domain eines Workspace lässt sich nicht aus der CLI entfernen. Das ist ein 409 last_domain, weil das Entfernen das ganze Postfach löscht, was die Web-App zuerst bestätigen lässt. Eine Domain mit reservierten Kontoadressen ist ein 409 domain_holds_reserved_addresses.
  • domains create und die beiden Löschbefehle werden nach einem Netzwerkfehler nie wiederholt. Ein 409 domain_already_added oder ein 404 bei Ihrem eigenen zweiten Versuch nach einer verlorenen Antwort bedeutet, dass der erste funktioniert hat. verify, update, create-address und update-address werden von selbst wiederholt, da zweimaliges Senden dasselbe Ergebnis hinterlässt.

Wie es weitergeht

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.