تخطَّ إلى المستندات
CLI

المحادثات والمسودات والتسميات

كل أمر في مساحات الأسماء threads وdrafts وlabels، وكيف تقع تحت inbox وread وarchive وبقية أوامر البريد.

نظرة عامة

أوامر البريد، مثل inbox وread وarchive وlabel add، مكتوبة للبشر: تأخذ عدة معرّفات محادثات دفعة واحدة، وتنسّق ما تطبعه، وتُبقي معرّفات التسميات بعيدًا عن النظر. وكل منها يشغّل أوامر من هذه الصفحة، وهي طرق SDK للمحادثات والمسودات والتسميات، أمر لكل طريقة، فيصبح threads.listAttachments هو openemail threads list-attachments.

استخدم هذه حين تحتاج إلى ما تتركه أوامر البريد: محادثة كما تعيدها API تمامًا، والملفات المرفقة برسالة، والمسودات، وإنشاء التسميات وإعادة تسميتها وتغيير ألوانها وحذفها.

  • يعمل openemail thread وopenemail draft كما تعمل صيغ الجمع. أما openemail labels فلا صيغة مفرد له: openemail label هو أمر البريد الذي يضع التسميات على المحادثات.
  • تقبل الأفعال الأسماء البديلة المعتادة: ls بدلًا من list، وshow وview بدلًا من get، وnew وadd بدلًا من create، وedit بدلًا من update، وrm وdel وremove بدلًا من delete.
  • كل خيار موجود في openemail <namespace> <verb> --help، مثل openemail threads list --help.

المحادثات

المحادثات في صندوق البريد. معرّف المحادثة مثل CAHk7pQ2x9LmZ4 يأتي من threads list أو openemail inbox أو openemail search.

الأمرما تفعله
openemail threads listاسرد صفحة واحدة من المحادثات في مجلد، الأحدث أولًا. كل صف معرّف فقط. ويضيّقها ويرتّبها --folder و--query و--label-ids و--sort و--date-from و--date-to و--from-contacts
openemail threads get <id>اقرأ محادثة بكل رسائلها، الأقدم أولًا، مع تسمياتها وحالة عدم القراءة
openemail threads update <id>علّم محادثة كمقروءة بـ --read أو غير مقروءة بـ --no-read، وضع التسميات عليها أو أزلها بـ --add-label-ids و--remove-label-ids، حتى 50 لكل منهما
openemail threads trash <id>انقل محادثة إلى سلة المهملات، خارج الوارد والبريد العشوائي والمؤجَّل والأرشيف في خطوة واحدة. يطلب منك التأكيد
openemail threads snooze <id> <wake-at>أخفِ محادثة حتى لحظة مستقبلية، مثل 2026-10-01T09:00:00Z. وتأجيلها مرة أخرى يستبدل وقت الاستيقاظ
openemail threads unsnooze <id>أعِد محادثة مؤجَّلة إلى الوارد الآن وامسح وقت استيقاظها
openemail threads list-attachments <id> <message-id>اسرد مرفقات رسالة واحدة، كل منها ببايتاته مضمّنة بترميز base64 في content
  • القيمة الافتراضية لـ --folder هي inbox، ويُطابَق كمعرّف تسمية، لذا تعمل sent وarchive وspam وtrash وdraft وsnoozed وstarred وunread، وتُقرأ bin على أنها trash، ويعمل أيضًا معرّف تسمية مستخدم مثل USER_RECEIPTS. والمجلد الذي لا يطابق شيئًا يعيد صفحة فارغة، لا خطأ.
  • يأخذ --query صياغة البحث في التطبيق، ويبحث in:anywhere في كل مجلد. ويضيّق --label-ids أكثر، إذ يجب أن تحمل المحادثة المجلد وكل معرّف تمرّره. ويقرأ --date-from و--date-to أحدث رسالة في كل محادثة، والطرفان مشمولان.
  • يضم threads get ردود المسودات غير المرسلة بين الرسائل، معلَّمة بـ isDraft: true، ويفتح معرّف مسودة أيضًا.
  • يحتاج threads update إلى --read أو --no-read أو تسمية لإضافتها أو إزالتها. تُطبَّق الإزالات قبل الإضافات. ومعرّف التسمية الذي لا يسمّي تسمية يُرفض بـ label_not_found ولا يتغير شيء في المحادثة، لذا أنشئ التسمية أولًا. وتُرفض TRASH وSNOOZED وDRAFT بـ label_not_directly_settable: استخدم threads trash وthreads snooze.
  • لا يحذف threads trash شيئًا، وتبقى المحادثة قابلة للقراءة عبر threads get، لكن لا يوجد أمر يُخرج محادثة من سلة المهملات. ونقل محادثة مؤجَّلة إلى المهملات يلغي استيقاظها أيضًا.
  • يرسل threads snooze القيمة <wake-at> كما هي، لذا أعطه لحظة مستقبلية بصيغة ISO 8601 مع Z أو إزاحة، لأن الوقت الذي يخلو منهما يُقرأ بالمنطقة الزمنية للخادم. والمهلة مثل 3h تُرفض لأنها غير صالحة. أما openemail snooze --until 3h فيقبل مهلة. وتستيقظ المحادثات في مسح يجري كل ساعة، بتأخير قد يبلغ نحو ساعة، وتعود دائمًا إلى الوارد.
  • يعيد threads list-attachments كل ملف كاملًا في استجابة واحدة. خذ معرّف الرسالة من messages في threads get. وتكون content سلسلة فارغة حين يتعذر العثور على البايتات المخزنة، لذا افحص طولها قبل فك الترميز.

المسودات

رسائل غير مرسلة محفوظة في صندوق البريد. يبدأ معرّف المسودة بـ draft-.

الأمرما تفعله
openemail drafts listاسرد صفحة واحدة من المسودات، الأحدث حفظًا أولًا. كل صف معرّف فقط، ويبحث فيها --query
openemail drafts get <id>اقرأ مستلمي مسودة وموضوعها ونصها ومرسلها والمحادثة التي ترد عليها وأسماء مرفقاتها
openemail drafts createاحفظ مسودة جديدة من --to و--cc و--bcc و--subject و--html و--text و--from و--thread-id، وكلها اختيارية
openemail drafts update <id>غيّر حقولًا في مسودة محفوظة. والحقل الذي تُغفله يحتفظ بقيمته
openemail drafts delete <id>احذف مسودة نهائيًا. لا تذهب إلى سلة المهملات. يطلب منك التأكيد
  • يبحث drafts list --query في الموضوع والمرسل وبداية النص، ولا يخرج أبدًا عن المسودات. ويقرأ older_than:30d وبقية عوامل التاريخ وقت آخر حفظ للمسودة، ولا تطابق to: وcc: وbcc: شيئًا في المسودة.
  • تُخزَّن المسودة كمحادثة مسمّاة DRAFT، لذا يفتحها threads get ويسردها openemail inbox draft. ويرفض drafts get وupdate وdelete معرّف محادثة عادية بـ 404.
  • يحفظ openemail drafts create المجرد مسودة فارغة. لا يُفحص إلا الطول: موضوع حتى 998 حرفًا، و--html و--text حتى 1,000,000 لكل منهما، ويُحتفظ بـ --html حين يُضبط الاثنان. ولا يوجد خيار للمرفقات.
  • يستبدل drafts update كل حقل ترسله. والقائمة تستبدل المخزنة كلها، فـ --to مع عنوان واحد يُسقط البقية، وأي تحديث يفرغ قائمة مرفقات المسودة.
  • يسجّل --thread-id المحادثة التي ترد عليها المسودة، لكن المسودة تبقى مخزنة كمحادثة مستقلة.
  • تشغيل drafts create مرة أخرى يحفظ مسودة ثانية، لأنه لا يأخذ مفتاح لاتكرارية. والاسم المعروض الذي فيه فاصلة ينقسم إلى مستلمَين معطوبين، فاحذف الفاصلة.
  • يرسل openemail send --draft <id> --to <address> مسودة. يأتي النص من المسودة، وكذلك الموضوع ما لم تمرّر --subject، أما المستلمون فهم الذين تسمّيهم. ولا يمكن جمعه مع نص أو --template أو --translate.

التسميات

التسميات التي يمكن أن تحملها المحادثة. معرّف تسمية المستخدم هو USER_ يليه الاسم الذي أُنشئت به، بأحرف كبيرة، مع تحويل كل سلسلة من المسافات إلى _، فيصبح Big Clients هو USER_BIG_CLIENTS.

الأمرما تفعله
openemail labels listاسرد تسميات المستخدم في مساحة العمل، مرتبة بالاسم، لكل منها لونها وthreadCount وcreatedAt وupdatedAt
openemail labels list-colorsاسرد لوحة الألوان التي يعرضها التطبيق، أربعة عشر لونًا صلبًا وسبعة تدرجات. وvalue هو ما تمرّره كلون
openemail labels get <id>اقرأ تسمية مستخدم واحدة، مع مطابقة معرّفها بحساسية لحالة الأحرف
openemail labels create --name <value>أنشئ تسمية مستخدم. يمنحها --color-background-color لونًا
openemail labels update <id>أعد تسمية تسمية أو غيّر لونها. يبقى المعرّف، وتبقى المحادثات التي تحملها
openemail labels delete <id>احذف تسمية وأزلها عن كل محادثة كانت تحملها. يطلب منك التأكيد
  • المعرّف لا يتغير أبدًا، حتى بعد إعادة التسمية، لذا خزّن المعرّفات لا الأسماء.
  • تسميات النظام مثل INBOX وSTARRED وUNREAD لا تُسرد ولا يمكن تغييرها أو حذفها، مع أن threads update يقبلها. وlabels get على إحداها يعطي 404.
  • تضم مساحة العمل حتى 50 تسمية مستخدم. والاسم الذي تحمله تسمية أخرى بالفعل، دون اعتبار لحالة الأحرف، يُرفض بـ label_name_taken.
  • اللون قيمة ست عشرية مثل #3B82F6 أو رمز تدرج مثل gradient:sunset. ويأخذ --label-color اللون كله بصيغة JSON، و--label-color null يمسحه.
  • التسمية ملك لمساحة العمل، لذا فإن إعادة تسميتها أو تغيير لونها أو حذفها يغيّرها لكل من فيها.
  • لا تراجع عن labels delete. وإنشاء تسمية بالاسم نفسه من جديد يعطي المعرّف نفسه، لكن المحادثات لا تستعيدها. ويخبرك threadCount في labels get كم محادثة ستفقدها.

كيف تستخدمها أوامر البريد

أمر البريدما يشغّله
inbox [folder]threads list لصفحة واحدة، ثم threads get على كل محادثة، ستًّا في كل مرة
search <query...>threads list --query، ثم threads get على كل محادثة
read <thread-id>threads get، ثم threads update --read ما لم تمرّر --no-mark-read
reply <thread-id>threads get لمعرفة المستلمين والموضوع وعنوان الإرسال، ثم emails send داخل المحادثة
archive <thread-id...>threads update --add-label-ids ARCHIVE --remove-label-ids INBOX
unarchive <thread-id...>threads update --add-label-ids INBOX --remove-label-ids ARCHIVE
star, unstar <thread-id...>threads update مع إضافة STARRED أو إزالتها
mark read, unread <thread-id...>threads update --read، أو --no-read
trash <thread-id...>threads trash
snooze <thread-id...> --until <when>threads snooze، بعد تحويل مهلة مثل 3h إلى لحظة أولًا
unsnooze <thread-id...>threads unsnooze
label add, remove <thread-id...>threads update --add-label-ids، أو --remove-label-ids
send --draft <id>emails send --draft-id
  • يأخذ أمر البريد عدة معرّفات محادثات ويبلّغ عن كل منها، ومع --json يطبع { results, succeeded, failed }. أما الأمر في هذه الصفحة فيأخذ معرّفًا واحدًا ويطبع ما تعيده API.
  • يقرأ openemail inbox كل محادثة يسردها ليعرض من كتب آخرًا والموضوع. أما threads list فيرسل طلبًا واحدًا لكل صفحة ولا يطبع إلا المعرّفات، وهذا كل ما يحتاجه خط المعالجة.
  • يحوّل openemail read رسالة HTML إلى نص ويعلّم المحادثة كمقروءة. أما threads get فيطبع المحادثة كما تعيدها API ولا يغيّر شيئًا.

أمثلة

علّم محادثة كمقروءة وأرشفها وضع عليها تسمية في طلب واحد، حيث كانت mark read وarchive وlabel add ستحتاج إلى ثلاثة:

تحديث واحد
openemail threads update CAHk7pQ2x9LmZ4 --read --add-label-ids ARCHIVE,USER_RECEIPTS --remove-label-ids INBOX --json

أنشئ تسمية ورتّب تحتها كل محادثة مطابقة. عند التمرير عبر أنبوب يطبع --all كائن JSON واحدًا في كل سطر:

وضع تسمية على نتائج بحث
openemail labels create --name Receipts --color-background-color gradient:meadowopenemail threads list --query "in:anywhere subject:receipt newer_than:1y" --all | jq -r .id | xargs openemail label add --label USER_RECEIPTS

احفظ ملفًا واحدًا من رسالة. معرّفات الرسائل موجودة في messages ضمن threads get:

حفظ مرفق
openemail threads get CAHk7pQ2x9LmZ4 --json | jq -r ".messages[].id"openemail threads list-attachments CAHk7pQ2x9LmZ4 message_4c1b257a --json | jq -r '.[] | select(.filename == "invoice.pdf") | .content' | base64 --decode > invoice.pdf

اكتب مسودة، وغيّرها، واقرأها من جديد، ثم أرسلها:

مسودة، ثم إرسال
DRAFT=$(openemail drafts create --to [email protected] --subject "Engine notes for Thursday" --html "<p>Agenda below.</p>" --json | jq -r .id)openemail drafts update "$DRAFT" --to [email protected],[email protected]openemail drafts get "$DRAFT"openemail send --draft "$DRAFT" --from [email protected] --to [email protected],[email protected]

تخلّص من المسودات التي لم يحفظها أحد منذ 30 يومًا. يطبع التشغيل التجريبي كل DELETE دون إرساله، ويجيب --yes عن التأكيد:

المسودات القديمة
openemail drafts list --query older_than:30d --all | jq -r .id > stale.txtxargs -n 1 openemail drafts delete --dry-run < stale.txtxargs -n 1 openemail drafts delete --yes < stale.txt

اختر تدرجًا من لوحة الألوان، وعاين التغيير، ونفّذه، ثم أزل اللون لاحقًا:

تغيير لون تسمية
openemail labels list-colors --json | jq -r '.[] | select(.kind == "gradient") | .value'openemail labels update USER_RECEIPTS --name "Receipts 2026" --color-background-color gradient:aurora --dry-runopenemail labels update USER_RECEIPTS --name "Receipts 2026" --color-background-color gradient:auroraopenemail labels update USER_RECEIPTS --label-color null

النطاقات ورموز التحقق

النطاقالأوامر
threads:readthreads list وget وlist-attachments
threads:writethreads update وtrash وsnooze وunsnooze
drafts:readdrafts list وget
drafts:writedrafts create وupdate وdelete
labels:readlabels list وlist-colors وget
labels:writelabels create وupdate وdelete

النطاق الناقص يتوقف برمز الخروج 4. ولا يطلب أي من هذه الأوامر رمز تحقق، سواء مع تسجيل الدخول عبر المتصفح أو مع مفتاح API.

تسجيل الدخول أو المفتاح المقيّد ببعض العناوين لا يرى إلا المحادثات المسلَّمة إليها، وأي محادثة أخرى تعطي 404، كأنها غير موجودة. والتسميات ملك لمساحة العمل، لذا يظل يرى كل تسمية، لكن threadCount لا يعدّ إلا المحادثات التي يستطيع رؤيتها.

الصفحات والتأكيدات والتشغيل التجريبي

  • تقرأ threads list وdrafts list وlabels list صفحة واحدة، 25 ما لم يحدد --limit غير ذلك، حتى 100. ويواصل --cursor من المؤشر الذي طبعته الصفحة. ومؤشر المحادثات يحتفظ بالترتيب الذي صدر به، لذا أرسل معه المرشّحات نفسها.
  • يقرأ --all كل صفحة ويتوقف --max <n> بعد هذا العدد. وعند التمرير عبر أنبوب أو مع --ndjson يطبع كائن JSON واحدًا في كل سطر، ومع --json مستند { items, hasMore, nextCursor } واحدًا.
  • قد تكون hasMore صحيحة في صفحة يتبيّن أنها الأخيرة، فيعيد الاستدعاء التالي صفرًا من العناصر. والمحادثة التي يصلها بريد جديد أثناء تصفحك تتقدم على المؤشر ولا تعيدها الصفحات اللاحقة، وكذلك المسودة المحفوظة أثناء تصفحك.
  • تطلب threads trash وdrafts delete وlabels delete منك التأكيد. ومن دون إشراف، مع --json أو --no-input أو دون طرفية، تتوقف برمز الخروج 2 ولا تغيّر شيئًا ما لم تمرّر --yes.
  • يطبع --dry-run الطلب الذي كان الأمر سيرسله، مع حجب بيانات الاعتماد، ويخرج بالرمز 0 دون إرساله أو طلب التأكيد. ومع --json يطبع { dryRun, request }.

أجسام JSON ومسح حقل

يأخذ --data الجسم كله بصيغة JSON، مضمّنًا، أو من ملف عبر @path، أو من stdin عبر -، وأي خيار تمرّره إلى جانبه يتجاوز مفتاحه.

قيمة الخيار الفارغة خطأ استخدام، لذا فالحقل الذي تمسحه قيمة فارغة يمر عبر --data بدلًا من ذلك. ويمسح --label-color null لون التسمية.

الطرفية
openemail drafts update draft-5f0c2a9e-8b1d-4e7a-a3c6-2d9f41b7e0c8 --data '{"from":""}'openemail drafts update draft-5f0c2a9e-8b1d-4e7a-a3c6-2d9f41b7e0c8 --data '{"threadId":""}'openemail drafts update draft-5f0c2a9e-8b1d-4e7a-a3c6-2d9f41b7e0c8 --data '{"to":[]}'openemail drafts create --data @draft.json --subject "Overrides the file"

الأول يحفظ المسودة دون مرسل، والثاني يفصلها عن المحادثة التي كانت ترد عليها، والثالث يمسح مستلميها.

كل الخيارات

الطرفية
openemail threads --helpopenemail threads list --helpopenemail drafts create --help --json

يعرض openemail <namespace> <verb> --help كل وسيط وخيار بنوعه، والنطاقات التي يحتاجها الاستدعاء، وطريقته ومساره، وما يعيده، والملاحظات من مرجع API. أضف --json لتحصل على المساعدة نفسها في صورة بيانات.

صندوق بريدك،
بشروطك أنت.

بنية بريد إلكتروني للشركات والذكاء الاصطناعي والوكلاء والبريد الشخصي. مبنية للتوسّع والخصوصية والتحكّم. كل ما كان ينبغي للبريد الإلكتروني أن يملكه منذ اليوم الأول.

OpenEmail

بنية بريد إلكتروني للشركات والذكاء الاصطناعي والوكلاء والبريد الشخصي. مبنية للتوسّع والخصوصية والتحكّم. كل ما كان ينبغي للبريد الإلكتروني أن يملكه منذ اليوم الأول.

© 2026 OpenEmail. جميع الحقوق محفوظة.