البريد
أرسل بأي جسم ومرفقات، واقرأ صندوق البريد وابحث فيه، وردّ، ورتّب المحادثات، واستخدم صناديق الوارد المؤقتة.
الإرسال
openemail send --to [email protected] --subject "Lunch?" --text "Thursday at noon works for me."يأتي الجسم من أول ما يتوفر من هذه المصادر:
--textو--html، كلاهما معًا إن أردت الجزأين.--body-file <path>. يُرسل ملف.htmlأو.htmبصيغة HTML وأي ملف آخر كنص، و-يقرأ stdin.- ما يصل عبر stdin. المُدخل الذي يبدأ بوسم HTML يُرسل بصيغة HTML.
- محررك (
$VISUAL، ثم$EDITOR)، حين تشغّله في طرفية.
من دون --from، ترسل CLI من العنوان الوحيد الذي يمكنك الإرسال منه، أو تتيح لك اختيار واحد في الطرفية. ومن دون إشراف ومع أكثر من عنوان، تتوقف وتطلب --from. في الطرفية ترى ملخصًا وتؤكد قبل أن يخرج أي شيء، وهذا ما يتخطاه --yes.
| الخيار | ما تفعله |
|---|---|
| --to, --cc, --bcc | المستلمون، مفصولون بفواصل أو مكررون. Ada Lovelace <[email protected]> يعمل أيضًا |
| --from, --reply-to | عنوان الإرسال، وترويسة Reply-To |
| -s, --subject | سطر الموضوع |
| -a, --attach <path> | إرفاق ملف. كرّره للمزيد |
| --at <when> | الإرسال لاحقًا: وقت ISO مثل 2026-10-01T09:00:00Z، أو مهلة مثل 10m أو 2h أو 1d أو PT1H |
| --undo <seconds> | حجز الإرسال الفوري حتى 900 ثانية، كي يمكن إلغاؤه بعد |
| --translate <language> | ترجمة البريد إلى هذه اللغة قبل خروجه |
| --template <id>, --props <json> | إرسال قالب محفوظ مع قيم props الخاصة به بدلًا من جسم |
| --draft <id> | إرسال مسودة محفوظة كما كُتبت تمامًا |
| --thread <id> | وضع البريد المرسل في هذه المحادثة |
| --tag <key=value> | وسم البريد. كرّره للمزيد |
| --idempotency-key <key> | إعادة تشغيل الأمر بالمفتاح نفسه لا ترسل مرتين أبدًا |
cat report.md | openemail send --to [email protected] --subject "Weekly report" --attach chart.pngopenemail send --to [email protected] --subject "Invoice" --body-file invoice.html --translate de --at 2hopenemail send --to [email protected] --template welcome --props '{"name":"Ada"}' --tag campaign=onboardingيطبع معرّف البريد وحالته. sent وpartial وfailed تعني أن الإرسال جرت محاولته ضمن الطلب، وqueued وscheduled تعني أنه محجوز. والإرسال بحالة failed يخرج بالرمز 1، ويطبع --json البريد كاملًا.
كل إرسال يحمل مفتاح عدم تكرار، مفتاحك أو مفتاحًا تولّده CLI، فلا تؤدي إعادة المحاولة بعد انقطاع الاتصال إلى إرسال الرسالة مرتين أبدًا. مرّر مفتاحك حين قد يعيد خط المعالجة الخطوة نفسها.
المرفقات
يأخذ --attach حتى 20 ملفًا. ما دام مجموعها 5 ميغابايت أو أقل، تسافر داخل الرسالة. وحين يزيد، يُرفع كل منها أولًا إلى الملفات وتشير إليه الرسالة، فلا يحتاج الملف الكبير إلى أي خطوة إضافية. ونوع المحتوى يؤخذ من امتداد الملف.
صندوق الوارد
openemail inboxopenemail inbox --unread --limit 50openemail inbox archive --sort oldestopenemail inbox --all --json | jq -r ".items[].id"يعرض صفحة واحدة من المحادثات، الأحدث أولًا، مع وقت آخر حركة لكل منها، ومن كتب آخرًا، والموضوع، والتسميات، ومعرّف المحادثة. النقطة تعلّم البريد غير المقروء. المجلد هو صندوق الوارد ما لم تسمِّ غيره: sent أو archive أو starred أو snoozed أو spam أو trash أو draft، أو معرّف تسمية مثل USER_RECEIPTS.
-uو--unreadيُبقيان المحادثات التي فيها بريد غير مقروء، و-lو--labelيُبقيان المحادثات التي تحمل تسمية، و-qو--queryيضيّقان القائمة ببحث.-nو--limitيحددان حجم الصفحة، من 1 إلى 100 (25 ما لم تحدد). وحين يتبقى المزيد، يُطبع المؤشر التالي على stderr لاستخدامه مع--cursor، ويقرأ--allكل صفحة.- يُبقي
--from-contactsالمحادثات التي جاءت أحدث رسائلها من جهة اتصال محفوظة، ويرتبها--sortحسبnewestأوoldestأوsenderأوsubject. - يطبع
--jsonالصيغة{ items, hasMore, nextCursor }، مع كل محادثة كاملة.
البحث
openemail search invoice from:adaopenemail search "quarterly report" has:pdf newer_than:30dopenemail search in:anywhere from:me to:ada --limit 50openemail search -- invoice -from:adaيأخذ البحث صياغة مربع البحث في التطبيق: كلمات عادية، وعبارات بين علامتي تنصيص، وعوامل مثل from: وto: وsubject: وhas:pdf وis:unread وafter:2026/01/31 وnewer_than:7d. يبحث في صندوق الوارد، أو في المجلد المحدد في --folder، ما لم يسمِّ الاستعلام مجلدًا عبر in: أو is:، ويبحث in:anywhere في كل المجلدات. ويأخذ خيارات inbox ويعرض نتائجه بالطريقة نفسها.
الكلمة التي تبدأ بشرطة تُستبعد من النتائج، وستقرؤها CLI كخيار، لذا ضع -- قبل أي استعلام يحتوي عليها.
قراءة محادثة
openemail read CAHk7pQ2x9LmZ4openemail read CAHk7pQ2x9LmZ4 --message -1openemail read CAHk7pQ2x9LmZ4 --html --message 1 > first.htmlيطبع كل رسالة في المحادثة، الأقدم أولًا: من أرسلها ولمن، ومتى، والموضوع، والمرفقات بأحجامها ومعرّفاتها، والجسم. يُعرض الجزء النصي كما هو، وتُحوَّل الرسالة المكتوبة بـ HTML وحده إلى نص مقروء يحتفظ بقوائمها واقتباساتها وعناوينها وروابطها. والقراءة تعلّم المحادثة كمقروءة، ما لم تمرّر --no-mark-read.
-mو--message <n>يعرضان رسالة واحدة، بالعدّ من 1، أو من الأحدث برقم سالب.- يطبع
--htmlHTML الخام بدلًا من ذلك. - الرسالة المشفّرة لا تُفك هنا، فافتحها في تطبيق الويب.
الرد
openemail reply CAHk7pQ2x9LmZ4 --text "Thanks, that works for me."openemail reply CAHk7pQ2x9LmZ4 --all --attach notes.pdfecho "Confirmed." | openemail reply CAHk7pQ2x9LmZ4 --yesيرد في المحادثة نفسها على من أرسل آخر رسالة، أو على عنوان Reply-To الخاص بها. وحين تكون آخر رسالة لك، يذهب الرد إلى من أُرسلت إليهم. ويضيف --all كل من في تلك الرسالة كنسخة، عدا عناوينك. ويُضاف Re: إلى الموضوع ما لم يكن فيه، ويخرج الرد من العنوان الذي سُلّمت إليه المحادثة حين يمكنك الإرسال منه.
يأخذ خيارات الجسم والمرفقات والجدولة والترجمة والوسوم وعدم التكرار من send، مع --from و--subject، ويتجاوز --to و--cc و--bcc المستلمين.
ترتيب المحادثات
| الأمر | ما تفعله |
|---|---|
| archive <thread-id...> | خارج صندوق الوارد، ولا تزال قابلة للبحث |
| unarchive <thread-id...> | عودة إلى صندوق الوارد |
| trash <thread-id...> | إلى سلة المهملات. يطلب التأكيد، لأنه لا يوجد استدعاء يُخرج المحادثة منها |
| star, unstar | إضافة النجمة أو إزالتها |
| mark read, mark unread | تعليم المحادثات كمقروءة أو غير مقروءة |
| snooze <thread-id...> --until <when> | إخفاء المحادثات حتى وقت محدد، أو لمهلة مثل 3h أو 1w. تعود في غضون ساعة تقريبًا بعده |
| unsnooze | إعادة المحادثات المؤجلة الآن |
| label add, remove --label <id> | وضع تسميات على المحادثات أو إزالتها. يعرض openemail labels list المعرّفات |
كل منها يأخذ عدة معرّفات محادثات ويبلّغ عن كل واحد. أول فشل يحدد رمز الخروج، ويطبع --json الصيغة { results, succeeded, failed }. ويمكن تمرير المعرّفات من البحث مباشرة:
openemail inbox --query "newer_than:30d from:alerts" --json | jq -r ".items[].id" | xargs openemail archiveصناديق وارد مؤقتة
ينشئ openemail temp عناوين قصيرة العمر لا تحتاج إلى حساب ولا تسجيل دخول، وهذا يناسب اختبارات التسجيل والرموز لمرة واحدة. يُحفظ رمز كل صندوق في ~/.openemail/temp-mail.json، فتجد الأوامر اللاحقة الصندوق بمعرّفه أو عنوانه، أو من تلقاء نفسها حين لا يكون لديك إلا واحد.
ADDRESS=$(openemail temp new --ttl 15)openemail temp watch --first --json | jq -r .snippetopenemail temp listopenemail temp readopenemail temp read tinb_4f2a tmail_91c3openemail temp delete --yes- يطبع
temp newالعنوان وحده على stdout. يعيش 60 دقيقة ما لم يقل--ttlغير ذلك، حتى 24 ساعة، ويختار--nameو--domainالعنوان. - يطبع
temp watchما وصل، ثم يتحقق كل 3 ثوانٍ حتى توقفه أو ينتهي الصندوق. يتوقف--firstعند أول رسالة، ويطبع--jsonسطر JSON واحدًا لكل رسالة. - يسرد
temp readالرسائل مع معاينة قصيرة، أو يطبع رسالة واحدة كاملة. - يحذف
temp deleteالصندوق وبريده فورًا. ويبقى العنوان محجوزًا 7 أيام بعد الموعد الذي كانت مدته ستنتهي فيه. - يصل
--inbox-tokenإلى صندوق وارد لم تنشئه هذه الـ CLI، فيtemp readوwatchوdelete. - مرسل البريد في صندوق الوارد المؤقت لا يُتحقق منه أبدًا.