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¶
این مدیر محتوا تنها یک رابط حداقل فراتر از آنچه توسط خود
Messageفراهم شده است، ارائه میدهد: آن تنها با متن، بایتهای خام، و اشیاءMessageسروکار دارد. با این حال، مزایای قابلتوجهی در مقایسه با API پایه فراهم میکند:get_contentدر یک بخش متنی یک رشته برمیگرداند بدون اینکه برنامه نیاز به کدگشایی دستی آن داشته باشد،set_contentیک مجموعه غنی از گزینهها برای کنترل سرآیندهای اضافه شده به یک بخش و کنترل کدگذاری انتقال محتوا فراهم میکند، و امکان استفاده از متدهای مختلفadd_را فراهم میکند، که در نتیجه ایجاد پیامهای چندبخشی را ساده میکند.- email.contentmanager.get_content(msg, errors='replace')¶
بار بخش را به صورت یک رشته (برای بخشهای
text)، یک شیءEmailMessage(برای بخشهایmessage/rfc822)، یا یک شیءbytes(برای تمام انواع غیر-چندبخشی دیگر) برگردانید. اگر روی یکmultipartفراخوانی شود،KeyErrorبه وجود آورید. اگر بخش یک بخشtextباشد و errors مشخص شده باشد، از آن به عنوان هندلر خطا هنگام کدگشایی بار به یک رشته استفاده کنید. هندلر خطای پیشفرضreplaceاست.
- 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 اضافه میشوند.
پانویسها