email.message: بازنمایی یک پیام ایمیل¶
کد منبع: Lib/email/message.py
اضافه شده در نسخهی 3.6: [1]
کلاس مرکزی در بستهی email، کلاس EmailMessage است که از ماژول email.message ایمپورت میشود. این کلاس، کلاس پایهی مدل شیء email است. EmailMessage کارکرد اصلی را برای تنظیم و پرسوجوی فیلدهای سرآیند، دسترسی به بدنههای پیام و ایجاد یا تغییر پیامهای ساختاریافته فراهم میکند.
یک پیام ایمیلی از سرآیندها و یک بار تشکیل شده است (که به آن محتوا نیز گفته میشود). سرآیندها نامها و مقدارهای فیلد به سبک RFC 5322 یا RFC 6532 هستند، که در آنها نام فیلد و مقدار با یک دونقطه از هم جدا میشوند. دونقطه نه بخشی از نام فیلد است و نه بخشی از مقدار فیلد. بار ممکن است یک پیام متنی ساده، یا یک شیء دودویی، یا دنبالهای ساختارمند از زیرپیامها باشد که هرکدام مجموعهای از سرآیندها و بار خود را دارند. نوع اخیر بار با نوع MIME پیام، مانند multipart/* یا message/rfc822، مشخص میشود.
مدل مفهومی ارائهشده توسط یک شیء EmailMessage، بهصورت یک دیکشنری مرتب از سرآیندها همراه با یک بار است که بدنهی پیام مطابق RFC 5322 را نشان میدهد و ممکن است فهرستی از اشیاء EmailMessage فرعی باشد. علاوه بر متدهای معمول دیکشنری برای دسترسی به نامها و مقادیر سرآیندها، متدهایی برای دسترسی به اطلاعات تخصصی از سرآیندها (برای مثال نوع محتوای MIME)، برای انجام عملیات بر روی بار، برای تولید نسخهای سریالشده از پیام، و برای پیمایش بازگشتی بر روی درخت اشیاء وجود دارد.
رابط دیکشنریمانند EmailMessage با نامهای سرآیند اندیسدهی میشود؛ این نامها باید مقادیر ASCII باشند. مقادیر دیکشنری، رشتههایی هستند که چند متد اضافی دارند. سرآیندها با حفظ حالت حروف ذخیره و بازگردانده میشوند، اما نامهای فیلد بدون حساسیت به حالت حروف تطبیق داده میشوند. کلیدها مرتب هستند، اما برخلاف یک دیکشنری واقعی، ممکن است کلیدهای تکراری وجود داشته باشد. متدهای اضافی برای کار با سرآیندهایی که کلیدهای تکراری دارند ارائه شدهاند.
بار در مورد اشیاء پیام ساده، یا یک شیء رشته یا bytes است، یا در مورد اشیاء پیامِ اسناد نگهدارندهی MIME مانند multipart/* و message/rfc822، فهرستی از اشیاء EmailMessage است.
- class email.message.EmailMessage(policy=default)¶
اگر policy مشخص شده باشد، از قوانین مشخصشده توسط آن برای بهروزرسانی و سریالسازی بازنمایی پیام استفاده میشود. اگر policy تنظیم نشده باشد، از سیاست
defaultاستفاده میشود، که از قوانین RFCهای ایمیل پیروی میکند، بهجز در مورد پایان سطرهای (بهجای\r\nمورد الزام RFC، از پایان سطرهای استاندارد پایتون یعنی\nاستفاده میکند). برای اطلاعات بیشتر، مستنداتpolicyرا ببینید. [2]- as_string(unixfrom=False, maxheaderlen=None, policy=None)¶
کل پیام را بهصورت یک رشتهی مسطح برمیگرداند. هنگامی که آرگومان اختیاری unixfrom درست باشد، سرآیند پاکت (envelope header) در رشتهی برگرداندهشده گنجانده میشود. مقدار پیشفرض unixfrom برابر
Falseاست. برای سازگاری عقبرو با کلاس پایهیMessage، maxheaderlen پذیرفته میشود، اما مقدار پیشفرض آنNoneاست، که به این معناست که بهطور پیشفرض طول خط توسطmax_line_lengthسیاست کنترل میشود. میتوان از آرگومان policy برای نادیده گرفتن سیاست پیشفرضی که از نمونهی پیام گرفته میشود استفاده کرد. این میتواند برای کنترل برخی از قالببندیهای تولیدشده توسط متد به کار رود، زیرا policy مشخصشده بهGeneratorارسال میشود.تسطیح پیام ممکن است باعث ایجاد تغییراتی در
EmailMessageشود، اگر برای تکمیل تبدیل به یک رشته نیاز باشد مقادیر پیشفرض پر شوند (برای مثال، ممکن است مرزهای MIME تولید یا اصلاح شوند).توجه داشته باشید که این متد برای راحتی کار ارائه شده است و ممکن است مفیدترین روش برای سریالسازی پیامها در برنامه شما نباشد، بهویژه اگر با چندین پیام سروکار دارید. برای یک API انعطافپذیرتر جهت سریالسازی پیامها،
email.generator.Generatorرا ببینید. همچنین توجه داشته باشید که این متد، وقتیutf8برابرFalseباشد (که مقدار پیشفرض است)، محدود به تولید پیامهایی است که بهصورت «7 bit clean» سریالسازی شدهاند.تغییر یافته در نسخهی 3.6: رفتار پیشفرض زمانی که maxheaderlen مشخصنشده باشد، از پیشفرض ۰ به پیشفرض مقدار max_line_length از سیاست تغییر کرده است.
- __str__()¶
معادل
as_string(policy=self.policy.clone(utf8=True))است و بهstr(msg)اجازه میدهد رشتهای حاوی پیام سریالشده در قالبی خوانا تولید کند.تغییر یافته در نسخهی 3.4: این متد تغییر یافت تا از
utf8=Trueاستفاده کند، در نتیجه بازنمایی پیامی شبیه به RFC 6531 تولید میکند، بهجای آنکه نام مستعار مستقیمی برایas_string()باشد.
- as_bytes(unixfrom=False, policy=None)¶
کل پیام را بهصورت یک شیء بایتی مسطحشده برمیگرداند. هنگامی که آرگومان اختیاری unixfrom مقدار true داشته باشد، سرآیند پاکت در رشته برگرداندهشده گنجانده میشود. مقدار پیشفرض unixfrom برابر
Falseاست. میتوان از آرگومان policy برای لغو سیاست پیشفرض بهدستآمده از نمونه پیام استفاده کرد. از این میتوان برای کنترل بخشی از قالببندی تولیدشده توسط متد استفاده کرد، زیرا policy مشخصشده بهBytesGeneratorارسال خواهد شد.تسطیح پیام ممکن است باعث ایجاد تغییراتی در
EmailMessageشود، اگر برای تکمیل تبدیل به یک رشته نیاز باشد مقادیر پیشفرض پر شوند (برای مثال، ممکن است مرزهای MIME تولید یا اصلاح شوند).توجه داشته باشید که این متد بهمنظور سهولت ارائه شده است و ممکن است مفیدترین روش برای سریالسازی پیامها در برنامه شما نباشد، بهویژه اگر با چندین پیام سروکار دارید. برای یک API انعطافپذیرتر جهت سریالسازی پیامها،
email.generator.BytesGeneratorرا ببینید.
- __bytes__()¶
معادل
as_bytes()است. اجازه میدهدbytes(msg)یک شیء bytes حاوی پیام سریالشده تولید کند.
- is_multipart()¶
اگر بار پیام فهرستی از اشیای sub-
EmailMessageباشد،Trueرا برمیگرداند، در غیر این صورتFalseرا برمیگرداند. هنگامی کهis_multipart()مقدارFalseرا برمیگرداند، بار باید یک شیء رشتهای باشد (که ممکن است یک بار دودویی کدگذاریشده با CTE باشد). توجه داشته باشید که برگرداندنTrueاز سویis_multipart()لزوماً به این معنا نیست که "msg.get_content_maintype() == 'multipart'" مقدارTrueرا برمیگرداند. برای مثال، هنگامی کهEmailMessageاز نوعmessage/rfc822باشد،is_multipartمقدارTrueرا برمیگرداند.
- set_unixfrom(unixfrom)¶
سرآیند پاکت پیام را روی unixfrom تنظیم کنید، که باید یک رشته باشد. (برای شرح کوتاهی از این سرآیند،
mboxMessageرا ببینید.)
- get_unixfrom()¶
سرآیند پاکت پیام را بازمیگرداند. اگر سرآیند پاکت هرگز تنظیم نشده باشد، مقدار پیشفرض آن
Noneاست.
متدهای زیر رابط شبهنگاشتی را برای دسترسی به سرآیندهای پیام پیادهسازی میکنند. توجه داشته باشید که تفاوتهای معنایی میان این متدها و یک رابط نگاشت معمولی (یعنی دیکشنری) وجود دارد. برای مثال، در یک دیکشنری کلید تکراری وجود ندارد، اما اینجا ممکن است سرآیندهای پیام تکراری باشند. همچنین، در دیکشنریها ترتیب کلیدهای برگرداندهشده توسط
keys()تضمینشده نیست، اما در یک شیءEmailMessage، سرآیندها همیشه به همان ترتیبی که در پیام اصلی ظاهر شدهاند، یا به همان ترتیبی که بعداً به پیام افزوده شدهاند، برگردانده میشوند. هر سرآیندی که حذف و سپس دوباره افزوده شود، همیشه به انتهای فهرست سرآیندها الحاق میشود.این تفاوتهای معنایی عمدی هستند و به سمت سهولت در رایجترین موارد استفاده تمایل دارند.
توجه داشته باشید که در همه موارد، هر سرآیند پاکتی (envelope header) که در پیام وجود دارد، در رابط نگاشت گنجانده نمیشود.
- __len__()¶
تعداد کل سرآیندها، از جمله تکراریها را برمیگرداند.
- __contains__(name)¶
اگر شیء پیام فیلدی به نام name داشته باشد،
Trueرا برمیگرداند. تطبیق بدون در نظر گرفتن بزرگی و کوچکی حروف انجام میشود و name شامل دونقطه پایانی نمیشود. برای عملگرinاستفاده میشود. برای مثال:if 'message-id' in myMessage: print('Message-ID:', myMessage['message-id'])
- __getitem__(name)¶
مقدار فیلد سرآیند با نام مشخص را برمیگرداند. name شامل جداکنندهی دونقطهای فیلد نمیشود. اگر سرآیند موجود نباشد،
Noneبرگردانده میشود؛ هرگز استثنایKeyErrorپرتاب نمیشود.توجه داشته باشید که اگر فیلد نامبردهشده بیش از یک بار در سرآیندهای پیام ظاهر شود، دقیقاً اینکه کدامیک از مقدارهای آن فیلد برگردانده میشود، تعریفنشده است. برای دریافت مقدارهای همه سرآیندهای موجود با نام name از متد
get_all()استفاده کنید.با استفاده از سیاستهای استاندارد (غیر
compat32)، مقدار برگرداندهشده نمونهای از زیرکلاسی ازemail.headerregistry.BaseHeaderاست.
- __setitem__(name, val)¶
یک سرآیند با نام فیلد name و مقدار val به پیام اضافه کنید. این فیلد به پایان سرآیندهای موجود پیام افزوده میشود.
توجه داشته باشید که این کار هیچ سرآیند موجودی با نام یکسان را بازنویسی یا حذف نمیکند. اگر میخواهید اطمینان حاصل کنید که سرآیند جدید، تنها سرآیند موجود در پیام با نام فیلد name است، ابتدا فیلد را حذف کنید، برای مثال:
del msg['subject'] msg['subject'] = 'Python roolz!'
اگر
policyبرخی سرآیندها را یکتا تعریف کند (همانطور که سیاستهای استاندارد اینگونه تعریف میکنند)، این متد ممکن است هنگامی که تلاش شود مقداری به چنین سرآیندی اختصاص یابد، در صورتی که از قبل سرآیندی موجود باشد، یکValueErrorپرتاب کند. این رفتار بهمنظور سازگاری عمدی است، اما به آن اتکا نکنید، زیرا ممکن است در آینده تصمیم بگیریم که چنین انتسابهایی موجب حذف خودکار سرآیند موجود شوند.
- __delitem__(name)¶
تمام موارد فیلد با نام name را از سرآیندهای پیام حذف میکند. اگر فیلد نامبرده در سرآیندها وجود نداشته باشد، هیچ استثنایی پرتاب نمیشود.
- keys()¶
فهرستی از نام تمام فیلدهای سرایند پیام را برمیگرداند.
- values()¶
فهرستی از همهی مقدارهای فیلدهای پیام را برمیگرداند.
- items()¶
فهرستی از تاپلهای دوتایی برمیگرداند که شامل تمام سرآیندها و مقادیر فیلدهای پیام است.
- get(name, failobj=None)¶
مقدار فیلد سرآیندِ نامبردهشده را برمیگرداند. این با
__getitem__()یکسان است، با این تفاوت که اگر سرآیند نامبردهشده وجود نداشته باشد، failobj اختیاری برگردانده میشود (مقدار پیشفرض failobjNoneاست).
در اینجا چند متد مفید دیگر مرتبط با سرآیند آمده است:
- get_all(name, failobj=None)¶
فهرستی از همهی مقادیر فیلدی با نام name را برمیگرداند. اگر هیچ سرآیندای با این نام در پیام وجود نداشته باشد، failobj برگردانده میشود (پیشفرض
Noneاست).
- add_header(_name, _value, **_params)¶
تنظیم سرآیند گسترشیافته. این متد مشابه
__setitem__()است، با این تفاوت که میتوان پارامترهای اضافی سرآیند را بهصورت آرگومانهای کلیدواژهای ارائه کرد. _name فیلد سرآیندی است که باید افزوده شود و _value مقدار اصلی برای سرآیند است.برای هر آیتم در دیکشنری آرگومانهای کلیدواژهای _params، کلید بهعنوان نام پارامتر در نظر گرفته میشود و زیرسطرها به خط تیره تبدیل میشوند (زیرا خط تیره در شناسههای پایتون غیرمجاز است). معمولاً، پارامتر بهصورت
key="value"اضافه میشود، مگر اینکه مقدارNoneباشد، که در این صورت فقط کلید اضافه میشود.اگر مقدار حاوی نویسههای غیر ASCII باشد، میتوان مجموعه نویسه و زبان را بهصراحت با تعیین مقدار بهصورت یک تاپل سهتایی در قالب
(CHARSET, LANGUAGE, VALUE)کنترل کرد، که در آنCHARSETرشتهای است که نام مجموعه نویسه مورد استفاده برای کدگذاری مقدار را مشخص میکند،LANGUAGEمعمولاً میتواندNoneیا رشته خالی باشد (برای سایر حالتها RFC 2231 را ببینید)، وVALUEمقدار رشتهای حاوی نقاط کد غیر ASCII است. اگر یک تاپل سهتایی ارسال نشود و مقدار حاوی نویسههای غیر ASCII باشد، بهطور خودکار در قالب RFC 2231 باCHARSETبرابرutf-8وLANGUAGEبرابرNoneکدگذاری میشود.در اینجا مثالی آمده است:
msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')
این یک سرآیند اضافه میکند که به این شکل است
Content-Disposition: attachment; filename="bud.gif"
مثالی از رابط گسترشیافته با نویسههای غیر ASCII:
msg.add_header('Content-Disposition', 'attachment', filename=('iso-8859-1', '', 'Fußballer.ppt'))
- replace_header(_name, _value)¶
یک سرآیند را جایگزین میکند. اولین سرآیند یافتشده در پیام را که با _name مطابقت داشته باشد جایگزین میکند، در حالی که ترتیب سرآیندها و بزرگی و کوچکی حروف نام فیلد سرآیند اصلی را حفظ میکند. اگر هیچ سرآیند منطبقی یافت نشد، استثنای
KeyErrorپرتاب میشود.
- get_content_type()¶
نوع محتوای پیام را به صورت حروف کوچک و در قالب maintype/subtype برمیگرداند. اگر سرآیند Content-Type در پیام وجود نداشته باشد، مقدار بازگشتی از
get_default_type()را برمیگرداند. اگر سرآیند Content-Type نامعتبر باشد،text/plainرا برمیگرداند.(بر اساس RFC 2045، پیامها همیشه یک نوع پیشفرض دارند؛
get_content_type()همیشه یک مقدار برمیگرداند. RFC 2045 نوع پیشفرض یک پیام را text/plain تعریف میکند، مگر اینکه داخل یک ظرف multipart/digest قرار داشته باشد، که در این صورت message/rfc822 خواهد بود. اگر سرآیند Content-Type دارای مشخصهی نوع نامعتبر باشد، RFC 2045 الزام میکند که نوع پیشفرض text/plain باشد.)
- get_content_maintype()¶
نوع محتوای اصلی پیام را برمیگرداند. این، بخش maintype از رشتهای است که توسط
get_content_type()برگردانده میشود.
- get_content_subtype()¶
زیرنوع محتوای پیام را برمیگرداند. این مقدار بخش subtype از رشتهای است که
get_content_type()برمیگرداند.
- get_default_type()¶
نوع محتوای پیشفرض را برمیگرداند. بیشتر پیامها نوع محتوای پیشفرض text/plain دارند، به جز پیامهایی که زیربخشهایی از ظرفهای multipart/digest هستند. این زیربخشها نوع محتوای پیشفرض message/rfc822 دارند.
- set_default_type(ctype)¶
نوع محتوای پیشفرض را تنظیم کنید. ctype باید یا text/plain یا message/rfc822 باشد، اگرچه این موضوع اعمال نمیشود. نوع محتوای پیشفرض در سرآیند Content-Type ذخیره نمیشود، بنابراین تنها زمانی بر مقدار بازگشتی متدهای
get_content_typeتأثیر میگذارد که هیچ سرآیند Content-Type در پیام وجود نداشته باشد.
- set_param(param, value, header='Content-Type', requote=True, charset=None, language='', replace=False)¶
پارامتری را در سرآیند Content-Type تنظیم میکند. اگر پارامتر از قبل در سرآیند وجود داشته باشد، مقدار آن را با value جایگزین میکند. هنگامی که header برابر
Content-Type(پیشفرض) باشد و سرآیند هنوز در پیام وجود نداشته باشد، آن را اضافه میکند، مقدار آن را روی text/plain تنظیم میکند و مقدار پارامتر جدید را به آن میافزاید. header اختیاری، سرآیند جایگزینی را برای Content-Type مشخص میکند.اگر مقدار شامل نویسههای غیر ASCII باشد، میتوان مجموعه نویسه و زبان را با استفاده از پارامترهای اختیاری charset و language بهصراحت مشخص کرد. پارامتر اختیاری language زبان RFC 2231 را مشخص میکند و پیشفرض آن رشته خالی است. هر دو پارامتر charset و language باید رشته باشند. پیشفرض استفاده از
utf8برای charset وNoneبرای language است.اگر replace برابر
Falseباشد (پیشفرض)، سرآیند به انتهای فهرست سرآیندها منتقل میشود. اگر replace برابرTrueباشد، سرآیند در همان جای خود بهروزرسانی خواهد شد.استفاده از پارامتر requote با اشیای
EmailMessageمنسوخ شده است.توجه داشته باشید که مقادیر پارامترهای موجود در سرآیندها از طریق ویژگی
paramsدر مقدار سرآیند قابل دسترسی هستند (برای مثال،msg['Content-Type'].params['charset']).تغییر یافته در نسخهی 3.4: کلیدواژهی
replaceاضافه شد.
- del_param(param, header='content-type', requote=True)¶
پارامتر دادهشده را بهطور کامل از سرآیند Content-Type حذف کنید. سرآیند بهصورت درجا بدون پارامتر یا مقدار آن بازنویسی خواهد شد. پارامتر اختیاری header جایگزینی برای Content-Type مشخص میکند.
استفاده از پارامتر requote با اشیای
EmailMessageمنسوخ شده است.
- get_filename(failobj=None)¶
مقدار پارامتر
filenameدر سرآیند Content-Disposition پیام را برمیگرداند. اگر سرآیند پارامترfilenameنداشته باشد، این متد بهعنوان جایگزین، پارامترnameرا در سرآیند Content-Type جستوجو میکند. اگر هیچکدام پیدا نشود یا سرآیند وجود نداشته باشد، failobj برگردانده میشود. رشته برگرداندهشده همیشه طبقemail.utils.unquote()بدون علامت نقلقول خواهد بود.
- get_boundary(failobj=None)¶
مقدار پارامتر
boundaryاز سرآیند Content-Type پیام را برمیگرداند، یا اگر سرآیند موجود نباشد یا پارامترboundaryنداشته باشد، failobj را برمیگرداند. رشتهی بازگشتی همیشه مطابقemail.utils.unquote()بدون علامت نقلقول خواهد بود.
- set_boundary(boundary)¶
پارامتر
boundaryدر سرآیند Content-Type را روی boundary تنظیم کنید.set_boundary()در صورت لزوم همیشه boundary را داخل علامت نقلقول قرار میدهد. اگر شیء پیام فاقد سرآیند Content-Type باشد، استثنایHeaderParseErrorپرتاب میشود.توجه داشته باشید که استفاده از این متد بهصورت ظریفی با حذف سرآیند قدیمی Content-Type و افزودن یک سرآیند جدید با مرز جدید (boundary) از طریق
add_header()متفاوت است، زیراset_boundary()ترتیب سرآیند Content-Type را در فهرست سرآیندها حفظ میکند.
- get_content_charset(failobj=None)¶
پارامتر
charsetسرآیند Content-Type را، پس از تبدیل به حروف کوچک، برمیگرداند. اگر سرآیند Content-Type وجود نداشته باشد، یا آن سرآیند پارامترcharsetنداشته باشد، failobj برگردانده میشود.
- get_charsets(failobj=None)¶
فهرستی شامل نامهای مجموعهنویسه در پیام را برمیگرداند. اگر پیام از نوع multipart باشد، فهرست شامل یک المان برای هر زیربخش در بار خواهد بود، در غیر این صورت، فهرستی به طول ۱ خواهد بود.
هر آیتم در فهرست، یک رشته خواهد بود که مقدار پارامتر
charsetدر سرآیند Content-Type برای زیربخش متناظر است. اگر زیربخش سرآیند Content-Type یا پارامترcharsetنداشته باشد، یا نوع اصلی MIME آن text نباشد، آن آیتم در فهرست بازگشتی برابر failobj خواهد بود.
- is_attachment()¶
اگر سرآیند Content-Disposition وجود داشته باشد و مقدار آن (بدون حساسیت به بزرگی و کوچکی حروف)
attachmentباشد،Trueرا برمیگرداند و در غیر این صورتFalseرا برمیگرداند.تغییر یافته در نسخهی 3.4.2: is_attachment اکنون برای هماهنگی با
is_multipart()، بهجای یک پراپرتی، یک متد است.
- get_content_disposition()¶
اگر پیام سرآیند Content-Disposition داشته باشد، مقدار با حروف کوچک آن (بدون پارامترها) را برمیگرداند؛ در غیر این صورت
Noneرا برمیگرداند. اگر پیام از RFC 2183 پیروی کند، مقادیر ممکن برای این متد inline، attachment یاNoneهستند.اضافه شده در نسخهی 3.5.
متدهای زیر به بررسی و دستکاری محتوای (payload) پیام مربوط میشوند.
- walk()¶
متد
walk()یک تولیدگر همهمنظوره است که میتوان از آن برای تکرار روی تمام بخشها و زیربخشهای درخت شیء پیام، به ترتیب پیمایش عمقاول استفاده کرد. شما معمولاً ازwalk()بهعنوان پیمایشگر در یک حلقهforاستفاده میکنید؛ هر تکرار، زیربخش بعدی را برمیگرداند.در اینجا مثالی آمده که نوع MIME هر بخش از یک ساختار پیام چندبخشی را چاپ میکند:
>>> for part in msg.walk(): ... print(part.get_content_type()) multipart/report text/plain message/delivery-status text/plain text/plain message/rfc822 text/plain
walkزیربخشهای هر بخشی را کهis_multipart()مقدارTrueبرمیگرداند، پیمایش میکند، هرچند ممکن استmsg.get_content_maintype() == 'multipart'مقدارFalseبرگرداند. میتوانیم این را در مثال خود با استفاده از تابع کمکی اشکالزدایی_structureببینیم:>>> from email.iterators import _structure >>> for part in msg.walk(): ... print(part.get_content_maintype() == 'multipart', ... part.is_multipart()) True True False False False True False False False False False True False False >>> _structure(msg) multipart/report text/plain message/delivery-status text/plain text/plain message/rfc822 text/plain
در اینجا بخشهای
messageاز نوعmultipartsنیستند، اما شامل زیربخشهایی هستند.is_multipart()مقدارTrueرا برمیگرداند وwalkوارد زیربخشها میشود.
- get_body(preferencelist=('related', 'html', 'plain'))¶
بخش MIME را که بهترین نامزد برای «بدنه» پیام است، برمیگرداند.
preferencelist باید دنبالهای از رشتههایی از مجموعه
related،htmlوplainباشد و ترتیب اولویت برای نوع محتوای بخش برگرداندهشده را نشان میدهد.جستوجوی تطبیقهای نامزد را با شیءای که متد
get_bodyروی آن فراخوانی میشود، آغاز کنید.اگر
relatedدر preferencelist گنجانده نشده باشد، بخش ریشه (یا زیربخشی از بخش ریشه) هر related که با آن مواجه میشوید را در صورتی بهعنوان نامزد در نظر بگیرید که آن (زیر)بخش با ترجیحی مطابقت داشته باشد.هنگام مواجهه با
multipart/related، پارامترstartرا بررسی کنید و اگر بخشی با Content-ID منطبق پیدا شد، هنگام جستوجو برای تطابقهای محتمل فقط آن را در نظر بگیرید. در غیر این صورت فقط بخش نخست (ریشه پیشفرض) ازmultipart/relatedرا در نظر بگیرید.اگر بخشی سرآیند Content-Disposition داشته باشد، تنها در صورتی آن بخش را یک نامزد تطابق در نظر بگیرید که مقدار سرآیند
inlineباشد.اگر هیچیک از نامزدها با هیچیک از ترجیحات موجود در preferencelist مطابقت نداشت،
Noneرا برگردانید.یادداشتها: (۱) برای بیشتر برنامهها، تنها ترکیبهای preferencelist که واقعاً منطقی هستند،
('plain',)،('html', 'plain')و پیشفرض('related', 'html', 'plain')هستند. (۲) از آنجا که تطبیق از شیءای آغاز میشود کهget_bodyروی آن فراخوانی میشود، فراخوانیget_bodyروی یکmultipart/relatedخود شیء را برمیگرداند، مگر اینکه preferencelist مقداری غیر از مقدار پیشفرض داشته باشد. (۳) پیامها (یا بخشهای پیام) که Content-Type را مشخص نمیکنند یا سرآیند Content-Type آنها نامعتبر است، بهعنوان نوعtext/plainدر نظر گرفته میشوند، که ممکن است گاهی باعث شودget_bodyنتایج غیرمنتظرهای برگرداند.
- iter_attachments()¶
پیمایشگری بر همه زیربخشهای مستقیم پیام که بخشهای نامزد «بدنه» نیستند برمیگرداند. یعنی از نخستین رخداد هر یک از
text/plain،text/html،multipart/relatedیاmultipart/alternativeمیگذرد (مگر اینکه بهصراحت از طریق Content-Disposition: attachment بهعنوان پیوست علامتگذاری شده باشند) و همه بخشهای باقیمانده را برمیگرداند. هنگامی که مستقیماً بر یکmultipart/relatedاعمال شود، پیمایشگری بر همه بخشهای مرتبط به جز بخش ریشه برمیگرداند (یعنی بخشی که پارامترstartبه آن اشاره دارد، یا نخستین بخش در صورتی که پارامترstartوجود نداشته باشد یا پارامترstartبا Content-ID هیچیک از بخشها مطابقت نداشته باشد). هنگامی که مستقیماً بر یکmultipart/alternativeیا غیرmultipartاعمال شود، یک پیمایشگر خالی برمیگرداند.
- iter_parts()¶
پیمایشگری روی همهی زیربخشهای مستقیم پیام برمیگرداند که برای یک پیام غیر
multipartخالی خواهد بود. (همچنینwalk()را ببینید.)
- get_content(*args, content_manager=None, **kw)¶
متد
get_content()از content_manager را فراخوانی کنید، self را بهعنوان شیء پیام ارسال کنید، و هر آرگومان یا کلیدواژه دیگر را نیز بهعنوان آرگومانهای اضافی همراه آن ارسال کنید. اگر content_manager مشخص نشده باشد، ازcontent_managerمشخصشده توسطpolicyفعلی استفاده کنید.
- set_content(*args, content_manager=None, **kw)¶
متد
set_content()از content_manager را فراخوانی کنید و self را بهعنوان شیء پیام و هر آرگومان یا کلیدواژه دیگر را بهعنوان آرگومانهای اضافی ارسال کنید. اگر content_manager مشخصنشده باشد، ازcontent_managerتعیینشده توسطpolicyجاری استفاده کنید.
یک پیام غیر
multipartرا به یک پیامmultipart/relatedتبدیل میکند و هرگونه سرآیند Content- و بار موجود را به بخش نخست (جدید) ازmultipartمنتقل میکند. اگر boundary مشخص شده باشد، از آن بهعنوان رشتهی مرز در multipart استفاده میشود؛ در غیر این صورت، مرز بهصورت خودکار در زمان نیاز ایجاد میشود (برای مثال، هنگامی که پیام سریالسازی میشود).
- make_alternative(boundary=None)¶
یک پیام غیر
multipartیا یکmultipart/relatedرا بهmultipart/alternativeتبدیل میکند و تمام سرآیندهای Content- و بار موجود را به اولین بخش (جدید) ازmultipartمنتقل میکند. اگر boundary مشخص شده باشد، از آن بهعنوان رشتهی مرزی در multipart استفاده میکند، در غیر این صورت اجازه میدهد مرز بهصورت خودکار در زمانی که به آن نیاز است (برای مثال، هنگامی که پیام سریالسازی میشود) ایجاد شود.
- make_mixed(boundary=None)¶
یک پیام غیر
multipart، یکmultipart/related، یا یکmultipart-alternativeرا به یکmultipart/mixedتبدیل میکند و همهی سرآیندهای Content- و بار موجود را به نخستین بخش (جدید) ازmultipartمنتقل میکند. اگر boundary مشخص شده باشد، از آن بهعنوان رشتهی مرز در multipart استفاده میشود، در غیر این صورت مرز بهصورت خودکار در زمان نیاز (برای مثال، هنگامی که پیام سریالسازی میشود) ایجاد میشود.
اگر پیام یک
multipart/relatedباشد، یک شیء پیام جدید ایجاد کنید، تمام آرگومانها را به متدset_content()آن منتقل کنید و آن را باattach()بهmultipartپیوست کنید. اگر پیام غیرmultipartباشد،make_related()را فراخوانی کنید و سپس مطابق آنچه گفته شد ادامه دهید. اگر پیام هر نوع دیگری ازmultipartباشد، یکTypeErrorپرتاب کنید. اگر content_manager مشخص نشده باشد، ازcontent_managerمشخصشده توسطpolicyفعلی استفاده کنید. اگر بخش افزودهشده سرآیند Content-Disposition نداشته باشد، سرآیندی با مقدارinlineاضافه کنید.
- add_alternative(*args, content_manager=None, **kw)¶
اگر پیام
multipart/alternativeباشد، یک شیء پیام جدید ایجاد کنید، همهی آرگومانها را به متدset_content()آن ارسال کنید و آن را باattach()بهmultipartپیوست کنید. اگر پیام غیرmultipartیاmultipart/relatedباشد،make_alternative()را فراخوانی کنید و سپس مطابق بالا ادامه دهید. اگر پیام هر نوع دیگری ازmultipartباشد، یکTypeErrorپرتاب کنید. اگر content_manager مشخص نشده باشد، ازcontent_managerتعیینشده توسطpolicyفعلی استفاده کنید.
- add_attachment(*args, content_manager=None, **kw)¶
اگر پیام
multipart/mixedباشد، یک شیء پیام جدید ایجاد کنید، تمام آرگومانها را به متدset_content()آن ارسال کنید، و آن را بهmultipartattach()کنید. اگر پیام غیرmultipart،multipart/relatedیاmultipart/alternativeباشد،make_mixed()را فراخوانی کنید و سپس مطابق بالا ادامه دهید. اگر content_manager مشخص نشده باشد، ازcontent_managerمشخصشده توسطpolicyفعلی استفاده کنید. اگر بخش افزودهشده سرآیند Content-Disposition نداشته باشد، سرآیندی با مقدارattachmentاضافه کنید. از این متد میتوان هم برای پیوستهای صریح (Content-Disposition: attachment) و هم برای پیوستهایinline(Content-Disposition: inline)، با ارسال گزینههای مناسب بهcontent_managerاستفاده کرد.
- clear()¶
بار و همهی سرآیندها را حذف کنید.
- clear_content()¶
بار و تمام سرآیندهای !Content- را حذف کنید و تمام سرآیندهای دیگر را دستنخورده و با ترتیب اصلی خود باقی بگذارید.
اشیاء
EmailMessageدارای ویژگیهای نمونه زیر هستند:- preamble¶
قالب یک سند MIME اجازه میدهد که مقداری متن بین خط خالی پس از سرآیندها و اولین رشتهی مرزی چندبخشی قرار گیرد. معمولاً، این متن در یک خوانندهی ایمیل آگاه از MIME هرگز قابل مشاهده نیست، زیرا خارج از پوشش استاندارد MIME قرار میگیرد. با این حال، هنگام مشاهدهی متن خام پیام، یا هنگام مشاهدهی پیام در یک خوانندهی غیرآگاه از MIME، این متن میتواند قابل مشاهده شود.
ویژگی preamble شامل این متن محافظتی اضافی پیشرو برای اسناد MIME است. هنگامی که
Parserمتنی را پس از سرآیندها اما پیش از اولین رشتهی مرزی پیدا کند، آن متن را به ویژگی preamble پیام اختصاص میدهد. هنگامی کهGeneratorدر حال نوشتن نمایش متنی سادهی یک پیام MIME باشد و ببیند پیام دارای ویژگی preamble است، این متن را در ناحیهی بین سرآیندها و اولین مرز مینویسد. برای جزئیات،email.parserوemail.generatorرا ببینید.توجه داشته باشید که اگر شیء پیام فاقد پیشدرآمد (preamble) باشد، ویژگی preamble برابر
Noneخواهد بود.
- epilogue¶
ویژگی epilogue همانند ویژگی preamble عمل میکند، با این تفاوت که شامل متنی است که بین آخرین مرز و پایان پیام ظاهر میشود. همانطور که در مورد
preambleنیز صدق میکند، اگر متن پسدرآمد وجود نداشته باشد، این ویژگیNoneخواهد بود.
- defects¶
ویژگی defects شامل فهرستی از تمام مشکلات یافتشده هنگام تجزیه این پیام است. برای شرح دقیق نقصهای ممکن در تجزیه،
email.errorsرا ببینید.
- class email.message.MIMEPart(policy=default)¶
این کلاس نمایانگر یک زیربخش از پیام MIME است. این کلاس با
EmailMessageیکسان است، با این تفاوت که هنگام فراخوانیset_content()، هیچ سرآیند MIME-Version اضافه نمیشود، زیرا زیربخشها به سرآیندهای MIME-Version خود نیاز ندارند.
پانویسها