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.
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:
{"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}}| Feld | Was sie enthält |
|---|---|
| type | Der Fehlertyp der API, oder cli_error, network_error oder internal_error für einen Fehler in der CLI |
| code | Ein stabiler Code wie insufficient_scope, not_signed_in oder unknown_flag |
| message | Was schiefging, in einem Satz |
| hint, next | Was Sie versuchen können, und der nächste auszuführende Befehl, oder null |
| status, requestId, param, docUrl | Von der API, wenn der Fehler von ihr kam, sonst null |
| exitCode | Der 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.
openemail contacts list --all > contacts.ndjsonopenemail emails list --status failed --all --max 500 | jq -r .idExit-Codes
| Code | Bedeutung |
|---|---|
| 0 | Erledigt |
| 1 | Ein unerwarteter Fehler, ein Serverfehler oder ein fehlgeschlagener Versand |
| 2 | Ein 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 |
| 3 | Nicht angemeldet, oder die Anmeldung wurde abgelehnt, ist abgelaufen oder wurde abgemeldet, während der Befehl lief |
| 4 | Nicht 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 |
| 5 | Nicht gefunden |
| 6 | Ein Konflikt mit dem aktuellen Zustand |
| 7 | Die Eingabe war ungültig |
| 8 | Ratenbegrenzt, oder das KI-Kontingent ist aufgebraucht |
| 9 | Das Netzwerk ist ausgefallen oder hat das Zeitlimit überschritten |
| 10 | Abgebrochen: Sie haben eine Bestätigung oder Eingabe abgelehnt |
| 130, 143 | Mit Strg+C oder durch SIGTERM beendet |
Umgebungsvariablen
| Variable | Was es tut |
|---|---|
| OPENEMAIL_API_KEY | Ein API-Schlüssel, der statt jedes gespeicherten Profils genutzt wird |
| OPENEMAIL_PROFILE | Das zu nutzende gespeicherte Profil |
| OPENEMAIL_BASE_URL | Der 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_URL | Der Ursprung der Web-App, für die Anmeldung, open und Links in die Dokumentation |
| OPENEMAIL_CONFIG_DIR | Wo Profile und Postfach-Tokens liegen, ~/.openemail, wenn nicht gesetzt |
| OPENEMAIL_NO_UPDATE_CHECK | Nie bei npm nach einem neueren Release sehen. OPENEMAIL_DISABLE_UPDATE_NOTICE bewirkt dasselbe |
| NO_COLOR, FORCE_COLOR=0 | Keine Farbe |
| CI | Nie fragen, nie einen Browser öffnen, nie nach Updates sehen. Die meisten CI-Dienste werden auch ohne sie erkannt |
| VISUAL, EDITOR | Der 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
2ab und nennt das zu übergebende Flag. - Ein destruktiver Befehl bricht mit
Refusing to run unattended. Pass --yes to confirm.und Exit-Code2ab, außer Sie übergeben--yes. - Eine Änderung, die einen Bestätigungscode braucht, bricht mit Exit-Code
4ab, weil niemand ihn eingeben kann. Nutzen Sie einen API-Schlüssel oder führen Sie zuerstopenemail verifyaus.
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.
- 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 }}"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 --yesfailed=$(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.