الاستيثاق
سجّل الدخول بمتصفحك أو بمفتاح API، واحتفظ بعدة ملفات شخصية، وتحقّق من رمز قبل أي تغيير حساس.
طريقتان لتسجيل الدخول
شغّل openemail login في طرفية فيسألك أي الطريقتين تريد. في الحالتين يُحفظ تسجيل الدخول كملف شخصي، ويستخدم كل أمر لاحق الملف النشط.
| الأمر | يتصرف باسم | رموز التحقق |
|---|---|---|
| openemail login | أنت، في مساحة العمل وبالصلاحيات التي توافق عليها | يُطلب قبل بعض التغييرات الحساسة |
| openemail login --with-token | مساحة العمل، بنطاقات الصلاحية التي يحملها المفتاح | لا يُطلب أبدًا |
- لا يستطيع استخدام
ai composeوai summarizeوأوامر MCP إلا تسجيل الدخول عبر المتصفح. - يبقى تسجيل الدخول عبر المتصفح صالحًا حتى تنتهي الموافقة التي اخترتها أو حتى تسجّل الخروج. ويعمل المفتاح إلى أن يُبطَل.
تسجيل الدخول عبر المتصفح
- يسجّل
openemail loginتطبيقًا جديدًا لهذا الدخول باسمOpenEmail CLI on <your computer>، ويفتح صفحة الموافقة في OpenEmail داخل متصفحك. وإن لم يُفتح المتصفح، فاستخدم الرابط الذي يطبعه. - سجّل الدخول إن لزم، ثم اختر مساحة العمل، والصلاحية التي تحصل عليها CLI (قراءة، أو قراءة وإرسال، أو كاملة، أو مجموعتك الخاصة من الأذونات)، والنطاقات أو العناوين التي تبلغها، ومدة الموافقة.
- وافق. يعيد المتصفح الموافقة إلى الطرفية من تلقاء نفسه، ويمكنك إغلاق التبويب. تطبع CLI الحساب الذي سجّلت به الدخول، ومساحة العمل، وموعد انتهاء الموافقة.
openemail loginopenemail login --scopes emails:send,threads:readopenemail login --profile work- تنتظر CLI موافقتك 10 دقائق. واختيار «ليس الآن» في صفحة الموافقة يلغي تسجيل الدخول برمز الخروج
10. - يحدد
--scopesالأذونات مسبقًا في صفحة الموافقة، ويمكنك تغييرها هناك. - إذا كان في الملف الشخصي تسجيل دخول بالفعل، تسأل الطرفية قبل استبداله. ومن دون إشراف ترفض، ما لم تمرّر
--forceأو--yes. واستبدال تسجيل دخول عبر المتصفح يُبطل القديم.
كل تسجيل دخول عبر المتصفح تطبيق مرتبط قائم بذاته، يظهر في الحساب → التطبيقات المرتبطة مع الصلاحية التي وافقت عليها، وهناك يمكنك تغييرها أو إزالته. يفتح openemail open apps تلك الصفحة.
في الأساس تدفق OAuth الذي يستخدمه خادم MCP: عميل عام مع PKCE، ورمز لمرة واحدة، ورمز وصول يدوم ساعة ويُجدَّد نيابةً عنك. يعود المتصفح إلى 127.0.0.1 على منفذ عشوائي، ولا يُقبل هناك إلا رمز هذا الدخول.
عبر SSH، أو دون متصفح
حين لا تستطيع CLI فتح متصفح على هذا الجهاز، تطبع الرابط بدلًا من ذلك: عبر SSH، وفي CI، وعلى Linux دون شاشة، أو حين تمرّر --no-browser. افتح الرابط في متصفح على أي جهاز ووافق. تعرض الصفحة بعدها رمز دخول تلصقه في الطرفية.
$ openemail login --no-browserOpen this link in a browser on any device to sign in: https://api.openemail.uk/auth/mcp/authorize?response_type=code&client_id=…Paste the code from your browser- الرمز صالح فقط لتسجيل الدخول الذي طبع الرابط، لذا يُرفض رمز من تبويب آخر.
- لصق العنوان الكامل الذي انتهى إليه المتصفح يعمل أيضًا.
- دون طرفية، مرّر الرمز عبر stdin.
مفاتيح API
يُدخل مفتاح API السكربت دون متصفح، ولا يُطلب منه رمز أبدًا. أنشئ واحدًا من الإعدادات → مفاتيح API (openemail open api-keys) بالنطاقات التي يحتاجها السكربت فقط. تتحقق CLI من المفتاح عبر GET /keys/self قبل حفظه، وتقبل مفاتيح oe_live_ وoe_test_. البريد المرسل بمفتاح اختبار لا يُسلَّم أبدًا.
openemail login --with-token < ~/.config/openemail/keyecho "$OPENEMAIL_KEY" | openemail login --with-token --profile ciopenemail login --token oe_live_…يعمل --token أيضًا، لكن المفتاح ينتهي في سجل الصدفة لديك، لذا تحذّرك CLI وتقترح --with-token. وهناك طريقتان لاستخدام مفتاح دون حفظه:
OPENEMAIL_API_KEYفي البيئة يستخدمه كل أمر يراه، قبل أي ملف شخصي محفوظ.--api-key <key>يُستخدم لذلك الأمر وحده.
حين تتوفر أكثر من بيانات اعتماد، تفوز أولاها من هذه: --api-key، ثم OPENEMAIL_API_KEY، ثم الملف الشخصي الذي يسمّيه --profile، ثم الملف الذي يسمّيه OPENEMAIL_PROFILE، ثم الملف النشط.
الملفات الشخصية
الملف الشخصي تسجيل دخول محفوظ من أي النوعين. أولها اسمه default. سجّل الدخول في المزيد عبر --profile وبدّل بينها:
openemail login --profile workopenemail profile listopenemail profile use workopenemail inbox --profile defaultOPENEMAIL_PROFILE=work openemail statusopenemail profile currentopenemail profile remove work- يعرض
profile listكل ملف بنوعه ومساحة عمله ومستخدمه أو مفتاحه، ويعلّم الملف النشط. ولا يتضمن JSON الخاص به رمزًا أو مفتاحًا أبدًا. - يطبع
profile currentالاسم وحده على stdout، لذا يعمل$(openemail profile current)داخل سكربت. profile remove <name>هو نفسهopenemail logout --profile <name>.- اسم الملف الشخصي حتى 64 حرفًا من الحروف والأرقام والنقاط والشرطات والشرطات السفلية.
profile useاسمه أيضًاprofile switch. وإزالة الملف الشخصي النشط أو تسجيل الخروج منه لا يُبقي أي ملف شخصي نشطًا، والأمر التالي الذي يحتاج إلى تسجيل دخول يرشدك إلىopenemail profile use <name>.
أي API يخاطبه تسجيل الدخول
يتذكر الملف الشخصي المحفوظ الـ API الذي سجّل الدخول إليه، ولا تُرسل بيانات اعتماده إلا إليه. و--base-url أو OPENEMAIL_BASE_URL الذي يسمّي أصلًا آخر يوقف الأمر برمز الخروج 2 قبل إرسال أي شيء، ويشرح كيف تسجّل الدخول إلى ذلك الأصل بملف شخصي مستقل.
openemail login --profile other --base-url https://api.example.comopenemail inbox --profile other- المفتاح القادم من
OPENEMAIL_API_KEYأو--api-keyليس ملفًا شخصيًا محفوظًا، لذا يذهب إلى الأصل الموجود في--base-urlأوOPENEMAIL_BASE_URL، أو إلىhttps://api.openemail.ukإن لم يُضبط أيٌّ منهما. - الأوامر التي لا ترسل بيانات اعتماد تتبع
--base-urlوOPENEMAIL_BASE_URLأيًّا كان الملف الشخصي النشط: صناديق الوارد المؤقتة، والطرق التي لا تحتاج إلى مفتاح، وdocsوopen. - يُرفض
httpغير المشفّر لكل أصل عداlocalhostو127.0.0.1و::1، برمز الخروج2: الـ API، وتطبيق الويب، وطلبات تسجيل الدخول والرموز والإبطال، وخادم MCP. استخدمhttpsلكل ما عدا ذلك. - مسار الطلب الذي سيخرج من أصل الـ API، مثل
openemail api //example.com/x، يتوقف برمز الخروج2وinvalid_pathقبل إرسال أي شيء.
ما لا يستطيعه كل نوع من تسجيل الدخول
تسجيل الدخول عبر المتصفح يتصرف باسمك، لكن بعض الأمور لا تُمنح لأي تطبيق أبدًا، أيًّا كانت الصلاحية التي تختارها:
- إدارة مفاتيح API. لا يُمنح
keys:writeوkeys:manageأبدًا، لذا يتطلب إنشاء المفاتيح وتدويرها وإبطالها مفتاح API يحملkeys:manage، أو تطبيق الويب. ويدوّرopenemail me rotateالمفتاح الذي تستدعي به، لذا يحتاج إلى مفتاح API. - الفوترة، ومساحات العمل نفسها. الخطط والفواتير وإنشاء مساحة عمل أو التبديل إليها أو حذفها تبقى في تطبيق الويب.
- عنوانك المجاني. يُوافَق على التطبيق لمساحة عمل تجارية، ولا تُعرض أبدًا المساحة الشخصية التي تضم العنوان المجاني، وهي القاعدة نفسها التي تتبعها API.
- الأعضاء والأدوار، ما لم تشمل الموافقة مساحة العمل كلها. يُحذف
members:writeوroles:writeمن أي موافقة مقصورة على بعض النطاقات أو العناوين.
لمفتاح API حدّ خاص به. ai compose وai summarize وكل أمر openemail mcp عدا config تمر عبر خادم MCP الذي يتطلب تسجيل دخول عبر المتصفح، لذا تتوقف مع المفتاح برمز الخروج 4 وتذكر السبب.
رموز التحقق
مع تسجيل الدخول عبر المتصفح، تطلب بعض التغييرات رمز تحقق أولًا، كما في تطبيق الويب. تطلبه CLI حين تحتاجه: ترسل إليك بالبريد رمزًا من ست خانات، أو، إن كان تسجيل الدخول بخطوتين مفعّلًا، تطلب رمزًا من تطبيق المصادقة أو أحد رموزك الاحتياطية. وحين يصح الرمز يعمل الأمر، ولا يُسأل تسجيل الدخول ذاك مرة أخرى مدة 60 دقيقة. ولا يُطلب من مفتاح API أبدًا.
| الأمر | تطلب رمزًا |
|---|---|
| webhooks create, update | دائمًا |
| rules create, update | دائمًا |
| roles update, delete | دائمًا |
| members add, update, remove | دائمًا |
| members grant-address, revoke-address | دائمًا |
| domains delete, delete-address | دائمًا |
| audiences delete | لجمهور أنشأته |
| audiences empty | لجمهور أنشأته وما زال فيه جهات اتصال |
| mcp call createRule, setRuleEnabled | دائمًا |
| mcp call removeDomain, removeDomainAddress | دائمًا |
| mcp call deleteAudience, emptyAudience | كما يفعل أمر الجمهور المقابل |
| api | حين تكون العملية التي يستدعيها واحدة مما سبق |
$ openemail webhooks create --url https://acme.com/hooks/openemailWe emailed a code to a•••@acme.com.Verification code: 482913Verified. You will not be asked again for 60 minutes.- اكتب
rعند المطالبة لإعادة إرسال البريد. والرمز الخاطئ يخبرك بعدد المحاولات المتبقية. - بعد قبول الرمز يعمل الأمر مرة أخرى، لا مرتين أبدًا.
--yesيؤكد الحذف، لكنه لا يتخطى الرمز أبدًا.- من دون إشراف (مع
--jsonأو--no-input، أو في CI، أو دون طرفية) لا أحد يستطيع كتابة الرمز، لذا يتوقف الأمر برمز الخروج4ولا يغيّر شيئًا. - للرمز 5 محاولات، وبعد الخامسة الخاطئة تعرض CLI رمزًا جديدًا. ويمكن لكل تسجيل دخول أن يطلب 5 رموز في الساعة و20 في اليوم.
- عشرة رموز خاطئة لتسجيل دخول واحد خلال 24 ساعة توقف التحقق الخاص به مؤقتًا. عندها تقول CLI متى يُستأنف، وتتوقف برمز الخروج
4وstep_up_pausedدون أن تعرض رمزًا آخر، والبريد الذي يشرح ذلك يسمّي التطبيق.
شغّل openemail verify قبل أن يفعل سكربت أو عميل ذكاء اصطناعي شيئًا حساسًا. يطلب الرمز الآن، وخلال الدقائق الستين التالية يعمل كل أمر في ذلك الملف الشخصي دونه، بما في ذلك openemail mcp call وجسر MCP المحلي.
openemail verifyopenemail verify --statusopenemail verify --status --jsonopenemail verify --forceالدقائق الستون ملك لتسجيل دخول واحد. يُطلب من ملف شخصي آخر، أو من عميل ذكاء اصطناعي سجّل الدخول بنفسه، رمزه الخاص، وتسجيل الخروج ينهيها فورًا. يطلب --force رمزًا جديدًا ويبدأ 60 دقيقة جديدة.
الانتهاء وتسجيل الخروج والإبطال
- رمز الوصول وراء تسجيل الدخول عبر المتصفح يدوم ساعة. تجدده CLI قبل أن ينتهي وتحفظ الجديد، فلا تلاحظ ذلك أبدًا.
- كل رمز تحديث يعمل مرة واحدة. والرمز القديم الذي يُستخدم بعد أكثر من 30 ثانية من استبدال CLI له، كأن يأتي من نسخة من
config.jsonعلى جهاز آخر، يجعل الخادم يُبطل تسجيل الدخول ذاك كليًّا، لذا سجّل الدخول على كل جهاز بدل نسخ الملف. - تدوم الموافقة المدة التي اخترتها في صفحة الموافقة. وحين تنتهي، أو حين يُزال التطبيق من الحساب → التطبيقات المرتبطة، لا تعود CLI قادرة على التصرف باسمك وتطلب منك تشغيل
openemail loginمن جديد. - يُبطل
openemail logoutتسجيل الدخول عبر المتصفح على الخادم، فيزيله من التطبيقات المرتبطة، ثم ينساه على هذا الجهاز، حتى إن تعذّر الوصول إلى الخادم. و--allيسجّل الخروج من كل ملف شخصي. - تسجيل الخروج من مفتاح API ينساه هنا فقط. ويظل المفتاح يعمل حتى تبطله، عبر
openemail keys revoke <id>أو في تطبيق الويب.
أين تُحفظ عمليات تسجيل الدخول
كل شيء في ~/.openemail، أو في المجلد الذي يسمّيه OPENEMAIL_CONFIG_DIR. المجلد لا يقرؤه أحد سواك (0700)، وكذلك كل ملف فيه (0600). يُكتب كل ملف في ملف مؤقت ثم يُعاد تسميته إلى مكانه، فلا يترك أي تعطل نصف ملف أبدًا، وكل تغيير يجري تحت ملف قفل، فلا تفقد الأوامر التي تعمل جنبًا إلى جنب أي ملف شخصي.
| الملف | ما يحتويه |
|---|---|
| config.json | ملفاتك الشخصية: مفاتيح API، ورموز الوصول والتحديث، وأي ملف هو النشط |
| temp-mail.json | صناديق الوارد المؤقتة التي أنشأتها هذه CLI، مع رموز صناديقها |
| update-check.json | متى سُئل npm آخر مرة عن إصدار جديد، وبماذا أجاب |
تُحفظ الرموز والمفاتيح نصًا عاديًا في ملفات لا يقرؤها إلا مستخدمك، فتعامل مع المجلد كما تتعامل مع مفتاح SSH. الملف الذي لا تفهمه CLI لا يُعدّ أبدًا بصمت تسجيلًا للخروج: تحذّر مرة واحدة مع المسار، وتحتفظ بنسخة بجانبه (config.json.bak) قبل كتابة ملف جديد. والملف الذي لا تستطيع قراءته أصلًا، بسبب أذوناته مثلًا، يوقف الأمر بخطأ يسمّيه.