mailbox --- دستکاری صندوقهای پستی در قالبهای گوناگون¶
کد منبع: Lib/mailbox.py
این ماژول دو کلاس Mailbox و Message را برای دسترسی و دستکاری صندوقهای پستی روی دیسک و پیامهای موجود در آنها تعریف میکند. Mailbox نگاشتی شبیه دیکشنری از کلیدها به پیامها ارائه میدهد. Message کلاس Message در ماژول email.message را با وضعیت و رفتار خاص قالب گسترش میدهد. قالبهای پشتیبانیشده صندوق پستی شامل Maildir، mbox، MH، Babyl و MMDF هستند.
همچنین ملاحظه نمائید
- ماژول
email بازنمایی و دستکاری پیامها.
اشیاء Mailbox¶
- class mailbox.Mailbox¶
یک صندوق پستی (mailbox)، که میتوان آن را بازرسی و تغییر داد.
کلاس
Mailboxیک رابط را تعریف میکند و برای نمونهسازی در نظر گرفته نشده است. در عوض، زیرکلاسهای مختص قالب باید ازMailboxارثبری کنند و کد شما باید یک زیرکلاس مشخص را نمونهسازی کند.رابط
Mailboxمانند یک دیکشنری است و کلیدهای کوچکی دارد که به پیامها مربوط میشوند. کلیدها توسط نمونهیMailboxتولید میشوند، همان نمونهای که کلیدها با آن استفاده خواهند شد، و فقط برای همان نمونهیMailboxمعنادار هستند. یک کلید حتی اگر پیام مربوطه تغییر کند، مثلاً با جایگزین شدن آن با پیامی دیگر، همچنان یک پیام را شناسایی میکند.میتوان پیامها را با استفاده از متد مشابه مجموعه (set-like)
add()به یک نمونهMailboxافزود و با استفاده از دستورdelیا متدهای مشابه مجموعه (set-like)remove()وdiscard()آنها را حذف کرد.معناشناسی رابط
Mailboxدر برخی موارد قابلتوجه با معناشناسی دیکشنری تفاوت دارد. هر بار که پیامی درخواست میشود، بازنمایی جدیدی (معمولاً یک نمونهMessage) بر اساس وضعیت فعلی صندوق پستی تولید میشود. بهطور مشابه، هنگامی که پیامی به یک نمونهMailboxاضافه میشود، محتوای بازنمایی پیام ارائهشده کپی میشود. در هیچیک از این دو حالت، مرجعی به بازنمایی پیام توسط نمونهMailboxنگهداری نمیشود.پیمایشگر پیشفرض
Mailboxبهجای کلیدها، روی بازنماییهای پیام تکرار میکند؛ برخلاف پیمایشگر پیشفرضدیکشنریکه روی کلیدها تکرار میکند. علاوه بر این، تغییر صندوق پستی در حین تکرار ایمن و خوشتعریف است. پیامهایی که پس از ایجاد یک پیمایشگر به صندوق پستی افزوده شوند، توسط پیمایشگر دیده نخواهند شد. پیامهایی که پیش از آنکه پیمایشگر آنها را بازگشت دهد، از صندوق پستی حذف شوند، بیسر و صدا رد میشوند؛ هرچند استفاده از کلیدی از پیمایشگر ممکن است در صورتی که پیام متناظر پس از آن حذف شود، به استثنایKeyErrorمنجر شود.هشدار
هنگام تغییر صندوقهای پستی که ممکن است همزمان توسط فرایند دیگری تغییر کنند، بسیار محتاط باشید. امنترین قالب صندوق پستی برای استفاده در چنین وظایفی
Maildirاست؛ سعی کنید برای نوشتن همزمان از قالبهای تکپروندهای مانندmboxاجتناب کنید. اگر در حال تغییر یک صندوق پستی هستید، باید پیش از خواندن هر پیامی در پرونده یا ایجاد هرگونه تغییر از طریق افزودن یا حذف یک پیام، آن را با فراخوانی متدهایlock()وunlock()قفل کنید. عدم قفل کردن صندوق پستی خطر از دست رفتن پیامها یا خراب شدن کل صندوق پستی را به همراه دارد.نمونههای
Mailboxمتدهای زیر را دارند:- add(message)¶
message را به صندوق پستی اضافه میکند و کلیدی را که به آن اختصاص داده شده است برمیگرداند.
پارامتر message میتواند نمونهای از
Message، نمونهای ازemail.message.Message، یک رشته، یک رشتهی بایتی، یا یک شیء شبهپرونده (که باید در حالت دودویی باز باشد) باشد. اگر message نمونهای از زیرکلاسMessageمناسب و مختص قالب باشد (مثلاً اگر نمونهای ازmboxMessageباشد و این نمونهای ازmboxباشد)، از اطلاعات مختص قالب آن استفاده میشود. در غیر این صورت، از پیشفرضهای معقول برای اطلاعات مختص قالب استفاده میشود.تغییر یافته در نسخهی 3.2: پشتیبانی از ورودی دودویی افزوده شد.
- remove(key)¶
- __delitem__(key)¶
- discard(key)¶
پیام متناظر با key را از صندوق پستی حذف میکند.
اگر چنین پیامی وجود نداشته باشد، در صورتی که متد بهصورت
remove()یا__delitem__()فراخوانی شده باشد، استثنایKeyErrorپرتاب میشود، اما اگر متد بهصورتdiscard()فراخوانی شده باشد، هیچ استثنایی پرتاب نمیشود. اگر قالب صندوق پستی زیرین از تغییر همزمان توسط سایر فرآیندها پشتیبانی کند، ممکن است رفتارdiscard()ترجیح داده شود.
- __setitem__(key, message)¶
پیام متناظر با key را با message جایگزین میکند. اگر هیچ پیامی از قبل متناظر با key وجود نداشته باشد، استثنای
KeyErrorپرتاب میکند.مانند
add()، پارامتر message میتواند نمونهای ازMessage، نمونهای ازemail.message.Message، یک رشته، یک رشته بایت، یا یک شیء شبهپرونده (که باید در حالت دودویی باز شده باشد) باشد. اگر message نمونهای از زیرکلاس مناسب و مخصوص قالبِMessageباشد (برای مثال، اگر یک نمونه ازmboxMessageباشد و این یک نمونه ازmboxباشد)، اطلاعات مخصوص قالب آن استفاده میشود. در غیر این صورت، اطلاعات مخصوص قالب پیامی که در حال حاضر متناظر با key است، بدون تغییر باقی میماند.
- keys()¶
همانند
iterkeys()، با این تفاوت که بهجای یک iterator، یکlistبرگردانده میشود
- itervalues()¶
- __iter__()¶
یک iterator بر روی بازنماییهای همه پیامها برمیگرداند. پیامها بهصورت نمونههایی از زیرکلاس
Messageمناسب و مختص قالب بازنمایی میشوند، مگر اینکه هنگام مقداردهی اولیهی نمونهیMailbox، یک کارخانهی پیام سفارشی تعیین شده باشد.توجه
رفتار
__iter__()برخلاف دیکشنریها است، که بر کلیدها تکرار میکنند.
- values()¶
همانند
itervalues()، با این تفاوت که یکlistبهجای یک iterator برگردانده میشود
- iteritems()¶
یک iterator روی جفتهای (key، message) برمیگرداند، که در آن key یک کلید و message یک بازنمایی پیام است. پیامها بهصورت نمونههایی از زیرکلاس
Messageکه مناسب و مختص قالب است بازنمایی میشوند، مگر آنکه یک کارخانه پیام سفارشی هنگام مقداردهی اولیه نمونهMailboxتعیین شده باشد.
- items()¶
مشابه
iteritems()، با این تفاوت که به جای یک iterator از جفتها، یکlistاز جفتها بازگردانده میشود.
- get(key, default=None)¶
- __getitem__(key)¶
بازنمایی پیام متناظر با key را برمیگرداند. اگر چنین پیامی وجود نداشته باشد، در صورتی که متد بهصورت
get()فراخوانی شده باشد، default برگردانده میشود و در صورتی که متد بهصورت__getitem__()فراخوانی شده باشد، استثنایKeyErrorپرتاب میشود. پیام بهصورت نمونهای از زیرکلاسMessageمناسب و مختص قالب بازنمایی میشود، مگر اینکه یک کارخانه پیام سفارشی هنگام مقداردهی اولیه نمونهMailboxتعیین شده باشد.
- get_message(key)¶
بازنمایی پیام متناظر با key را بهعنوان نمونهای از زیرکلاس
Messageمناسب و خاصِ قالب برمیگرداند، یا اگر چنین پیامی وجود نداشته باشد، استثنایKeyErrorرا پرتاب میکند.
- get_bytes(key)¶
نمایش بایتی پیام متناظر با key را برمیگرداند، یا اگر چنین پیامی وجود نداشته باشد، استثنای
KeyErrorرا پرتاب میکند.اضافه شده در نسخهی 3.2.
- get_string(key)¶
نمایش رشتهای پیام مربوط به key را بازمیگرداند، یا اگر چنین پیامی وجود نداشته باشد، استثنای
KeyErrorرا پرتاب میکند. پیام از طریقemail.message.Messageپردازش میشود تا به یک نمایش پاک ۷ بیتی تبدیل شود.
- get_file(key)¶
یک نمایش شبهپرونده از پیام متناظر با key برمیگرداند، یا در صورتی که چنین پیامی وجود نداشته باشد، یک استثنای
KeyErrorرا پرتاب میکند. شیء فایلشبهپروندهی رفتار میکند که گویی در حالت دودویی باز شده است. این پرونده باید هنگامی که دیگر نیازی به آن نیست، بسته شود.تغییر یافته در نسخهی 3.2: شیء پرونده در واقع یک binary file است؛ پیشتر بهاشتباه در حالت متنی بازگردانده میشد. همچنین file-like object اکنون از پروتکل context manager پشتیبانی میکند: میتوانید از یک دستور
withبرای بستن خودکار آن استفاده کنید.توجه
برخلاف سایر بازنماییهای پیامها، بازنماییهای شبهپرونده لزوماً مستقل از نمونهی
Mailboxکه آنها را ایجاد کرده است یا از صندوق پستی زیربنایی نیستند. مستندات دقیقتری توسط هر زیرکلاس ارائه شده است.
- __contains__(key)¶
اگر key متناظر با یک پیام باشد،
Trueو در غیر این صورتFalseرا برمیگرداند.
- __len__()¶
تعداد پیامهای موجود در صندوق پستی را برمیگرداند.
- clear()¶
تمام پیامها را از صندوق پستی حذف کنید.
- pop(key, default=None)¶
بازنمایی پیام متناظر با key را برمیگرداند و پیام را حذف میکند. اگر چنین پیامی وجود نداشته باشد، default را برمیگرداند. پیام بهصورت نمونهای از زیرکلاس
Messageمناسب و مختص قالب بازنمایی میشود، مگر اینکه یک کارخانهی پیام سفارشی (message factory) هنگام مقداردهی اولیه نمونهMailboxتعیین شده باشد.
- popitem()¶
یک جفت (key, message) دلخواه را برمیگرداند، که در آن key یک کلید و message یک بازنمایی از پیام است، و پیام متناظر را حذف میکند. اگر صندوق پستی خالی باشد، استثنای
KeyErrorرا پرتاب میکند. پیام بهصورت نمونهای از زیرکلاسMessageمتناسب با قالب مربوط نمایش داده میشود، مگر اینکه یک کارخانه پیام سفارشی هنگام مقداردهی اولیهی نمونهیMailboxتعیین شده باشد.
- update(arg)¶
پارامتر arg باید یک نگاشت از کلید به پیام یا پیمایشپذیری از جفتهای (کلید، پیام) باشد. صندوق پستی را بهروزرسانی میکند، بهگونهای که برای هر کلید و پیام دادهشده، پیام متناظر با کلید به پیام تنظیم میشود، گویی با استفاده از
__setitem__(). مانند__setitem__()، هر کلید باید از قبل با پیامی در صندوق پستی متناظر باشد، در غیر این صورت یک استثنایKeyErrorپرتاب خواهد شد؛ بنابراین بهطور کلی نادرست است که arg نمونهای ازMailboxباشد.توجه
برخلاف دیکشنریها، آرگومانهای کلیدواژهای پشتیبانی نمیشوند.
- flush()¶
هرگونه تغییر در انتظار را در سامانه فایلبندی مینویسد. برای برخی از زیرکلاسهای
Mailbox، تغییرات همیشه بلافاصله نوشته میشوند وflush()هیچ کاری انجام نمیدهد، اما شما همچنان باید عادت به فراخوانی این متد داشته باشید.
- lock()¶
یک قفل توصیهای انحصاری (advisory lock) روی صندوق پستی کسب میشود تا سایر فرآیندها بدانند که نباید آن را تغییر دهند. اگر قفل در دسترس نباشد، استثنای
ExternalClashErrorپرتاب میشود. سازوکارهای قفلسازی خاصی که استفاده میشوند، به قالب صندوق پستی بستگی دارند. شما باید همیشه پیش از ایجاد هرگونه تغییر در محتوای صندوق پستی، آن را قفل کنید.
- unlock()¶
قفل صندوق پستی را، در صورت وجود، آزاد کنید.
- close()¶
صندوق پستی را تخلیه کنید، در صورت نیاز قفل آن را باز کنید و هر پرونده بازی را ببندید. برای برخی از زیرکلاسهای
Mailbox، این متد هیچ کاری انجام نمیدهد.
اشیای Maildir¶
- class mailbox.Maildir(dirname, factory=None, create=True)¶
یک زیرکلاس از
Mailboxبرای صندوقهای پستی با قالب Maildir. پارامتر factory یک شیء فراخوانیپذیر است که یک بازنمایی پیام شبهپرونده (که گویی در حالت دودویی باز شده است) میپذیرد و یک بازنمایی سفارشی برمیگرداند. اگر factoryNoneباشد،MaildirMessageبه عنوان بازنمایی پیشفرض پیام استفاده میشود. اگر createTrueباشد، صندوق پستی در صورتی که وجود نداشته باشد ایجاد میشود.اگر create برابر
Trueباشد و مسیر dirname وجود داشته باشد، با آن بهعنوان یک maildir موجود رفتار میشود، بدون اینکه تلاش شود چیدمان پوشهی آن تأیید شود.به دلایل تاریخی است که dirname به این صورت نامگذاری شده است، نه path.
Maildir یک قالب صندوق پستی مبتنی بر پوشه است که برای عامل انتقال ایمیل qmail ابداع شده است و اکنون بهطور گسترده توسط برنامههای دیگر پشتیبانی میشود. پیامهای یک صندوق پستی Maildir در پروندههای جداگانه در یک ساختار پوشهای مشترک ذخیره میشوند. این طراحی به چندین برنامه غیرمرتبط اجازه میدهد بدون خرابی دادهها به صندوقهای پستی Maildir دسترسی پیدا کنند و آنها را تغییر دهند، بنابراین نیازی به قفل کردن پرونده نیست.
صندوقهای پستی Maildir شامل سه زیرپوشه به نامهای
tmp،newوcurهستند. پیامها بهصورت موقت در زیرپوشهیtmpایجاد میشوند و سپس برای نهاییکردن تحویل به زیرپوشهیnewمنتقل میشوند. ممکن است یک عامل کاربر پستی (mail user agent) بعداً پیام را به زیرپوشهیcurمنتقل کند و اطلاعات مربوط به وضعیت پیام را در بخش ویژهی "info" ذخیره کند که به نام پرونده آن افزوده شده است.پوشههایی به سبک معرفیشده توسط عامل انتقال ایمیل Courier نیز پشتیبانی میشوند. هر زیرپوشهای از صندوق پستی اصلی، اگر
'.'نخستین نویسهی نام آن باشد، یک پوشه محسوب میشود. نام پوشهها توسطMaildirبدون'.'آغازین نمایش داده میشوند. هر پوشه، خود یک صندوق پستی Maildir است، اما نباید شامل پوشههای دیگر باشد. در عوض، تودرتویی منطقی با استفاده از'.'برای جدا کردن سطحها نشان داده میشود، برای مثال "Archived.2005.07".- colon¶
مشخصات Maildir استفاده از دونقطه (
':') را در برخی نام پروندههای پیام الزامی میداند. با این حال، برخی سیستمعاملها استفاده از این نویسه در نام پروندهها را مجاز نمیدانند. اگر مایلید از قالبی مشابه Maildir در چنین سیستمعاملی استفاده کنید، باید نویسه دیگری را برای استفاده بهجای آن مشخص کنید. علامت تعجب ('!') انتخاب رایجی است. برای مثال:import mailbox mailbox.Maildir.colon = '!'
ویژگی
colonهمچنین میتواند بهازای هر نمونه تنظیم شود.
تغییر یافته در نسخهی 3.13:
Maildirاکنون پروندههایی را که با یک نقطه شروع میشوند، نادیده میگیرد.نمونههای
Maildirعلاوه بر متدهای زیر، تمامی متدهایMailboxرا دارند:- list_folders()¶
فهرستی از نامهای تمام پوشهها را برمیگرداند.
- get_folder(folder)¶
یک نمونه
Maildirبرمیگرداند که نشاندهنده پوشهای است که نام آن folder است. اگر پوشه وجود نداشته باشد، استثنایNoSuchMailboxErrorپرتاب میشود.
- add_folder(folder)¶
پوشهای با نام folder ایجاد کنید و یک نمونه
Maildirرا که نشاندهنده آن است، برگردانید.
- remove_folder(folder)¶
پوشهای را که نام آن folder است حذف کنید. اگر پوشه حاوی پیامی باشد، استثنای
NotEmptyErrorپرتاب میشود و پوشه حذف نخواهد شد.
- clean()¶
پروندههای موقتی را که در ۳۶ ساعت گذشته به آنها دسترسی پیدا نشده است، از صندوق پستی حذف کنید. مشخصات Maildir میگوید که برنامههای خواندن پست باید این کار را هر از گاهی انجام دهند.
- get_flags(key)¶
پرچمهای تنظیمشده روی پیام متناظر با key را بهصورت یک رشته برمیگرداند. این معادل
get_message(key).get_flags()است، اما بسیار سریعتر است، زیرا پرونده پیام را باز نمیکند. هنگام پیمایش روی کلیدها از این متد استفاده کنید تا تعیین کنید کدام پیامها برای دریافت جالب هستند.اگر یک شیء
MaildirMessageدارید، در عوض از متدget_flags()آن استفاده کنید، زیرا تغییرات اعمالشده توسط متدهایset_flags()،add_flag()وremove_flag()پیام، تا زمانی که متد__setitem__()صندوق پستی فراخوانی نشود، در اینجا منعکس نمیشوند.اضافه شده در نسخهی 3.13.
- set_flags(key, flags)¶
برای پیام متناظر با key، پرچمهای مشخصشده با flags را تنظیم میکند و تمام بقیه را برمیدارد. فراخوانی
some_mailbox.set_flags(key, flags)مشابه زیر استone_message = some_mailbox.get_message(key) one_message.set_flags(flags) some_mailbox[key] = one_message
اما سریعتر است، زیرا پروندهی پیام را باز نمیکند.
اگر یک شیء
MaildirMessageدارید، بهجای آن از متدset_flags()آن استفاده کنید، زیرا تغییرات اعمالشده با این متد صندوق پستی، برای متد شیء پیام،get_flags()، قابل مشاهده نخواهد بود.اضافه شده در نسخهی 3.13.
- add_flag(key, flag)¶
برای پیام متناظر با key، پرچمهای مشخصشده توسط flag را بدون تغییر دادن پرچمهای دیگر تنظیم کنید. برای افزودن بیش از یک پرچم بهصورت همزمان، flag میتواند رشتهای با بیش از یک نویسه باشد.
ملاحظات استفاده از این متد در مقایسه با متد
add_flag()شیء پیام، مشابه ملاحظات مربوط بهset_flags()است؛ به بحث موجود در آنجا مراجعه کنید.اضافه شده در نسخهی 3.13.
- remove_flag(key, flag)¶
در پیام متناظر با key، پرچمهای مشخصشده با flag را بدون تغییر سایر پرچمها بردارید. برای حذف همزمان بیش از یک پرچم، flag میتواند رشتهای با بیش از یک نویسه باشد.
ملاحظات استفاده از این متد در مقایسه با متد
remove_flag()شیء پیام، مشابه ملاحظاتset_flags()است؛ به بحث آنجا مراجعه کنید.اضافه شده در نسخهی 3.13.
- get_info(key)¶
رشتهای حاوی اطلاعات پیام متناظر با key برمیگرداند. این معادل
get_message(key).get_info()است، اما بسیار سریعتر است، زیرا پرونده پیام را باز نمیکند. هنگام پیمایش کلیدها از این متد استفاده کنید تا مشخص کنید کدام پیامها برای دریافت مورد نظر هستند.اگر یک شیء
MaildirMessageدارید، بهجای آن از متدget_info()آن استفاده کنید، زیرا تغییرات ایجادشده توسط متدset_info()پیام تا زمانی که متد__setitem__()صندوق پستی فراخوانی نشود، در اینجا بازتاب داده نمیشوند.اضافه شده در نسخهی 3.13.
- set_info(key, info)¶
اطلاعات پیام متناظر با key را روی info تنظیم میکند. فراخوانی
some_mailbox.set_info(key, flags)مشابه این استone_message = some_mailbox.get_message(key) one_message.set_info(info) some_mailbox[key] = one_message
اما سریعتر است، زیرا پروندهی پیام را باز نمیکند.
اگر یک شیء
MaildirMessageدارید، بهجای آن از متدset_info()آن استفاده کنید، زیرا تغییرات اعمالشده با این متد صندوق پستی برای متد شیء پیام،get_info()، قابل مشاهده نخواهد بود.اضافه شده در نسخهی 3.13.
برخی از متدهای
Mailboxکه توسطMaildirپیادهسازی شدهاند، شایستهی نکات ویژهای هستند:- add(message)¶
- __setitem__(key, message)¶
- update(arg)¶
هشدار
این متدها نامهای یکتای پرونده را بر اساس شناسه فرآیند جاری تولید میکنند. هنگام استفاده از چندین نخ، ممکن است تداخلهای نامی تشخیصدادهنشده رخ دهند و باعث خرابی صندوق پستی شوند، مگر آنکه میان نخها هماهنگی ایجاد شود تا از استفاده همزمان از این متدها برای دستکاری یک صندوق پستی یکسان جلوگیری شود.
- flush()¶
تمام تغییرات در صندوقهای پستی Maildir بلافاصله اعمال میشوند، بنابراین این متد هیچ کاری انجام نمیدهد.
- lock()¶
- unlock()¶
صندوقهای پستی Maildir از قفلکردن پشتیبانی نمیکنند (یا به آن نیاز ندارند)، بنابراین این متدها هیچ کاری انجام نمیدهند.
- close()¶
نمونههای
Maildirهیچ پرونده بازی را باز نگه نمیدارند و صندوقهای پستی زیربنایی از قفلکردن پشتیبانی نمیکنند، بنابراین این متد هیچ کاری انجام نمیدهد.
- get_file(key)¶
بسته به پلتفرم میزبان، ممکن است در حالی که پرونده برگرداندهشده باز باقی میماند، تغییر یا حذف پیام زیربنایی امکانپذیر نباشد.
همچنین ملاحظه نمائید
- صفحه راهنمای maildir از Courier
مشخصاتی از قالب. افزونهای رایج را برای پشتیبانی از پوشهها توصیف میکند.
- استفاده از قالب maildir
یادداشتهایی درباره Maildir از مخترع آن. شامل یک طرحواره بهروزشده برای ایجاد نام و جزئیاتی درباره معنای «info» است.
اشیاء mbox¶
- class mailbox.mbox(path, factory=None, create=True)¶
یک زیرکلاس از
Mailboxبرای صندوقهای پستی با قالب mbox. پارامتر factory یک شیء فراخوانیپذیر است که یک بازنمایی پیام شبهپرونده (که طوری رفتار میکند که گویی در حالت دودویی باز شده است) را میپذیرد و یک بازنمایی سفارشی را برمیگرداند. اگر factory برابرNoneباشد، ازmboxMessageبه عنوان بازنمایی پیشفرض پیام استفاده میشود. اگر create برابرTrueباشد، صندوق پستی در صورتی که وجود نداشته باشد، ایجاد میشود.قالب mbox، قالب کلاسیک برای ذخیرهی ایمیل در سیستمهای یونیکسی است. همهی پیامهای یک صندوق پستی mbox در یک پرونده واحد ذخیره میشوند و آغاز هر پیام با خطی مشخص میشود که پنج نویسهی نخست آن "From " است.
چندین گونه از قالب mbox برای برطرف کردن کاستیهای بهنظر رسیده در قالب اصلی وجود دارد. به منظور سازگاری،
mboxقالب اصلی را پیادهسازی میکند، که گاهی با عنوان mboxo شناخته میشود. این بدان معناست که سرآیند Content-Length، در صورت وجود، نادیده گرفته میشود و هر مورد از "From " در ابتدای یک خط در بدنهی پیام هنگام ذخیرهی پیام به ">From " تبدیل میشود، اگرچه موارد ">From " هنگام خواندن پیام به "From " تبدیل نمیشوند.برخی از متدهای
Mailboxکه توسطmboxپیادهسازی شدهاند، شایسته نکات ویژهای هستند:- get_bytes(key, from_=False)¶
توجه: این متد در مقایسه با سایر کلاسها یک پارامتر اضافی (from_) دارد. نخستین خط از یک ورودی پرونده mbox، خط "From " یونیکس است. اگر from_ برابر False باشد، خط اول پرونده حذف میشود.
- get_file(key, from_=False)¶
استفاده از پرونده پس از فراخوانی
flush()یاclose()بر روی نمونهیmboxممکن است نتایج غیرقابلپیشبینی به همراه داشته باشد یا استثنایی پرتاب کند.توجه: این متد در مقایسه با سایر کلاسها یک پارامتر اضافی (from_) دارد. نخستین خط از یک ورودی پرونده mbox، خط "From " یونیکس است. اگر from_ برابر False باشد، خط اول پرونده حذف میشود.
- get_string(key, from_=False)¶
توجه: این متد در مقایسه با سایر کلاسها یک پارامتر اضافی (from_) دارد. نخستین خط از یک ورودی پرونده mbox، خط "From " یونیکس است. اگر from_ برابر False باشد، خط اول پرونده حذف میشود.
همچنین ملاحظه نمائید
- صفحهی man مربوط به mbox از tin
مشخصات قالب، همراه با جزئیاتی درباره قفلگذاری.
- پیکربندی Netscape Mail در یونیکس: چرا قالب Content-Length بد است
آرگومانی برای استفاده از قالب اصلی mbox بهجای یک گونهی متفاوت.
- "mbox" خانوادهای از چندین قالب صندوق پستی است که با یکدیگر ناسازگار هستند
تاریخچهای از انواع mbox.
اشیای MH¶
- class mailbox.MH(path, factory=None, create=True)¶
زیرکلاسی از
Mailboxبرای صندوقهای پستی در قالب MH. پارامتر factory یک شیء فراخوانیپذیر است که یک بازنمایی پیام شبهپرونده (که طوری رفتار میکند که گویی در حالت دودویی باز شده است) را میپذیرد و یک بازنمایی سفارشی را برمیگرداند. اگر factory برابرNoneباشد، ازMHMessageبهعنوان بازنمایی پیشفرض پیام استفاده میشود. اگر create برابرTrueباشد، صندوق پستی در صورتی که وجود نداشته باشد ایجاد میشود.MH یک قالب صندوق پستی مبتنی بر پوشه است که برای MH Message Handling System، یک عامل کاربر پست، ابداع شده است. هر پیام در یک صندوق پستی MH در پرونده مستقل خود قرار دارد. یک صندوق پستی MH ممکن است علاوه بر پیامها، شامل صندوقهای پستی MH دیگر (به نام پوشهها <folders>) باشد. پوشهها میتوانند بهطور نامحدود تودرتو شوند. صندوقهای پستی MH همچنین از دنبالهها <sequences> پشتیبانی میکنند، که فهرستهای نامگذاریشدهای هستند که برای گروهبندی منطقی پیامها بدون جابهجایی آنها به پوشههای فرعی استفاده میشوند. دنبالهها در پروندهای به نام
.mh_sequencesدر هر پوشه تعریف میشوند.کلاس
MHصندوقهای پستی MH را دستکاری میکند، اما تلاش نمیکند تمام رفتارهای mh را شبیهسازی کند. بهطور خاص، پروندههایcontextیا.mh_profileرا که mh برای ذخیره وضعیت و پیکربندی خود از آنها استفاده میکند، تغییر نمیدهد و تحت تأثیر آنها قرار نمیگیرد.نمونههای
MHعلاوه بر موارد زیر، تمامی متدهایMailboxرا دارند:تغییر یافته در نسخهی 3.13: پوشههای پشتیبانیشده که حاوی پرونده
.mh_sequencesنیستند.- list_folders()¶
فهرستی از نامهای تمام پوشهها را برمیگرداند.
- get_folder(folder)¶
یک نمونه
MHرا برمیگرداند که نشاندهنده پوشهای با نام folder است. اگر پوشه وجود نداشته باشد، استثنایNoSuchMailboxErrorپرتاب میشود.
- add_folder(folder)¶
پوشهای با نام folder ایجاد میکند و نمونهای از
MHرا برمیگرداند که نشاندهنده آن است.
- remove_folder(folder)¶
پوشهای را که نام آن folder است حذف کنید. اگر پوشه حاوی پیامی باشد، استثنای
NotEmptyErrorپرتاب میشود و پوشه حذف نخواهد شد.
- get_sequences()¶
یک دیکشنری از نامهای دنباله که به فهرستهای کلید نگاشت شدهاند را برمیگرداند. اگر هیچ دنبالهای وجود نداشته باشد، دیکشنری خالی برمیگردد.
- set_sequences(sequences)¶
دنبالههای موجود در صندوق پستی را بر اساس sequences بازتعریف کنید؛ sequences دیکشنریای از نامها است که به فهرستهای کلید نگاشت شدهاند، مانند آنچه
get_sequences()برمیگرداند.
- pack()¶
پیامهای موجود در صندوق پستی در صورت لزوم تغییر نام داده میشوند تا فاصلههای موجود در شمارهگذاری برطرف شوند. ورودیهای فهرست دنبالهها (sequences) بهطور متناظر بهروزرسانی میشوند.
توجه
کلیدهای از پیش اکسپورت شده با این عملیات باطل میشوند و نباید پس از آن استفاده شوند.
برخی متدهای
Mailboxکه توسطMHپیادهسازی شدهاند، شایستهی نکات ویژهای هستند:- remove(key)¶
- __delitem__(key)¶
- discard(key)¶
این متدها پیام را بلافاصله حذف میکنند. از قرارداد MH برای علامتگذاری یک پیام جهت حذف با افزودن کاما به ابتدای نام آن استفاده نمیشود.
- lock()¶
- unlock()¶
از سه سازوکار قفل استفاده میشود---قفل نقطهای و، در صورت موجود بودن، فراخوانیهای سیستمی
flock()وlockf(). برای صندوقهای پستی MH، قفل کردن صندوق پستی به معنای قفل کردن پروندهی.mh_sequencesو، فقط در طول هر عملیاتی که بر آنها اثر میگذارد، قفل کردن پروندههای پیام جداگانه است.
- get_file(key)¶
بسته به سکوی میزبان، ممکن است نتوان پیام زیربنایی را در حالی که پرونده برگرداندهشده باز باقی میماند، حذف کرد.
- flush()¶
تمام تغییرات در صندوقهای پستی MH بلافاصله اعمال میشوند، بنابراین این متد کاری انجام نمیدهد.
همچنین ملاحظه نمائید
- nmh - Message Handling System
صفحهی خانگی nmh، نسخهای بهروزشده از mh اصلی.
- MH و nmh: ایمیل برای کاربران و برنامهنویسان
کتابی دارای پروانه GPL دربارهی mh و nmh، همراه با مقداری اطلاعات دربارهی قالب صندوق پستی .
اشیای Babyl¶
- class mailbox.Babyl(path, factory=None, create=True)¶
زیرکلاسی از
Mailboxبرای صندوقهای پستی در قالب Babyl. پارامتر factory یک شیء فراخوانیپذیر است که یک بازنمایی شبهپرونده از پیام (که مانند پروندهای که در حالت دودویی باز شده باشد رفتار میکند) میپذیرد و یک بازنمایی سفارشی را برمیگرداند. اگر factory برابرNoneباشد، ازBabylMessageبه عنوان بازنمایی پیشفرض پیام استفاده میشود. اگر create برابرTrueباشد، صندوق پستی در صورتی که وجود نداشته باشد ایجاد میشود.Babyl یک قالب صندوق پستی تکپروندهای است که توسط عامل کاربر پست الکترونیکی Rmail، که همراه با Emacs ارائه شده است، استفاده میشود. آغاز یک پیام با خطی مشخص میشود که شامل دو نویسهی Control-Underscore (
'\037') و Control-L ('\014') است. پایان یک پیام با آغاز پیام بعدی یا، در مورد آخرین پیام، با سطری شامل یک نویسهی Control-Underscore ('\037') مشخص میشود.پیامهای موجود در یک صندوق پستی Babyl دارای دو مجموعه سرآیند هستند: سرآیندهای اصلی و سرآیندهای بهاصطلاح قابلمشاهده. سرآیندهای قابلمشاهده معمولاً زیرمجموعهای از سرآیندهای اصلی هستند که دوباره قالببندی یا خلاصه شدهاند تا جذابتر شوند. هر پیام در یک صندوق پستی Babyl همچنین یک فهرست همراه از برچسبها <labels> دارد، یا رشتههای کوتاهی که اطلاعات اضافی درباره پیام را ثبت میکنند، و فهرستی از همه برچسبهای تعریفشده توسط کاربر که در صندوق پستی وجود دارند، در بخش گزینههای Babyl نگهداری میشود.
نمونههای
Babylعلاوه بر تمامی متدهایMailbox، موارد زیر را نیز دارند:- get_labels()¶
فهرستی از نامهای تمام برچسبهای تعریفشده توسط کاربر استفادهشده در صندوق پستی را برمیگرداند.
توجه
به جای مراجعه به فهرست برچسبها در بخش گزینههای Babyl، پیامهای واقعی بررسی میشوند تا تعیین شود کدام برچسبها در صندوق پستی وجود دارند، اما هر زمان که صندوق پستی تغییر کند، بخش Babyl بهروزرسانی میشود.
برخی متدهای
Mailboxکه درBabylپیادهسازی شدهاند، شایستهی نکات خاصی هستند:- get_file(key)¶
در صندوقهای پستی Babyl، سرآیندهای یک پیام بهصورت پیوسته با بدنه پیام ذخیره نمیشوند. برای تولید یک بازنمایی شبهپرونده، سرآیندها و بدنه با هم در نمونهای از
io.BytesIOرونوشت میشوند که API آن با API یک پرونده یکسان است. در نتیجه، شیء شبهپرونده واقعاً از صندوق پستی زیربنایی مستقل است، اما در مقایسه با یک بازنمایی رشتهای، باعث صرفهجویی در حافظه نمیشود.
همچنین ملاحظه نمائید
- قالب پروندههای Babyl نسخهی 5
مشخصات قالب Babyl.
- خواندن ایمیل با Rmail
راهنمای Rmail، همراه با اطلاعاتی درباره معناشناسی Babyl.
اشیای MMDF¶
- class mailbox.MMDF(path, factory=None, create=True)¶
زیرکلاسی از
Mailboxبرای صندوقهای پستی با قالب MMDF. پارامتر factory یک شیء فراخوانیپذیر است که یک بازنمایی پیام شبهپرونده (که طوری رفتار میکند که گویی در حالت دودویی باز شده است) میپذیرد و یک بازنمایی سفارشی را برمیگرداند. اگر factory برابرNoneباشد، ازMMDFMessageبهعنوان بازنمایی پیشفرض پیام استفاده میشود. اگر create برابرTrueباشد، در صورتی که صندوق پستی وجود نداشته باشد، ایجاد میشود.MMDF یک قالب صندوق پستی تکپروندهای است که برای Multichannel Memorandum Distribution Facility، یک عامل انتقال ایمیل، ابداع شده است. هر پیام همان شکل یک پیام mbox را دارد، اما پیش و پس از آن با سطرهایی شامل چهار نویسه Control-A (
'\001') محصور شده است. مانند قالب mbox، آغاز هر پیام با خطی مشخص میشود که پنج نویسه نخست آن "From " است، اما موارد اضافی "From " هنگام ذخیرهسازی پیامها به ">From " تبدیل نمیشوند، زیرا سطرهای جداکننده اضافی پیام مانع از اشتباه گرفتن این موارد با آغاز پیامهای بعدی میشوند.برخی از متدهای
Mailboxکه توسطMMDFپیادهسازی شدهاند، شایستهی نکات ویژهای هستند:- get_bytes(key, from_=False)¶
توجه: این متد در مقایسه با سایر کلاسها یک پارامتر اضافی (from_) دارد. نخستین خط از یک ورودی پرونده mbox، خط "From " یونیکس است. اگر from_ برابر False باشد، خط اول پرونده حذف میشود.
- get_file(key, from_=False)¶
استفاده از پرونده پس از فراخوانی
flush()یاclose()بر روی نمونهیMMDFممکن است نتایج غیرقابلپیشبینی به همراه داشته باشد یا استثنایی پرتاب کند.توجه: این متد در مقایسه با سایر کلاسها یک پارامتر اضافی (from_) دارد. نخستین خط از یک ورودی پرونده mbox، خط "From " یونیکس است. اگر from_ برابر False باشد، خط اول پرونده حذف میشود.
همچنین ملاحظه نمائید
- صفحه man مربوط به mmdf از tin
مشخصات قالب MMDF از مستندات tin، یک خبرخوان.
- MMDF
مقالهای در ویکیپدیا که Multichannel Memorandum Distribution Facility را توصیف میکند.
اشیای Message¶
- class mailbox.Message(message=None)¶
زیرکلاسی از
Messageدر ماژولemail.message. زیرکلاسهایmailbox.Messageوضعیت و رفتار خاص قالب صندوق پستی را میافزایند.اگر message حذف شود، نمونه جدید در یک وضعیت پیشفرض و خالی ایجاد میشود. اگر message یک نمونه از
email.message.Messageباشد، محتوای آن کپی میشود؛ علاوه بر این، اگر message یک نمونه ازMessageباشد، هرگونه اطلاعات خاص قالب تا حد امکان تبدیل میشود. اگر message یک رشته، یک رشته بایت یا یک پرونده باشد، باید حاوی پیامی مطابق با RFC 5322باشد، که خوانده و تجزیه میشود. پروندهها باید در حالت دودویی باز باشند، اما پروندههای حالت متنی برای سازگاری با نسخههای قبلی پذیرفته میشوند.وضعیتها و رفتارهای مختص قالب که زیرکلاسها ارائه میدهند متفاوتاند، اما بهطور کلی تنها ویژگیهایی پشتیبانی میشوند که مختص یک صندوقنامه مشخص نیستند (اگرچه احتمالاً این ویژگیها مختص یک قالب صندوقنامه مشخص هستند). برای مثال، آفستهای پرونده برای قالبهای صندوقنامه تکپروندهای و نامهای پرونده برای قالبهای صندوقنامه مبتنی بر پوشه حفظ نمیشوند، زیرا فقط برای صندوقنامه اصلی کاربرد دارند. اما وضعیتی مانند اینکه پیامی توسط کاربر خوانده شده باشد یا بهعنوان مهم علامتگذاری شده باشد حفظ میشود، زیرا به خود پیام مربوط میشود.
الزامی وجود ندارد که از نمونههای
Messageبرای نمایش پیامهای بازیابیشده با استفاده از نمونههایMailboxاستفاده شود. در برخی موقعیتها، ممکن است زمان و حافظهی مورد نیاز برای تولید بازنماییهایMessageقابل قبول نباشد. برای چنین موقعیتهایی، نمونههایMailboxهمچنین بازنماییهای رشتهای و شبهپروندهای را ارائه میدهند، و میتوان یک کارخانهی پیام سفارشی را هنگام راهاندازی نمونهای ازMailboxتعیین کرد.
اشیای MaildirMessage¶
- class mailbox.MaildirMessage(message=None)¶
پیامی با رفتارهای خاص Maildir. پارامتر message همان معنایی را دارد که در سازندهی
Messageدارد.معمولاً یک برنامه عامل کاربر پست، همهی پیامهای درون زیرپوشهی
newرا پس از نخستین باری که کاربر صندوق پست را باز و بسته میکند، به زیرپوشهیcurمنتقل میکند و قدیمی بودن پیامها را، خواه واقعاً خوانده شده باشند خواه نه، ثبت میکند. به نام پرونده هر پیام درcurیک بخش "info" افزوده میشود تا اطلاعات مربوط به وضعیت آن ذخیره شود. (برخی پستخوانها ممکن است یک بخش "info" نیز به پیامهای درونnewاضافه کنند.) بخش "info" ممکن است یکی از دو حالت را داشته باشد: ممکن است شامل "2," باشد و پس از آن فهرستی از پرچمهای استانداردشده بیاید (مثلاً "2,FR") یا ممکن است شامل "1," باشد و پس از آن اطلاعات بهاصطلاح آزمایشی بیاید. پرچمهای استاندارد پیامهای Maildir به شرح زیر هستند:پرچم
معنی
توضیح
D
پیشنویس
درحال نوشته شدن
F
پرچمدار
بهعنوان مهم علامتگذاری شده
P
باز فرستادهشده
بازارسالشده، دوباره ارسالشده، یا برگشتخورده
R
پاسخدادهشده
پاسخ دادهشده به
S
دیدهشده
خواندهشده
T
حذفشده
علامتگذاریشده برای حذف بعدی
نمونههای
MaildirMessageمتدهای زیر را ارائه میدهند:- get_subdir()¶
«new» (اگر پیام باید در زیرپوشهی
newذخیره شود) یا «cur» (اگر پیام باید در زیرپوشهیcurذخیره شود) را برگردانید.توجه
یک پیام معمولاً پس از دسترسی به صندوق پستی آن، از
newبهcurمنتقل میشود، چه پیام خواندهشده باشد و چه نشده باشد. اگر"S" in msg.get_flags()برابرTrueباشد، پیامmsgخواندهشده است.
- set_subdir(subdir)¶
زیرپوشهای را که پیام باید در آن ذخیره شود، تنظیم کنید. پارامتر subdir باید "new" یا "cur" باشد.
- get_flags()¶
رشتهای را برمیگرداند که پرچمهایی را که در حال حاضر تنظیم شدهاند، مشخص میکند. اگر پیام با قالب استاندارد Maildir مطابقت داشته باشد، نتیجه، الحاق صفر یا یک رخداد از هر یک از
'D'،'F'،'P'،'R'،'S'و'T'به ترتیب الفبایی است. اگر هیچ پرچمی تنظیمنشده باشد یا "info" دارای معناشناسی آزمایشی باشد، رشتهی خالی برگردانده میشود.
- set_flags(flags)¶
پرچمهای مشخصشده با flags را فعال کرده و بقیه را غیرفعال میکند.
- add_flag(flag)¶
پرچم(های) مشخصشده با flag را بدون تغییر سایر پرچمها تنظیم کنید. برای افزودن بیش از یک پرچم در یک زمان، flag میتواند رشتهای با بیش از یک نویسه باشد. "info" فعلی بازنویسی میشود، خواه حاوی اطلاعات آزمایشی بهجای پرچمها باشد، خواه نباشد.
- remove_flag(flag)¶
پرچم(های) مشخصشده با flag را بدون تغییر سایر پرچمها غیرفعال میکند. برای حذف بیش از یک پرچم بهصورت همزمان، flag میتواند رشتهای با بیش از یک نویسه باشد. اگر "info" بهجای پرچمها حاوی اطلاعات آزمایشی باشد، "info" فعلی تغییر نمیکند.
- get_date()¶
تاریخ تحویل پیام را بهصورت یک عدد ممیز شناور برمیگرداند که نشاندهندهی ثانیههای سپریشده از مبدأ است.
- set_date(date)¶
تاریخ تحویل پیام را روی date تنظیم کنید، عددی اعشاری که ثانیههای سپریشده از مبدا زمان را نشان میدهد.
- get_info()¶
رشتهای حاوی "info" برای یک پیام برمیگرداند. این برای دسترسی و اصلاح "info" آزمایشی (یعنی نه فهرستی از پرچمها) مفید است.
- set_info(info)¶
"info" را روی info تنظیم کنید، که باید یک رشته باشد.
هنگامی که یک نمونه MaildirMessage بر اساس یک نمونه mboxMessage یا MMDFMessage ایجاد میشود، سرآیندهای Status و X-Status حذف میشوند و تبدیلهای زیر انجام میشوند:
وضعیت حاصل |
وضعیت |
|---|---|
زیرپوشهی "cur" |
پرچم O |
پرچم F |
پرچم F |
پرچم R |
پرچم A |
پرچم S |
پرچم R |
پرچم T |
پرچم D |
هنگامی که یک نمونه MaildirMessage بر اساس یک نمونه MHMessage ایجاد میشود، تبدیلهای زیر انجام میشوند:
وضعیت حاصل |
وضعیت |
|---|---|
زیرپوشهی "cur" |
دنبالهی «unseen» |
زیرپوشهی "cur" و پرچم S |
بدون دنبالهی «unseen» |
پرچم F |
دنبالهی «flagged» |
پرچم R |
دنبالهی "replied" |
هنگامی که یک نمونه از MaildirMessage بر اساس یک نمونه از BabylMessage ایجاد میشود، تبدیلهای زیر انجام میشود:
وضعیت حاصل |
وضعیت |
|---|---|
زیرپوشهی "cur" |
برچسب "unseen" |
زیرپوشهی "cur" و پرچم S |
بدون برچسب «unseen» |
پرچم P |
برچسب «forwarded» یا «resent» |
پرچم R |
برچسب «answered» |
پرچم T |
برچسب «deleted» |
اشیاءِ mboxMessage¶
- class mailbox.mboxMessage(message=None)¶
پیامی با رفتارهای ویژهی mbox. پارامتر message همان معنایی را دارد که در سازندهی
Messageدارد.پیامها در یک صندوق پستی mbox با هم در یک پرونده واحد ذخیره میشوند. نشانی پاکت فرستنده و زمان تحویل معمولاً در خطی ذخیره میشوند که با "From " آغاز میشود و برای نشان دادن آغاز یک پیام استفاده میشود، هرچند در قالب دقیق این دادهها میان پیادهسازیهای mbox تفاوت قابلتوجهی وجود دارد. پرچمهایی که وضعیت پیام را نشان میدهند، مانند اینکه پیام خوانده شده باشد یا بهعنوان مهم علامتگذاری شده باشد، معمولاً در سرآیندهای Status و X-Status ذخیره میشوند.
پرچمهای مرسوم برای پیامهای mbox به شرح زیر است:
پرچم
معنی
توضیح
R
خواندهشده
خواندهشده
O
قدیمی
پیشتر توسط MUA شناسایی شده است
D
حذفشده
علامتگذاریشده برای حذف بعدی
F
پرچمدار
بهعنوان مهم علامتگذاری شده
A
پاسخ دادهشده
پاسخ دادهشده به
پرچمهای «R» و «O» در سرآیند Status ذخیره میشوند، و پرچمهای «D»، «F» و «A» در سرآیند X-Status ذخیره میشوند. پرچمها و سرآیندها معمولاً به ترتیب ذکرشده ظاهر میشوند.
نمونههای
mboxMessageمتدهای زیر را ارائه میدهند:- get_from()¶
رشتهای را برمیگرداند که نشاندهندهی خط "From " است؛ خطی که آغاز پیام در یک صندوق پستی mbox را علامتگذاری میکند. "From " ابتدایی و نویسهی خط جدید پایانی لحاظ نمیشوند.
- set_from(from_, time_=None)¶
خط "From " را روی from_ تنظیم کنید، که باید بدون "From " در ابتدا یا خط جدید در انتها مشخص شود. برای راحتی، میتوان time_ را مشخص کرد؛ در این صورت بهطور مناسب قالببندی میشود و به from_ اضافه خواهد شد. اگر time_ مشخص شده باشد، باید یک نمونه از
time.struct_time، یک تاپل مناسب برای ارسال بهtime.strftime()، یاTrueباشد (برای استفاده ازtime.gmtime()).
- get_flags()¶
رشتهای را برمیگرداند که پرچمهایی را که در حال حاضر تنظیم شدهاند مشخص میکند. اگر پیام با قالب مرسوم مطابقت داشته باشد، نتیجه الحاق ۰ یا ۱ مورد از هر یک از
'R'،'O'،'D'،'F'و'A'، به ترتیب زیر است.
- set_flags(flags)¶
پرچمهای مشخصشده با flags را تنظیم و تمام پرچمهای دیگر را غیرفعال میکند. پارامتر flags باید حاصل الحاق صفر یا چند مورد از هر یک از
'R'،'O'،'D'،'F'و'A'به هر ترتیبی باشد.
- add_flag(flag)¶
پرچم(های) مشخصشده با flag را بدون تغییر سایر پرچمها تنظیم کنید. برای افزودن بیش از یک پرچم بهطور همزمان، flag میتواند رشتهای با بیش از یک نویسه باشد.
- remove_flag(flag)¶
پرچم(های) مشخصشده با flag را بدون تغییر دادن سایر پرچمها غیرفعال کنید. برای حذف همزمان بیش از یک پرچم، flag میتواند رشتهای با بیش از یک نویسه باشد.
هنگامی که یک نمونه از mboxMessage بر اساس یک نمونه از MaildirMessage ایجاد میشود، یک خط "From " بر اساس تاریخ تحویل نمونهی MaildirMessage تولید میشود و تبدیلهای زیر انجام میشوند:
وضعیت حاصل |
وضعیت |
|---|---|
پرچم R |
پرچم S |
پرچم O |
زیرپوشهی "cur" |
پرچم D |
پرچم T |
پرچم F |
پرچم F |
پرچم A |
پرچم R |
هنگامی که یک نمونه mboxMessage بر اساس یک نمونه MHMessage ایجاد میشود، تبدیلهای زیر رخ میدهند:
وضعیت حاصل |
وضعیت |
|---|---|
پرچم R و پرچم O |
بدون دنبالهی «unseen» |
پرچم O |
دنبالهی «unseen» |
پرچم F |
دنبالهی «flagged» |
پرچم A |
دنبالهی "replied" |
هنگامی که یک نمونه mboxMessage بر اساس یک نمونه BabylMessage ایجاد میشود، تبدیلهای زیر انجام میشوند:
وضعیت حاصل |
وضعیت |
|---|---|
پرچم R و پرچم O |
بدون برچسب «unseen» |
پرچم O |
برچسب "unseen" |
پرچم D |
برچسب «deleted» |
پرچم A |
برچسب «answered» |
هنگامی که یک نمونه mboxMessage بر اساس یک نمونه MMDFMessage ایجاد میشود، خط "From " رونوشت میشود و تمام پرچمها بهطور مستقیم متناظر هستند:
وضعیت حاصل |
وضعیت |
|---|---|
پرچم R |
پرچم R |
پرچم O |
پرچم O |
پرچم D |
پرچم D |
پرچم F |
پرچم F |
پرچم A |
پرچم A |
اشیای MHMessage¶
- class mailbox.MHMessage(message=None)¶
پیامی با رفتارهای خاص MH. پارامتر message همان معنایی را دارد که در سازندهی
Messageدارد.پیامهای MH از علامتها یا پرچمها به معنای سنتی پشتیبانی نمیکنند، اما از دنبالهها پشتیبانی میکنند که گروهبندیهای منطقی از پیامهای دلخواه هستند. برخی برنامههای خواندن ایمیل (البته بهجز mh و nmh استاندارد) از دنبالهها تقریباً به همان شیوهای استفاده میکنند که پرچمها در قالبهای دیگر استفاده میشوند، به شرح زیر:
دنباله
توضیح
دیدهنشده
خواندهنشده، اما پیشتر توسط MUA شناساییشده
پاسخ داد
پاسخ دادهشده به
علامتگذاریشده
بهعنوان مهم علامتگذاری شده
نمونههای
MHMessageمتدهای زیر را ارائه میدهند:- get_sequences()¶
فهرستی از نامهای دنبالههایی که شامل این پیام هستند را برمیگرداند.
- set_sequences(sequences)¶
فهرست دنبالههایی را که شامل این پیام میشوند، تنظیم کنید.
- add_sequence(sequence)¶
sequence را به فهرست دنبالههایی که این پیام را شامل میشوند، اضافه کنید.
- remove_sequence(sequence)¶
sequence را از فهرست دنبالههایی که این پیام را شامل میشوند، حذف کنید.
هنگامی که یک نمونه از MHMessage بر اساس یک نمونه از MaildirMessage ایجاد میشود، تبدیلهای زیر رخ میدهند:
وضعیت حاصل |
وضعیت |
|---|---|
دنبالهی «unseen» |
بدون پرچم S |
دنبالهی "replied" |
پرچم R |
دنبالهی «flagged» |
پرچم F |
هنگامی که یک نمونه MHMessage بر اساس نمونهای از mboxMessage یا MMDFMessage ایجاد شود، سرآیندهای Status و X-Status حذف میشوند و تبدیلهای زیر انجام میشوند:
وضعیت حاصل |
وضعیت |
|---|---|
دنبالهی «unseen» |
بدون پرچم R |
دنبالهی "replied" |
پرچم A |
دنبالهی «flagged» |
پرچم F |
هنگامی که یک نمونه MHMessage بر اساس یک نمونه BabylMessage ایجاد میشود، تبدیلهای زیر رخ میدهند:
وضعیت حاصل |
وضعیت |
|---|---|
دنبالهی «unseen» |
برچسب "unseen" |
دنبالهی "replied" |
برچسب «answered» |
اشیاء BabylMessage¶
- class mailbox.BabylMessage(message=None)¶
پیامی با رفتارهای مختص Babyl. پارامتر message همان معنایی را دارد که در سازندهی
Messageدارد.برخی برچسبهای پیام، که attributes نامیده میشوند، طبق قرارداد برای داشتن معانی خاصی تعریف شدهاند. ویژگیها به شرح زیر هستند:
برچسب
توضیح
دیدهنشده
خواندهنشده، اما پیشتر توسط MUA شناساییشده
حذفشده
علامتگذاریشده برای حذف بعدی
ثبتشده
به پرونده یا صندوق پستی دیگری کپی شد
پاسخ دادهشده
پاسخ دادهشده به
بازارسالشده
هدایتشده
ویرایششده
تغییریافته توسط کاربر
بازارسالشده
ارسال مجدد
بهطور پیشفرض، Rmail فقط سرآیندهای قابل مشاهده را نمایش میدهد. با این حال، کلاس
BabylMessageاز سرآیندهای اصلی استفاده میکند، زیرا کاملتر هستند. در صورت تمایل، میتوان بهصورت صریح به سرآیندهای قابل مشاهده دسترسی داشت.نمونههای
BabylMessageمتدهای زیر را ارائه میدهند:- get_labels()¶
فهرستی از برچسبهای پیام را برمیگرداند.
- set_labels(labels)¶
فهرست برچسبهای پیام را روی labels تنظیم کنید.
- add_label(label)¶
label را به فهرست برچسبهای پیام اضافه کنید.
- remove_label(label)¶
label را از فهرست برچسبهای پیام حذف کنید.
- get_visible()¶
یک نمونه
Messageبرمیگرداند که سرآیندهای آن، سرآیندهای قابل مشاهده پیام هستند و بدنه آن خالی است.
- set_visible(visible)¶
سرآیندهای قابل مشاهدهی پیام را برابر با سرآیندهای message تنظیم کنید. پارامتر visible باید نمونهای از
Message، نمونهای ازemail.message.Message، یک رشته، یا یک شیء شبهپرونده باشد (که باید در حالت متنی باز باشد).
- update_visible()¶
هنگامی که سرآیندهای اصلی یک نمونه از
BabylMessageتغییر کنند، سرآیندهای قابل مشاهده بهطور خودکار برای تطابق با آنها تغییر نمیکنند. این متد سرآیندهای قابل مشاهده را به شرح زیر بهروزرسانی میکند: هر سرآیند قابل مشاهده که یک سرآیند اصلی متناظر دارد، به مقدار سرآیند اصلی تنظیم میشود، هر سرآیند قابل مشاهده که فاقد یک سرآیند اصلی متناظر است، حذف میشود، و هر یک از Date، From، Reply-To، To، CC و Subject که در سرآیندهای اصلی وجود دارند اما در سرآیندهای قابل مشاهده وجود ندارند، به سرآیندهای قابل مشاهده افزوده میشوند.
هنگامی که یک نمونه BabylMessage بر اساس یک نمونه MaildirMessage ایجاد میشود، تبدیلهای زیر انجام میشوند:
وضعیت حاصل |
وضعیت |
|---|---|
برچسب "unseen" |
بدون پرچم S |
برچسب «deleted» |
پرچم T |
برچسب «answered» |
پرچم R |
برچسب «forwarded» |
پرچم P |
هنگامی که یک نمونه BabylMessage بر پایه یک نمونه mboxMessage یا MMDFMessage ایجاد میشود، سرآیندهای Status و X-Status حذف میشوند و تبدیلهای زیر انجام میشوند:
وضعیت حاصل |
وضعیت |
|---|---|
برچسب "unseen" |
بدون پرچم R |
برچسب «deleted» |
پرچم D |
برچسب «answered» |
پرچم A |
هنگامی که یک نمونه BabylMessage بر اساس یک نمونه MHMessage ایجاد میشود، تبدیلهای زیر انجام میشود:
وضعیت حاصل |
وضعیت |
|---|---|
برچسب "unseen" |
دنبالهی «unseen» |
برچسب «answered» |
دنبالهی "replied" |
اشیاء MMDFMessage¶
- class mailbox.MMDFMessage(message=None)¶
پیامی با رفتارهای خاص MMDF. پارامتر message همان معنایی را دارد که در سازندهی
Messageدارد.همانند پیامها در یک صندوق پستی mbox، پیامهای MMDF به همراه نشانی فرستنده و تاریخ تحویل در یک خط آغازین که با "From " شروع میشود، ذخیره میشوند. به همین ترتیب، پرچمهایی که وضعیت پیام را نشان میدهند معمولاً در سرآیندهای Status و X-Status ذخیره میشوند.
پرچمهای مرسوم برای پیامهای MMDF با پرچمهای پیام mbox یکسان هستند و به شرح زیرند:
پرچم
معنی
توضیح
R
خواندهشده
خواندهشده
O
قدیمی
پیشتر توسط MUA شناسایی شده است
D
حذفشده
علامتگذاریشده برای حذف بعدی
F
پرچمدار
بهعنوان مهم علامتگذاری شده
A
پاسخ دادهشده
پاسخ دادهشده به
پرچمهای «R» و «O» در سرآیند Status ذخیره میشوند، و پرچمهای «D»، «F» و «A» در سرآیند X-Status ذخیره میشوند. پرچمها و سرآیندها معمولاً به ترتیب ذکرشده ظاهر میشوند.
نمونههای
MMDFMessageمتدهای زیر را ارائه میدهند، که با متدهای ارائهشده توسطmboxMessageیکسان هستند:- get_from()¶
رشتهای را برمیگرداند که نشاندهندهی خط "From " است؛ خطی که آغاز پیام در یک صندوق پستی mbox را علامتگذاری میکند. "From " ابتدایی و نویسهی خط جدید پایانی لحاظ نمیشوند.
- set_from(from_, time_=None)¶
خط "From " را روی from_ تنظیم کنید، که باید بدون "From " در ابتدا یا خط جدید در انتها مشخص شود. برای راحتی، میتوان time_ را مشخص کرد؛ در این صورت بهطور مناسب قالببندی میشود و به from_ اضافه خواهد شد. اگر time_ مشخص شده باشد، باید یک نمونه از
time.struct_time، یک تاپل مناسب برای ارسال بهtime.strftime()، یاTrueباشد (برای استفاده ازtime.gmtime()).
- get_flags()¶
رشتهای را برمیگرداند که پرچمهایی را که در حال حاضر تنظیم شدهاند مشخص میکند. اگر پیام با قالب مرسوم مطابقت داشته باشد، نتیجه الحاق ۰ یا ۱ مورد از هر یک از
'R'،'O'،'D'،'F'و'A'، به ترتیب زیر است.
- set_flags(flags)¶
پرچمهای مشخصشده با flags را تنظیم و تمام پرچمهای دیگر را غیرفعال میکند. پارامتر flags باید حاصل الحاق صفر یا چند مورد از هر یک از
'R'،'O'،'D'،'F'و'A'به هر ترتیبی باشد.
- add_flag(flag)¶
پرچم(های) مشخصشده با flag را بدون تغییر سایر پرچمها تنظیم کنید. برای افزودن بیش از یک پرچم بهطور همزمان، flag میتواند رشتهای با بیش از یک نویسه باشد.
- remove_flag(flag)¶
پرچم(های) مشخصشده با flag را بدون تغییر دادن سایر پرچمها غیرفعال کنید. برای حذف همزمان بیش از یک پرچم، flag میتواند رشتهای با بیش از یک نویسه باشد.
هنگامی که یک نمونه از MMDFMessage بر اساس یک نمونه از MaildirMessage ایجاد میشود، یک خط "From " بر اساس تاریخ تحویل نمونهی MaildirMessage تولید میشود و تبدیلهای زیر انجام میشوند:
وضعیت حاصل |
وضعیت |
|---|---|
پرچم R |
پرچم S |
پرچم O |
زیرپوشهی "cur" |
پرچم D |
پرچم T |
پرچم F |
پرچم F |
پرچم A |
پرچم R |
هنگامی که یک نمونه MMDFMessage بر اساس یک نمونه MHMessage ایجاد میشود، تبدیلهای زیر انجام میشوند:
وضعیت حاصل |
وضعیت |
|---|---|
پرچم R و پرچم O |
بدون دنبالهی «unseen» |
پرچم O |
دنبالهی «unseen» |
پرچم F |
دنبالهی «flagged» |
پرچم A |
دنبالهی "replied" |
هنگامی که یک نمونه MMDFMessage بر اساس یک نمونه BabylMessage ایجاد میشود، تبدیلهای زیر انجام میشود:
وضعیت حاصل |
وضعیت |
|---|---|
پرچم R و پرچم O |
بدون برچسب «unseen» |
پرچم O |
برچسب "unseen" |
پرچم D |
برچسب «deleted» |
پرچم A |
برچسب «answered» |
هنگامی که یک نمونه MMDFMessage بر اساس یک نمونه mboxMessage ایجاد میشود، خط "From " کپی میشود و تمام پرچمها بهطور مستقیم با یکدیگر متناظر هستند:
وضعیت حاصل |
وضعیت |
|---|---|
پرچم R |
پرچم R |
پرچم O |
پرچم O |
پرچم D |
پرچم D |
پرچم F |
پرچم F |
پرچم A |
پرچم A |
استثناها¶
کلاسهای استثنای زیر در ماژول mailbox تعریف شدهاند:
- exception mailbox.Error¶
کلاس پایه برای تمام سایر استثناهای مختص ماژول.
- exception mailbox.NoSuchMailboxError¶
زمانی پرتاب میشود که انتظار میرود یک صندوق پستی موجود باشد اما یافت نمیشود، مانند زمانی که از یک زیرکلاس
Mailboxبا مسیری که وجود ندارد (و با پارامتر create که رویFalseتنظیم شده است) نمونهسازی میکنید، یا هنگام باز کردن پوشهای که وجود ندارد.
- exception mailbox.NotEmptyError¶
هنگامی پرتاب میشود که یک صندوق پستی خالی نباشد، اما انتظار میرود خالی باشد، مانند زمانی که پوشهای حاوی پیامها حذف میشود.
- exception mailbox.ExternalClashError¶
زمانی پرتاب میشود که وضعیتی مربوط به صندوق پستی خارج از کنترل برنامه باعث شود برنامه نتواند ادامه یابد؛ مانند زمانی که کسب قفلی که برنامهای دیگر از قبل آن را در اختیار دارد با شکست مواجه شود، یا زمانی که نام پروندهای که بهطور یکتا تولید شده است از قبل وجود داشته باشد.
مثالها¶
یک مثال ساده از چاپ موضوعات همه پیامهای یک صندوق پستی که جالب به نظر میرسند:
import mailbox
for message in mailbox.mbox('~/mbox'):
subject = message['subject'] # Could possibly be None.
if subject and 'python' in subject.lower():
print(subject)
برای کپی کردن تمام نامهها از یک صندوق پستی Babyl به یک صندوق پستی MH، با تبدیل تمام اطلاعات مختص قالبی که قابل تبدیل است:
import mailbox
destination = mailbox.MH('~/Mail')
destination.lock()
for message in mailbox.Babyl('~/RMAIL'):
destination.add(mailbox.MHMessage(message))
destination.flush()
destination.unlock()
این مثال نامهها را از چندین فهرست پستی به صندوقهای پستی مختلف دستهبندی میکند و مراقب است از خرابی نامه به دلیل تغییر همزمان توسط برنامههای دیگر، از دست رفتن نامه به دلیل وقفه در برنامه، یا خاتمه زودرس به دلیل پیامهای بدشکل در صندوق پستی جلوگیری کند:
import mailbox
import email.errors
list_names = ('python-list', 'python-dev', 'python-bugs')
boxes = {name: mailbox.mbox('~/email/%s' % name) for name in list_names}
inbox = mailbox.Maildir('~/Maildir', factory=None)
for key in inbox.iterkeys():
try:
message = inbox[key]
except email.errors.MessageParseError:
continue # The message is malformed. Just leave it.
for name in list_names:
list_id = message['list-id']
if list_id and name in list_id:
# Get mailbox to use
box = boxes[name]
# Write copy to disk before removing original.
# If there's a crash, you might duplicate a message, but
# that's better than losing a message completely.
box.lock()
box.add(message)
box.flush()
box.unlock()
# Remove original message
inbox.lock()
inbox.discard(key)
inbox.flush()
inbox.unlock()
break # Found destination, so stop looking.
for box in boxes.itervalues():
box.close()