اسکریپتنویسی
خروجی 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"خطا بهصورت یک سطر 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 | مجاز نیست: دامنهٔ مجوز یا اجازهای کم است، کد تأیید هویتی که نمیشد پرسید یا متوقف شده است، یا کلید API جایی که ورود با مرورگر لازم است |
| 5 | پیدا نشد |
| 6 | تعارض با وضعیت فعلی |
| 7 | ورودی نامعتبر بود |
| 8 | محدودیت نرخ، یا سهمیهٔ هوش مصنوعی تمام شده است |
| 9 | شبکه شکست خورد یا زمانش سر آمد |
| 10 | لغو شد: یک تأیید یا پرسش را رد کردید |
| 130, 143 | با Ctrl+C یا با SIGTERM متوقف شد |
متغیرهای محیطی
| متغیر | چه میکند |
|---|---|
| OPENEMAIL_API_KEY | کلید APIای که به جای هر نمایهٔ ذخیرهشده به کار میرود |
| 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 فقط با دامنههای مجوز لازم بدهید، آن را در یک راز نگه دارید و بگذارید OPENEMAIL_API_KEY آن را برساند. چیزی ذخیره نمیشود، چیزی پرسیده نمیشود و هیچ بررسی بهروزرسانیای اجرا نمیشود.
- 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در ارسالی که ممکن است یک خط لوله دوباره امتحانش کند --idempotency-key بدهید و آن را از چیزی بسازید که ارسال را لازم کرده، مثل شناسهٔ اجرا. اجرای دوبارهٔ گام آنوقت همان ارسال نخست را برمیگرداند به جای اینکه دو بار نامه بفرستد.