تخطَّ إلى المستندات
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غير مسموح: نطاق أو إذن ناقص، أو رمز تحقق تعذّر طلبه أو موقوف مؤقتًا، أو مفتاح 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 يحمله. لا يُحفظ شيء، ولا يُطرح أي سؤال، ولا يجري أي تحقق من التحديثات.

.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. جميع الحقوق محفوظة.