Перейти к документации
CLI

Скрипты

Вывод JSON, потоки, коды выхода, переменные окружения и работа без присмотра или в CI.

Вывод JSON

С --json stdout содержит только JSON с отступом в два пробела, заметки и прогресс остаются в stderr, и ничего не спрашивается. Список выводит { items, hasMore, nextCursor }, объект API выводится так, как его вернул API, а написанная вручную команда выводит объект, описанный в её справке.

Терминал
openemail whoami --json | jq -r .workspaceIdopenemail emails list --status failed --json | jq -r ".items[].id"

Ошибка уходит в stderr одной строкой JSON, а код выхода тот же, что получил бы человек:

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}}
ПолеЧто в нём
typeТип ошибки API или cli_error, network_error или internal_error для сбоя внутри CLI
codeСтабильный код, например insufficient_scope, not_signed_in или unknown_flag
messageЧто пошло не так, одним предложением
hint, nextЧто попробовать и какую команду запустить дальше, или null
status, requestId, param, docUrlИз API, если ошибка пришла от него, иначе null
exitCodeКод выхода, с которым завершается процесс

Потоки

Часть вывода это поток JSON-объектов, по одному в строке, чтобы конвейер обрабатывал каждый элемент по мере поступления:

  • Список ресурсов с --all, когда stdout не терминал, или с --ndjson. --max <n> останавливается после стольких элементов.
  • openemail temp watch --json, по одной строке на новое письмо.
  • openemail mcp serve, по одному сообщению JSON-RPC в строке в каждую сторону.
Терминал
openemail contacts list --all > contacts.ndjsonopenemail emails list --status failed --all --max 500 | jq -r .id

Коды выхода

КодЗначение
0Готово
1Неожиданный сбой, ошибка сервера или неудачная отправка
2Ошибка использования: неверный аргумент, неизвестная команда или флаг, значение или подтверждение, которое не удалось запросить, либо адрес или путь, куда CLI не отправит учётные данные
3Вход не выполнен, либо вход отклонён, истёк или был завершён, пока работала команда
4Не разрешено: не хватает scope или разрешения, код подтверждения не удалось запросить или он на паузе, или API-ключ там, где нужен вход через браузер
5Не найдено
6Конфликт с текущим состоянием
7Ввод был неверным
8Превышен лимит запросов или исчерпана квота ИИ
9Сбой сети или истекло время ожидания
10Отменено: вы отклонили подтверждение или вопрос
130, 143Остановлено через Ctrl+C или SIGTERM

Переменные окружения

ПеременнаяЧто делает
OPENEMAIL_API_KEYAPI-ключ, который используется вместо любого сохранённого профиля
OPENEMAIL_PROFILEСохранённый профиль, который нужно использовать
OPENEMAIL_BASE_URLАдрес API для OPENEMAIL_API_KEY, --api-key и команд, которые не отправляют учётных данных. Сохранённый вход уходит только в тот API, в который он вошёл
OPENEMAIL_APP_URLАдрес веб-приложения, для входа, open и ссылок на документацию
OPENEMAIL_CONFIG_DIRГде хранятся профили и токены ящиков, ~/.openemail, если не задано
OPENEMAIL_NO_UPDATE_CHECKНикогда не проверять npm на новый выпуск. OPENEMAIL_DISABLE_UPDATE_NOTICE делает то же самое
NO_COLOR, FORCE_COLOR=0Без цвета
CIНикогда не спрашивать, никогда не открывать браузер, никогда не проверять обновления. Большинство сервисов CI распознаются и без неё
VISUAL, EDITORРедактор, который send и reply открывают для тела

Работа без присмотра

CLI задаёт вопросы, только когда stdin и stdout оба терминалы и не действует ни --json, ни --no-input, ни CI. Иначе:

  • Отсутствующее обязательное значение завершается с кодом выхода 2 и называет флаг, который нужно передать.
  • Разрушительная команда завершается с Refusing to run unattended. Pass --yes to confirm. и кодом выхода 2, если вы не передадите --yes.
  • Изменение, которому нужен код подтверждения, завершается с кодом выхода 4, потому что ввести его некому. Используйте API-ключ или сначала запустите openemail verify.

В CI

Дайте задаче API-ключ только с нужными scope, храните его в секрете и пусть его передаёт OPENEMAIL_API_KEY. Ничего не сохраняется, ничего не спрашивается, и проверка обновлений не запускается.

.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 }}"
Дождаться письма о регистрации
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
Падать при неудачных отправках
failed=$(openemail emails list --status failed --json | jq ".items | length")test "$failed" -eq 0

Передавайте --idempotency-key при отправке, которую конвейер может повторить, и выводите его из того, что сделало отправку нужной, например из идентификатора запуска. Повтор шага тогда вернёт первую отправку, а не отправит письмо дважды.

Ваши входящие,
на ваших условиях.

Почтовая инфраструктура для бизнеса, ИИ, агентов и личной почты. Создана для масштаба, приватности и контроля. Всё, что должно было быть в почте с первого дня.

OpenEmail

Почтовая инфраструктура для бизнеса, ИИ, агентов и личной почты. Создана для масштаба, приватности и контроля. Всё, что должно было быть в почте с первого дня.

© 2026 OpenEmail. Все права защищены.