المحادثات والمسودات والتسميات
كل أمر في مساحات الأسماء 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:read | threads list وget وlist-attachments |
| threads:write | threads update وtrash وsnooze وunsnooze |
| drafts:read | drafts list وget |
| drafts:write | drafts create وupdate وdelete |
| labels:read | labels list وlist-colors وget |
| labels:write | labels 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 لتحصل على المساعدة نفسها في صورة بيانات.