Zur Dokumentation springen
CLI

Authentifizierung

Mit dem Browser oder einem API-Schlüssel anmelden, mehrere Profile führen und vor einer heiklen Änderung einen Code bestätigen.

Zwei Arten der Anmeldung

Führen Sie openemail login in einem Terminal aus, und es fragt, welche Art Sie möchten. In beiden Fällen wird die Anmeldung als Profil gespeichert, und jeder spätere Befehl nutzt das aktive.

BefehlHandelt alsBestätigungscodes
openemail loginSie, im Workspace und mit dem Zugriff, den Sie freigebenWird vor einigen heiklen Änderungen gefragt
openemail login --with-tokenDer Workspace, mit den Scopes des SchlüsselsNie gefragt
  • Nur eine Browser-Anmeldung kann ai compose, ai summarize und die MCP-Befehle nutzen.
  • Eine Browser-Anmeldung gilt, bis die gewählte Freigabe abläuft oder Sie sich abmelden. Ein Schlüssel funktioniert, bis er widerrufen wird.

Browser-Anmeldung

  1. openemail login registriert für diese Anmeldung eine neue App namens OpenEmail CLI on <your computer> und öffnet die Freigabeseite von OpenEmail in Ihrem Browser. Öffnet sich der Browser nicht, nutzen Sie den ausgegebenen Link.
  2. Melden Sie sich bei Bedarf an und wählen Sie dann den Workspace, den Zugriff der CLI (lesen, lesen und senden, voll oder eigene Berechtigungen), die Domains oder Adressen, die sie erreicht, und wie lange die Freigabe gilt.
  3. Geben Sie frei. Der Browser reicht die Freigabe von selbst an das Terminal zurück, und Sie können den Tab schließen. Die CLI zeigt, als wer Sie angemeldet sind, den Workspace und wann die Freigabe abläuft.
Terminal
openemail loginopenemail login --scopes emails:send,threads:readopenemail login --profile work
  • Die CLI wartet 10 Minuten auf Ihre Freigabe. Wählen Sie auf der Freigabeseite Nicht jetzt, wird die Anmeldung mit Exit-Code 10 abgebrochen.
  • --scopes wählt Berechtigungen auf der Freigabeseite vor, und Sie können sie dort noch ändern.
  • Hat das Profil schon eine Anmeldung, fragt ein Terminal, bevor es sie ersetzt. Unbeaufsichtigt lehnt es ab, außer Sie übergeben --force oder --yes. Das Ersetzen einer Browser-Anmeldung widerruft die alte.

Jede Browser-Anmeldung ist eine eigene verbundene App, aufgeführt unter Konto → Verbundene Apps mit dem freigegebenen Zugriff, wo Sie ihn ändern oder die App entfernen können. openemail open apps öffnet diese Seite.

Darunter liegt der OAuth-Ablauf, den der MCP-Server nutzt: ein öffentlicher Client mit PKCE, ein einmaliger Code und ein Zugriffstoken, das eine Stunde gilt und für Sie erneuert wird. Der Browser kehrt zu 127.0.0.1 auf einem zufälligen Port zurück, und dort wird nur der Code dieser Anmeldung angenommen.

Über SSH oder ohne Browser

Kann die CLI auf diesem Rechner keinen Browser öffnen, gibt sie stattdessen den Link aus: über SSH, in CI, unter Linux ohne Display oder wenn Sie --no-browser übergeben. Öffnen Sie den Link in einem Browser auf einem beliebigen Gerät und geben Sie frei. Die Seite zeigt dann einen Anmeldecode, den Sie ins Terminal einfügen.

Terminal
$ openemail login --no-browserOpen this link in a browser on any device to sign in:  https://api.openemail.uk/auth/mcp/authorize?response_type=code&client_id=…Paste the code from your browser
  • Ein Code gilt nur für die Anmeldung, die den Link ausgegeben hat, ein Code aus einem anderen Tab wird also abgelehnt.
  • Die ganze Adresse einzufügen, bei der der Browser gelandet ist, funktioniert auch.
  • Ohne Terminal leiten Sie den Code über stdin ein.

API-Schlüssel

Ein API-Schlüssel meldet ein Skript ohne Browser an und wird nie nach einem Code gefragt. Erstellen Sie einen unter Einstellungen → API-Schlüssel (openemail open api-keys) mit nur den Scopes, die das Skript braucht. Die CLI prüft den Schlüssel mit GET /keys/self, bevor sie ihn speichert, und nimmt Schlüssel mit oe_live_ und oe_test_. Mit einem Testschlüssel gesendete Mail wird nie zugestellt.

Terminal
openemail login --with-token < ~/.config/openemail/keyecho "$OPENEMAIL_KEY" | openemail login --with-token --profile ciopenemail login --token oe_live_…

--token funktioniert auch, aber der Schlüssel landet in Ihrer Shell-Historie, daher warnt die CLI und schlägt --with-token vor. Zwei Wege nutzen einen Schlüssel, ohne ihn zu speichern:

  • OPENEMAIL_API_KEY in der Umgebung wird von jedem Befehl genutzt, der sie sieht, vor jedem gespeicherten Profil.
  • --api-key <key> wird für diesen einen Befehl genutzt.

Gibt es mehr als eine Anmeldeinformation, gewinnt die erste von diesen: --api-key, OPENEMAIL_API_KEY, das mit --profile benannte Profil, das mit OPENEMAIL_PROFILE benannte Profil, dann das aktive Profil.

Profile

Ein Profil ist eine gespeicherte Anmeldung, von beiderlei Art. Das erste heißt default. Melden Sie weitere mit --profile an und wechseln Sie zwischen ihnen:

Terminal
openemail login --profile workopenemail profile listopenemail profile use workopenemail inbox --profile defaultOPENEMAIL_PROFILE=work openemail statusopenemail profile currentopenemail profile remove work
  • profile list zeigt jedes Profil mit Art, Workspace und Benutzer oder Schlüssel und markiert das aktive. Sein JSON enthält nie ein Token oder einen Schlüssel.
  • profile current gibt nur den Namen auf stdout aus, sodass $(openemail profile current) in einem Skript funktioniert.
  • profile remove <name> ist dasselbe wie openemail logout --profile <name>.
  • Ein Profilname hat bis zu 64 Buchstaben, Ziffern, Punkte, Bindestriche und Unterstriche.
  • profile use heißt auch profile switch. Wenn Sie das aktive Profil entfernen oder sich davon abmelden, ist kein Profil mehr aktiv, und der nächste Befehl, der eine Anmeldung braucht, verweist auf openemail profile use <name>.

Mit welcher API eine Anmeldung spricht

Ein gespeichertes Profil merkt sich die API, bei der es sich angemeldet hat, und seine Anmeldedaten werden nur dorthin gesendet. Ein --base-url oder OPENEMAIL_BASE_URL, das einen anderen Ursprung nennt, bricht den Befehl mit Exit-Code 2 ab, bevor etwas gesendet wird, und sagt, wie Sie sich bei diesem Ursprung mit einem eigenen Profil anmelden.

Terminal
openemail login --profile other --base-url https://api.example.comopenemail inbox --profile other
  • Ein Schlüssel aus OPENEMAIL_API_KEY oder --api-key ist kein gespeichertes Profil. Er geht daher an den Ursprung in --base-url oder OPENEMAIL_BASE_URL, oder an https://api.openemail.uk, wenn keins von beiden gesetzt ist.
  • Befehle, die keine Anmeldedaten senden, folgen --base-url und OPENEMAIL_BASE_URL, egal welches Profil aktiv ist: Wegwerf-Postfächer, Methoden, die keinen Schlüssel brauchen, docs und open.
  • Einfaches http wird für jeden Ursprung außer localhost, 127.0.0.1 und ::1 mit Exit-Code 2 abgelehnt: für die API, die Web-App, die Anmelde-, Token- und Widerrufsanfragen und den MCP-Server. Verwenden Sie für alles andere https.
  • Ein Anfragepfad, der den API-Ursprung verlassen würde, etwa openemail api //example.com/x, bricht mit Exit-Code 2 und invalid_path ab, bevor etwas gesendet wird.

Was die Anmeldungen nicht können

Eine Browser-Anmeldung handelt als Sie, aber manches wird für eine App nie freigegeben, egal welchen Zugriff Sie wählen:

  • API-Schlüssel verwalten. keys:write und keys:manage werden nie gewährt, daher braucht das Anlegen, Rotieren und Widerrufen von Schlüsseln einen API-Schlüssel mit keys:manage oder die Web-App. openemail me rotate rotiert den Schlüssel, mit dem Sie aufrufen, braucht also einen API-Schlüssel.
  • Abrechnung und die Workspaces selbst. Tarife, Rechnungen sowie das Anlegen, Wechseln oder Löschen eines Workspace bleiben in der Web-App.
  • Ihre kostenlose Adresse. Eine App wird für einen Business-Workspace freigegeben, und der persönliche Workspace mit der kostenlosen Adresse wird nie angeboten, nach derselben Regel wie in der API.
  • Mitglieder und Rollen, außer die Freigabe umfasst den ganzen Workspace. members:write und roles:write fallen bei einer Freigabe weg, die auf einige Domains oder Adressen beschränkt ist.

Ein API-Schlüssel hat eine eigene Grenze. ai compose, ai summarize und jeder openemail mcp-Befehl außer config laufen über den MCP-Server, der eine Browser-Anmeldung braucht, mit einem Schlüssel brechen sie also mit Exit-Code 4 ab und sagen, warum.

Bestätigungscodes

Mit einer Browser-Anmeldung fragen einige Änderungen zuerst nach einem Bestätigungscode, wie in der Web-App. Die CLI fragt, wenn sie einen braucht: Sie schickt Ihnen einen sechsstelligen Code per E-Mail oder fragt, wenn die Zwei-Faktor-Anmeldung aktiv ist, nach einem Code aus Ihrer Authenticator-App oder einem Ihrer Backup-Codes. Ist der Code richtig, läuft der Befehl, und diese Anmeldung wird 60 Minuten lang nicht mehr gefragt. Ein API-Schlüssel wird nie gefragt.

BefehlFragt nach einem Code
webhooks create, updateImmer
rules create, updateImmer
roles update, deleteImmer
members add, update, removeImmer
members grant-address, revoke-addressImmer
domains delete, delete-addressImmer
audiences deleteFür eine Zielgruppe, die Sie angelegt haben
audiences emptyFür eine selbst angelegte Zielgruppe, die noch Kontakte enthält
mcp call createRule, setRuleEnabledImmer
mcp call removeDomain, removeDomainAddressImmer
mcp call deleteAudience, emptyAudienceWie der passende Zielgruppen-Befehl
apiWenn die aufgerufene Operation eine der obigen ist
Terminal
$ openemail webhooks create --url https://acme.com/hooks/openemailWe emailed a code to a•••@acme.com.Verification code: 482913Verified. You will not be asked again for 60 minutes.
  • Tippen Sie r an der Eingabeaufforderung, um die E-Mail erneut senden zu lassen. Ein falscher Code sagt, wie viele Versuche bleiben.
  • Nachdem der Code angenommen ist, läuft der Befehl noch einmal, nie zweimal.
  • --yes bestätigt ein Löschen, überspringt aber nie einen Code.
  • Unbeaufsichtigt (mit --json oder --no-input, in CI oder ohne Terminal) kann niemand den Code eingeben, daher bricht der Befehl mit Exit-Code 4 ab und ändert nichts.
  • Ein Code erlaubt 5 Versuche, und nach dem fünften falschen bietet die CLI einen neuen Code an. Jede Anmeldung kann 5 Codes pro Stunde und 20 pro Tag anfordern.
  • Zehn falsche Codes für eine Anmeldung innerhalb von 24 Stunden pausieren ihre Bestätigung. Die CLI sagt dann, wann es weitergeht, und bricht mit Exit-Code 4 und step_up_paused ab, ohne einen weiteren Code anzubieten, und die E-Mail, die das erklärt, nennt die App.

Führen Sie openemail verify aus, bevor ein Skript oder ein KI-Client etwas Heikles tut. Es fragt jetzt nach dem Code, und in den nächsten 60 Minuten läuft jeder Befehl dieses Profils ohne einen, einschließlich openemail mcp call und der lokalen MCP-Brücke.

Terminal
openemail verifyopenemail verify --statusopenemail verify --status --jsonopenemail verify --force

Die 60 Minuten gehören zu einer Anmeldung. Ein anderes Profil oder ein KI-Client, der sich selbst angemeldet hat, wird nach einem eigenen Code gefragt, und Abmelden beendet sie sofort. --force fordert einen neuen Code an und startet frische 60 Minuten.

Ablauf, Abmeldung und Widerruf

  • Das Zugriffstoken hinter einer Browser-Anmeldung gilt eine Stunde. Die CLI erneuert es, bevor es abläuft, und speichert das neue, sodass Sie davon nichts merken.
  • Jedes Refresh-Token funktioniert genau einmal. Wird ein altes mehr als 30 Sekunden, nachdem die CLI es ersetzt hat, benutzt, etwa aus einer Kopie von config.json auf einem anderen Rechner, widerruft der Server diese Anmeldung vollständig. Melden Sie sich also auf jedem Rechner an, statt die Datei zu kopieren.
  • Die Freigabe gilt so lange, wie Sie es auf der Freigabeseite gewählt haben. Endet sie oder wird die App unter Konto → Verbundene Apps entfernt, kann die CLI nicht mehr für Sie handeln und bittet Sie, erneut openemail login auszuführen.
  • openemail logout widerruft eine Browser-Anmeldung auf dem Server, was sie aus den verbundenen Apps entfernt, und vergisst sie dann auf diesem Gerät, auch wenn der Server nicht erreichbar ist. --all meldet jedes Profil ab.
  • Die Abmeldung eines API-Schlüssels vergisst ihn nur hier. Der Schlüssel funktioniert weiter, bis Sie ihn widerrufen, mit openemail keys revoke <id> oder in der Web-App.

Wo Anmeldungen aufbewahrt werden

Alles liegt in ~/.openemail oder in dem Ordner, den OPENEMAIL_CONFIG_DIR nennt. Der Ordner ist nur für Sie lesbar (0700), ebenso jede Datei darin (0600). Jede Datei wird in eine temporäre Datei geschrieben und an ihren Platz umbenannt, sodass ein Absturz nie eine halbe hinterlässt, und jede Änderung geschieht unter einer Sperrdatei, sodass parallel laufende Befehle nie ein Profil verlieren.

DateiWas sie enthält
config.jsonIhre Profile: API-Schlüssel, Zugriffs- und Refresh-Token und welches Profil aktiv ist
temp-mail.jsonDie Wegwerf-Postfächer, die diese CLI angelegt hat, mit ihren Postfach-Tokens
update-check.jsonWann npm zuletzt nach einem neuen Release gefragt wurde, und was es antwortete

Tokens und Schlüssel liegen als Klartext in Dateien, die nur Ihr Benutzer lesen kann, behandeln Sie den Ordner also wie einen SSH-Schlüssel. Eine Datei, mit der die CLI nichts anfangen kann, gilt nie stillschweigend als abgemeldet: Sie warnt einmal mit dem Pfad und legt eine Kopie daneben (config.json.bak), bevor sie eine neue schreibt. Eine Datei, die sie gar nicht lesen kann, etwa wegen ihrer Berechtigungen, bricht den Befehl mit einem Fehler ab, der sie nennt.

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.