Zur Dokumentation springen
CLI

Skripte

JSON-Ausgabe, Streams, Exit-Codes, Umgebungsvariablen und unbeaufsichtigte Läufe oder CI.

JSON-Ausgabe

Mit --json enthält stdout nur JSON, mit zwei Leerzeichen eingerückt, während Hinweise und Fortschritt auf stderr bleiben, und nichts fragt nach. Eine Liste gibt { items, hasMore, nextCursor } aus, ein API-Objekt so, wie die API es lieferte, und ein handgeschriebener Befehl das Objekt, das seine Hilfe beschreibt.

Terminal
openemail whoami --json | jq -r .workspaceIdopenemail emails list --status failed --json | jq -r ".items[].id"

Ein Fehler geht als eine Zeile JSON auf stderr, und der Exit-Code ist derselbe, den eine Person bekäme:

stderr
{"error":{"type":"permission_error","code":"insufficient_scope","message":"This API key does not have the domains:write scope.","hint":"The credential is missing a scope this call needs. Use a key that has it, or sign in again with openemail login.","next":null,"status":403,"requestId":"req_7Hc2kQ","param":null,"docUrl":"https://openemail.uk/docs/api/errors#insufficient_scope","exitCode":4}}
FeldWas sie enthält
typeDer Fehlertyp der API, oder cli_error, network_error oder internal_error für einen Fehler in der CLI
codeEin stabiler Code wie insufficient_scope, not_signed_in oder unknown_flag
messageWas schiefging, in einem Satz
hint, nextWas Sie versuchen können, und der nächste auszuführende Befehl, oder null
status, requestId, param, docUrlVon der API, wenn der Fehler von ihr kam, sonst null
exitCodeDer Exit-Code, mit dem der Prozess endet

Streams

Manche Ausgabe ist ein Strom von JSON-Objekten, eines pro Zeile, sodass eine Pipeline jeden Eintrag verarbeiten kann, sobald er ankommt:

  • Eine Ressourcenliste mit --all, wenn stdout kein Terminal ist, oder mit --ndjson. --max <n> hört nach so vielen Einträgen auf.
  • openemail temp watch --json, eine Zeile pro neuer Nachricht.
  • openemail mcp serve, eine JSON-RPC-Nachricht pro Zeile in jede Richtung.
Terminal
openemail contacts list --all > contacts.ndjsonopenemail emails list --status failed --all --max 500 | jq -r .id

Exit-Codes

CodeBedeutung
0Erledigt
1Ein unerwarteter Fehler, ein Serverfehler oder ein fehlgeschlagener Versand
2Ein Nutzungsfehler: ein falsches Argument, ein unbekannter Befehl oder ein unbekanntes Flag, ein Wert oder eine Bestätigung, nach der nicht gefragt werden konnte, oder ein Ursprung oder Pfad, an den die CLI keine Anmeldedaten sendet
3Nicht angemeldet, oder die Anmeldung wurde abgelehnt, ist abgelaufen oder wurde abgemeldet, während der Befehl lief
4Nicht erlaubt: ein fehlender Scope oder eine fehlende Berechtigung, ein Bestätigungscode, nach dem nicht gefragt werden konnte oder der pausiert ist, oder ein API-Schlüssel, wo eine Browser-Anmeldung nötig ist
5Nicht gefunden
6Ein Konflikt mit dem aktuellen Zustand
7Die Eingabe war ungültig
8Ratenbegrenzt, oder das KI-Kontingent ist aufgebraucht
9Das Netzwerk ist ausgefallen oder hat das Zeitlimit überschritten
10Abgebrochen: Sie haben eine Bestätigung oder Eingabe abgelehnt
130, 143Mit Strg+C oder durch SIGTERM beendet

Umgebungsvariablen

VariableWas es tut
OPENEMAIL_API_KEYEin API-Schlüssel, der statt jedes gespeicherten Profils genutzt wird
OPENEMAIL_PROFILEDas zu nutzende gespeicherte Profil
OPENEMAIL_BASE_URLDer API-Ursprung für OPENEMAIL_API_KEY, --api-key und Befehle, die keine Anmeldedaten senden. Eine gespeicherte Anmeldung geht nur an die API, bei der sie sich angemeldet hat
OPENEMAIL_APP_URLDer Ursprung der Web-App, für die Anmeldung, open und Links in die Dokumentation
OPENEMAIL_CONFIG_DIRWo Profile und Postfach-Tokens liegen, ~/.openemail, wenn nicht gesetzt
OPENEMAIL_NO_UPDATE_CHECKNie bei npm nach einem neueren Release sehen. OPENEMAIL_DISABLE_UPDATE_NOTICE bewirkt dasselbe
NO_COLOR, FORCE_COLOR=0Keine Farbe
CINie fragen, nie einen Browser öffnen, nie nach Updates sehen. Die meisten CI-Dienste werden auch ohne sie erkannt
VISUAL, EDITORDer Editor, den send und reply für einen Body öffnen

Unbeaufsichtigte Läufe

Die CLI fragt nur nach, wenn stdin und stdout beide Terminals sind und weder --json noch --no-input noch CI zutrifft. Sonst gilt:

  • Ein fehlender Pflichtwert bricht mit Exit-Code 2 ab und nennt das zu übergebende Flag.
  • Ein destruktiver Befehl bricht mit Refusing to run unattended. Pass --yes to confirm. und Exit-Code 2 ab, außer Sie übergeben --yes.
  • Eine Änderung, die einen Bestätigungscode braucht, bricht mit Exit-Code 4 ab, weil niemand ihn eingeben kann. Nutzen Sie einen API-Schlüssel oder führen Sie zuerst openemail verify aus.

In CI

Geben Sie dem Job einen API-Schlüssel mit nur den nötigen Scopes, bewahren Sie ihn in einem Secret auf und lassen Sie OPENEMAIL_API_KEY ihn tragen. Nichts wird gespeichert, nichts fragt nach, und keine Update-Prüfung läuft.

.github/workflows/deploy.yml
- name: Tell the team  env:    OPENEMAIL_API_KEY: ${{ secrets.OPENEMAIL_API_KEY }}  run: |    npx -y @openemail/[email protected] send \      --from [email protected] \      --to [email protected] \      --subject "Deployed ${{ github.sha }}" \      --text "Build ${{ github.run_number }} is live." \      --idempotency-key "deploy-${{ github.run_id }}"
Auf eine Registrierungs-E-Mail warten
ADDRESS=$(npx -y @openemail/[email protected] temp new --ttl 15)./signup-test.sh "$ADDRESS"npx -y @openemail/[email protected] temp watch --first --json | jq -r .snippetnpx -y @openemail/[email protected] temp delete --yes
Bei fehlgeschlagenen Sendungen scheitern
failed=$(openemail emails list --status failed --json | jq ".items | length")test "$failed" -eq 0

Übergeben Sie --idempotency-key bei einem Versand, den eine Pipeline wiederholen könnte, und leiten Sie ihn von dem ab, was den Versand nötig machte, etwa einer Run-ID. Ein erneuter Lauf des Schritts liefert dann den ersten Versand zurück, statt doppelt zu mailen.

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.