문서로 건너뛰기
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}}
필드담긴 내용
typeAPI 오류 타입, 또는 CLI 내부 실패일 때 cli_error, network_error, internal_error
codeinsufficient_scope, not_signed_in, unknown_flag 같은 안정된 코드
message무엇이 잘못됐는지 한 문장으로
hint, next시도할 것과 다음에 실행할 명령, 또는 null
status, requestId, param, docUrl오류가 API에서 왔으면 API의 값, 아니면 null
exitCode프로세스가 끝날 때의 종료 코드

스트림

일부 출력은 한 줄에 하나씩 JSON 객체가 이어지는 스트림이므로, 파이프라인이 각 항목을 도착하는 즉시 처리할 수 있습니다:

  • stdout이 터미널이 아닐 때 --all을 쓴 리소스 목록, 또는 --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허용되지 않음: 범위나 권한 부족, 물을 수 없었거나 일시 중지된 인증 코드, 또는 브라우저 로그인이 필요한 곳의 API 키
5찾을 수 없음
6현재 상태와 충돌
7입력이 잘못됨
8요청 한도 초과, 또는 AI 할당량 소진
9네트워크 실패 또는 시간 초과
10취소됨: 확인이나 프롬프트를 거절함
130, 143Ctrl+C나 SIGTERM으로 중지됨

환경 변수

변수하는 일
OPENEMAIL_API_KEY저장된 어떤 프로필 대신 쓸 API 키
OPENEMAIL_PROFILE사용할 저장된 프로필
OPENEMAIL_BASE_URLOPENEMAIL_API_KEY, --api-key, 그리고 자격 증명을 보내지 않는 명령이 쓰는 API 오리진. 저장된 로그인은 로그인한 API로만 갑니다
OPENEMAIL_APP_URL로그인, open, 문서 링크에 쓰는 웹 앱 오리진
OPENEMAIL_CONFIG_DIR프로필과 받은편지함 토큰을 보관하는 곳. 설정하지 않으면 ~/.openemail
OPENEMAIL_NO_UPDATE_CHECKnpm에서 새 릴리스를 절대 확인하지 않음. OPENEMAIL_DISABLE_UPDATE_NOTICE도 같음
NO_COLOR, FORCE_COLOR=0색 없음
CI절대 묻지 않고, 브라우저를 열지 않고, 업데이트를 확인하지 않음. 대부분의 CI 서비스는 이 변수가 없어도 인식됩니다
VISUAL, EDITORsend와 reply가 본문 작성에 여는 편집기

무인 실행

CLI는 stdin과 stdout이 모두 터미널이고 --json, --no-input, CI 중 어느 것에도 해당하지 않을 때만 묻습니다. 그렇지 않으면:

  • 필수 값이 빠지면 종료 코드 2로 멈추고 넘겨야 할 플래그를 알려 줍니다.
  • 파괴적인 명령은 --yes를 주지 않는 한 Refusing to run unattended. Pass --yes to confirm.과 종료 코드 2로 멈춥니다.
  • 인증 코드가 필요한 변경은 입력할 사람이 없으므로 종료 코드 4로 멈춥니다. API 키를 쓰거나 먼저 openemail verify를 실행하세요.

CI에서

작업에는 필요한 범위만 가진 API 키를 주고, 시크릿에 보관해 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를 주고, 실행 ID처럼 보내기가 필요해진 이유에서 값을 만드세요. 그러면 단계를 다시 실행해도 두 번 보내는 대신 첫 보내기를 돌려받습니다.

받은편지함을,
내 방식대로.

기업, AI, 에이전트, 개인 메일을 위한 이메일 인프라. 규모와 프라이버시, 통제권을 위해 만들었습니다. 이메일이 처음부터 갖췄어야 할 모든 것.

OpenEmail

기업, AI, 에이전트, 개인 메일을 위한 이메일 인프라. 규모와 프라이버시, 통제권을 위해 만들었습니다. 이메일이 처음부터 갖췄어야 할 모든 것.

© 2026 OpenEmail. 모든 권리 보유.