email.contentmanager: مدیریت محتوای MIME¶
کد منبع: Lib/email/contentmanager.py
اضافه شده در نسخهی 3.6: [1]
- class email.contentmanager.ContentManager¶
کلاس پایه برای مدیران محتوا. سازوکارهای استاندارد ثبت برای ثبت مبدلها میان محتوای MIME و سایر نمایشها، و همچنین متدهای اعزام (dispatch)
get_contentوset_contentرا فراهم میکند.- get_content(msg, *args, **kw)¶
یک تابع هندلر را بر اساس
mimetypeمربوط به msg پیدا کنید (پاراگراف بعدی را ببینید)، آن را با ارسال همهی آرگومانها فراخوانی کنید و نتیجهی فراخوانی را برگردانید. انتظار میرود که کنترلگر بار را از msg استخراج کند و شیءای را برگرداند که اطلاعاتی دربارهی دادهی استخراجشده را کدگذاری میکند.برای یافتن هندلر، کلیدهای زیر را در رجیستری جستجو کنید و با پیدا شدن اولین مورد، متوقف شوید:
رشتهای که نوع کامل MIME را نشان میدهد (
maintype/subtype)رشتهی نشاندهندهی
maintypeرشته خالی
اگر هیچکدام از این کلیدها یک هندلر ایجاد نکردند، برای نوع کامل MIME یک
KeyErrorپرتاب کنید.
- set_content(msg, obj, *args, **kw)¶
اگر
maintypeبرابر باmultipartباشد، استثنایTypeErrorپرتاب میشود؛ در غیر این صورت، یک تابع هندلر بر اساس نوع obj جستجو میشود (بند بعدی را ببینید)،clear_content()روی msg فراخوانی میشود و تابع هندلر با ارسال تمام آرگومانها فراخوانی میشود. انتظار میرود که هندلر obj را تبدیل کرده و در msg ذخیره کند، و احتمالاً تغییرات دیگری نیز در msg اعمال کند، مانند افزودن سرآیندهای MIME مختلف برای کدگذاری اطلاعات لازم برای تفسیر دادهی ذخیرهشده.برای یافتن هندلر، نوع obj را به دست آورید (
typ = type(obj)) و در رجیستری به دنبال کلیدهای زیر بگردید و با نخستین کلید یافتشده متوقف شوید:خودِ نوع (
typ)نام کامل مشخص نوع (
typ.__module__ + '.' + typ.__qualname__).qualnameنوع (typ.__qualname__)nameنوع (typ.__name__).
اگر هیچیک از موارد بالا مطابقت نداشت، تمام بررسیهای بالا را برای هر یک از انواع موجود در MRO (
typ.__mro__) تکرار کنید. در نهایت، اگر هیچ کلید دیگری هندلری را برنگرداند، بررسی کنید که آیا مدیری برای کلیدNoneوجود دارد. اگر هندلری برایNoneوجود نداشت،KeyErrorرا برای نام کامل نوع پرتاب کنید.همچنین اگر سرآیند MIME-Version وجود ندارد، آن را اضافه کنید (همچنین
MIMEPartرا ببینید).
- add_get_handler(key, handler)¶
تابع handler را بهعنوان هندلر برای key ثبت کنید. برای مقادیر ممکن key،
get_content()را ببینید.
- add_set_handler(typekey, handler)¶
handler را بهعنوان تابعی ثبت کنید که هنگام ارسال شیءای از نوع مطابق با typekey به
set_content()فراخوانی میشود. برای مقادیر ممکن typekey،set_content()را ببینید.
نمونههای مدیر محتوا (Content Manager)¶
در حال حاضر بستهی email تنها یک مدیر محتوای عینی (concrete content manager)، raw_data_manager، ارائه میدهد، هرچند ممکن است در آینده موارد بیشتری افزوده شوند. raw_data_manager همان content_manager ارائهشده از سوی EmailPolicy و مشتقات آن است.
- email.contentmanager.raw_data_manager¶
This content manager provides only a minimum interface beyond that provided by
Messageitself: it deals only with text, raw bytes, andMessageobjects. Nevertheless, it provides significant advantages compared to the base API:get_contenton a text part will return a string without the application needing to manually decode it,set_contentprovides a rich set of options for controlling the headers added to a part and controlling the content transfer encoding, and it enables the use of the variousadd_methods, thereby simplifying the creation of multipart messages.- email.contentmanager.get_content(msg, errors='replace')¶
Return the payload of the part as either a string (for
textparts), anEmailMessageobject (formessage/rfc822parts), or abytesobject (for all other non-multipart types). Raise aKeyErrorif called on amultipart. If the part is atextpart and errors is specified, use it as the error handler when decoding the payload to a string. The default error handler isreplace.
- email.contentmanager.set_content(msg, <'str'>, subtype="plain", charset='utf-8', cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)¶
- email.contentmanager.set_content(msg, <'bytes'>, maintype, subtype, cte="base64", disposition=None, filename=None, cid=None, params=None, headers=None)
- email.contentmanager.set_content(msg, <'EmailMessage'>, cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)
سرآیندها و بار را به msg اضافه کنید:
یک سرآیند Content-Type با مقدار
maintype/subtypeاضافه کنید.برای
str،maintypeMIME را رویtextتنظیم کنید، و زیرنوع را اگر مشخص شده باشد روی subtype و در غیر این صورت رویplainتنظیم کنید.برای
bytes، از maintype و subtype مشخصشده استفاده میشود، یا اگر مشخص نشده باشند، استثنایTypeErrorپرتاب میشود.برای اشیای
EmailMessage، نوع اصلی (maintype) رویmessageتنظیم میشود، و اگر subtype مشخص شده باشد، زیرنوع روی subtype و در غیر این صورت رویrfc822تنظیم میشود. اگر subtype برابرpartialباشد، خطایی پرتاب میشود (برای ساخت بخشهایmessage/partialباید از اشیایbytesاستفاده شود).
اگر charset ارائه شده باشد (که فقط برای
strمعتبر است)، رشته با استفاده از مجموعه نویسه مشخصشده به بایتها کدگذاری میشود. مقدار پیشفرضutf-8است. اگر charset مشخصشده نام مستعار شناختهشدهای برای یک نام مجموعه نویسه استاندارد MIME باشد، بهجای آن از مجموعه نویسه استاندارد استفاده میشود.اگر cte تنظیمشده باشد، بار با استفاده از کدگذاری انتقال محتوای مشخصشده کدگذاری میشود و سرآیند Content-Transfer-Encoding روی آن مقدار تنظیم میشود. مقادیر ممکن برای cte عبارتاند از
quoted-printable،base64،7bit،8bitوbinary. اگر ورودی نتواند با کدگذاری مشخصشده کدگذاری شود (برای مثال، مشخص کردن cte با مقدار7bitبرای ورودیای که حاوی مقادیر غیر ASCII است)، یکValueErrorپرتاب میشود.برای اشیاء
str، اگر cte تنظیمنشده باشد، از روشهای اکتشافی برای تعیین فشردهترین کدگذاری استفاده میشود. پیش از کدگذاری،str.splitlines()برای عادیسازی تمام مرزهای سطر استفاده میشود تا اطمینان حاصل شود که هر خط از بار با ویژگیlinesepسیاست جاری پایان مییابد (حتی اگر رشته اصلی با آن پایاننیافته باشد).برای اشیاء
bytes، اگر cte تنظیم نشده باشد، مقدار آن base64 در نظر گرفته میشود و ترجمهی خط جدید مذکور انجام نمیشود.برای
EmailMessage، بر اساس RFC 2046، اگر برای subtyperfc822، cte برابرquoted-printableیاbase64درخواست شود، یا برای subtypeexternal-bodyهر cte غیر از7bitدرخواست شود، خطایی پرتاب میکند. برایmessage/rfc822، اگر cte مشخص نشده باشد، از8bitاستفاده میشود. برای تمام مقدارهای دیگر subtype، از7bitاستفاده میشود.
توجه
یک cte از
binaryهنوز واقعاً بهدرستی کار نمیکند. شیءEmailMessageکه باset_contentتغییر یافته است، صحیح است، اماBytesGeneratorآن را بهدرستی سریالسازی نمیکند.اگر disposition تنظیم شده باشد، از آن بهعنوان مقدار سرآیند Content-Disposition استفاده میشود. اگر مشخص نشده باشد و filename مشخص شده باشد، سرآیند با مقدار
attachmentافزوده میشود. اگر disposition مشخص نشده باشد و filename نیز مشخص نشده باشد، سرآیند افزوده نمیشود. تنها مقادیر معتبر برای disposition،attachmentوinlineهستند.اگر filename تعیین شده باشد، از آن بهعنوان مقدار پارامتر
filenameدر سرآیند Content-Disposition استفاده کنید.اگر cid مشخص شده باشد، یک سرآیند Content-ID با cid بهعنوان مقدار آن اضافه میشود.
اگر params تعیین شده باشد، متد
itemsآن را پیمایش کنید و از جفتهای(key, value)حاصل برای تنظیم پارامترهای اضافی در سرآیند Content-Type استفاده کنید.اگر headers مشخص شده باشد و فهرستی از رشتههایی بهصورت
headername: headervalueیا فهرستی از اشیایheaderباشد (که با داشتن ویژگیnameاز رشتهها متمایز میشوند)، سرآیندها به msg اضافه میشوند.
پانویسها