email.message.Message: بازنمایی یک پیام ایمیل با استفاده از API compat32¶
کلاس Message بسیار شبیه به کلاس EmailMessage است، با این تفاوت که متدهای اضافهشده توسط آن کلاس را ندارد و رفتار پیشفرض برخی متدهای دیگر آن اندکی متفاوت است. ما در اینجا برخی متدها را نیز مستند کردهایم که اگرچه توسط کلاس EmailMessage پشتیبانی میشوند، توصیه نمیشوند مگر اینکه با کد قدیمی سروکار داشته باشید.
فلسفه و ساختار این دو کلاس، در سایر موارد یکسان است.
این سند رفتار تحت سیاست پیشفرض (برای Message) یعنی Compat32 را توصیف میکند. اگر قصد استفاده از سیاست دیگری را دارید، باید بهجای آن از کلاس EmailMessage استفاده کنید.
یک پیام ایمیل از سرآیندها و یک بار تشکیل میشود. سرآیندها باید نامها و مقدارهایی به سبک RFC 5322 باشند، که در آن نام فیلد و مقدار آن با یک دونقطه از هم جدا میشوند. دونقطه بخشی از نام فیلد یا مقدار فیلد نیست. بار ممکن است یک پیام متنی ساده، یا یک شیء دودویی، یا دنبالهای ساختاریافته از پیامهای فرعی باشد که هرکدام مجموعهای از سرآیندها و بار خود را دارند. نوع اخیر بار با این مشخص میشود که پیام دارای یک نوع MIME مانند multipart/* یا message/rfc822 باشد.
مدل مفهومی ارائهشده توسط یک شیء Message، یک دیکشنری مرتب از سرآیندها به همراه متدهای اضافی برای دسترسی به اطلاعات تخصصی از سرآیندها، دسترسی به بار، تولید یک نسخه سریالشده از پیام و پیمایش بازگشتی روی درخت شیء است. توجه داشته باشید که سرآیندهای تکراری پشتیبانی میشوند، اما برای دسترسی به آنها باید از متدهای ویژهی استفاده شود.
شبهدیکشنری Message با نام سرآیندها اندیسدهی میشود، که باید مقادیر ASCII باشند. مقادیر این دیکشنری رشتههایی هستند که انتظار میرود فقط شامل نویسههای ASCII باشند؛ برای ورودی غیر ASCII مدیریت ویژهای وجود دارد، اما این مدیریت همیشه نتایج صحیح را تولید نمیکند. سرآیندها با حفظ بزرگی و کوچکی حروف ذخیره و برگردانده میشوند، اما نام فیلدها بدون حساسیت به بزرگی و کوچکی حروف تطبیق داده میشوند. همچنین ممکن است یک سرآیند پاکت (envelope header) واحد وجود داشته باشد، که به آن سرآیند Unix-From یا سرآیند From_ نیز گفته میشود. بار در اشیای پیام ساده، یا یک رشته است یا بایتها، و در اسناد ظرف MIME (مانند multipart/* و message/rfc822) فهرستی از اشیای Message است.
در اینجا متدهای کلاس Message آمده است:
- class email.message.Message(policy=compat32)¶
اگر policy مشخصشده باشد (باید نمونهای از یک کلاس
policyباشد)، از قواعد مشخصشده توسط آن برای بهروزرسانی و سریالسازی بازنمایی پیام استفاده میشود. اگر policy تنظیمنشده باشد، از سیاستcompat32استفاده میشود که سازگاری با نسخهی بستهی email در پایتون 3.2 را حفظ میکند. برای اطلاعات بیشتر، مستنداتpolicyرا ببینید.تغییر یافته در نسخهی 3.3: آرگومان کلیدواژهای policy افزوده شد.
- as_string(unixfrom=False, maxheaderlen=0, policy=None)¶
کل پیام را بهصورت یک رشتهی تختشده برمیگرداند. هرگاه آرگومان اختیاری unixfrom درست باشد، سرآیند پاکت در رشتهی برگرداندهشده گنجانده میشود. مقدار پیشفرض unixfrom برابر
Falseاست. به دلایل سازگاری با نسخههای پیشین، مقدار پیشفرض maxheaderlen برابر0است، بنابراین اگر مقدار دیگری میخواهید، باید آن را بهصراحت بازنویسی کنید (مقدار مشخصشده برای max_line_length در سیاست توسط این متد نادیده گرفته میشود). میتوان از آرگومان policy برای بازنویسی سیاست پیشفرض گرفتهشده از نمونهی پیام استفاده کرد. از آنجا که policy مشخصشده بهGeneratorارسال میشود، میتوان از آن برای کنترل برخی از قالببندیهای تولیدشده توسط این متد استفاده کرد.تختسازی پیام (flattening) ممکن است باعث ایجاد تغییراتی در
Messageشود، اگر برای تکمیل تبدیل به رشته نیاز باشد مقادیر پیشفرض پر شوند (برای مثال، ممکن است مرزهای MIME تولید یا اصلاح شوند).توجه داشته باشید که این متد برای سهولت فراهم شده است و ممکن است همیشه پیام را آنگونه که میخواهید قالببندی نکند. برای مثال، بهطور پیشفرض، دستکاری سطرهایی که با
Fromشروع میشوند و قالب mbox یونیکس آن را ایجاب میکند انجام نمیدهد. برای انعطافپذیری بیشتر، نمونهای ازGeneratorایجاد کنید و مستقیماً از متدflatten()آن استفاده کنید. برای مثال:from io import StringIO from email.generator import Generator fp = StringIO() g = Generator(fp, mangle_from_=True, maxheaderlen=60) g.flatten(msg) text = fp.getvalue()
If the message object contains binary data that is not encoded according to RFC standards, the non-compliant data will be replaced by Unicode "unknown character" code points. (See also
as_bytes()andBytesGenerator.)تغییر یافته در نسخهی 3.4: آرگومان کلیدواژهای policy افزوده شد.
- __str__()¶
معادل
as_string(). بهstr(msg)اجازه میدهد رشتهای حاوی پیام قالببندیشده تولید کند.
- as_bytes(unixfrom=False, policy=None)¶
کل پیام را بهصورت یک شیء bytes مسطحشده برمیگرداند. هنگامی که آرگومان اختیاری unixfrom true باشد، سرآیند پاکت (envelope header) در رشته برگرداندهشده گنجانده میشود. unixfrom بهطور پیشفرض
Falseاست. میتوان از آرگومان policy برای نادیده گرفتن سیاست پیشفرض گرفتهشده از نمونه پیام استفاده کرد. میتوان از این کار برای کنترل برخی از قالببندیهای تولیدشده توسط متد استفاده کرد، زیرا policy مشخصشده بهBytesGeneratorارسال میشود.تختسازی پیام (flattening) ممکن است باعث ایجاد تغییراتی در
Messageشود، اگر برای تکمیل تبدیل به رشته نیاز باشد مقادیر پیشفرض پر شوند (برای مثال، ممکن است مرزهای MIME تولید یا اصلاح شوند).توجه داشته باشید که این متد برای سهولت ارائه شده است و ممکن است همیشه پیام را به شکلی که میخواهید قالببندی نکند. برای مثال، بهطور پیشفرض، دستکاری سطرهایی که با
Fromآغاز میشوند و قالب mbox یونیکس به آن نیاز دارد را انجام نمیدهد. برای انعطافپذیری بیشتر، یک نمونه ازBytesGeneratorایجاد کنید و مستقیماً از متدflatten()آن استفاده کنید. برای مثال:from io import BytesIO from email.generator import BytesGenerator fp = BytesIO() g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60) g.flatten(msg) text = fp.getvalue()
اضافه شده در نسخهی 3.4.
- __bytes__()¶
معادل با
as_bytes()است. بهbytes(msg)اجازه میدهد که یک شیء bytes حاوی پیام قالببندیشده تولید کند.اضافه شده در نسخهی 3.4.
- is_multipart()¶
اگر بار پیام فهرستی از اشیای sub-
Messageباشد،Trueرا برمیگرداند، در غیر این صورتFalseرا برمیگرداند. هنگامی کهis_multipart()مقدارFalseرا برمیگرداند، بار باید یک شیء رشته باشد (که ممکن است یک بار دودویی کدگذاریشده با CTE باشد). (توجه داشته باشید که برگرداندنTrueتوسطis_multipart()لزوماً به این معنا نیست که "msg.get_content_maintype() == 'multipart'" مقدارTrueرا برمیگرداند. برای مثال، هنگامی کهMessageاز نوعmessage/rfc822باشد،is_multipartمقدارTrueرا برمیگرداند.)
- set_unixfrom(unixfrom)¶
سرآیند پاکت پیام را روی unixfrom تنظیم کنید، که باید یک رشته باشد.
- get_unixfrom()¶
سرآیند پاکت پیام را برمیگرداند. اگر سرآیندی پاکت هرگز تنظیم نشده باشد، مقدار پیشفرض
Noneاست.
- attach(payload)¶
بار دادهشده (payload) را به بار کنونی اضافه کنید، که باید پیش از فراخوانی
Noneیا فهرستی از اشیایMessageباشد. پس از فراخوانی، بار همیشه فهرستی از اشیایMessageخواهد بود. اگر میخواهید بار را روی یک شیء اسکالر (scalar)، برای مثال یک رشته، تنظیم کنید، در عوض ازset_payload()استفاده کنید.این یک متد قدیمی است. در کلاس
EmailMessage، عملکرد آن باset_content()و متدهای مرتبطmakeوaddجایگزین شده است.
- get_payload(i=None, decode=False)¶
بار فعلی را بازمیگرداند، که هنگامی که
is_multipart()برابرTrueباشد، فهرستی از اشیاءMessageخواهد بود، یا هنگامی کهis_multipart()برابرFalseباشد، یک رشته خواهد بود. اگر بار یک فهرست باشد و شما شیء فهرست را تغییر دهید، بار پیام را درجا تغییر میدهید.با آرگومان اختیاری i، اگر
is_multipart()برابرTrueباشد،get_payload()عنصر i*ام بار را، با شمارش از صفر، برمیگرداند. اگر *i کمتر از ۰ یا بزرگتر یا مساوی تعداد آیتمهای بار باشد،IndexErrorپرتاب میشود. اگر بار یک رشته باشد (یعنیis_multipart()برابرFalseباشد) و i داده شده باشد،TypeErrorپرتاب میشود.decode اختیاری پرچمی است که نشان میدهد بار باید بر اساس سرآیند Content-Transfer-Encoding کدگشایی شود یا خیر. هنگامی که
Trueباشد و پیام چندبخشی نباشد، اگر مقدار این سرآیندquoted-printableیاbase64باشد، بار کدگشایی خواهد شد. اگر از کدگذاری دیگری استفاده شده باشد یا سرآیند Content-Transfer-Encoding وجود نداشته باشد، بار بههمانصورت (کدگشایینشده) برگردانده میشود. در همه حالتها، مقدار برگرداندهشده دادههای دودویی است. اگر پیام چندبخشی باشد و پرچم decodeTrueباشد،Noneبرگردانده میشود. اگر بار base64 باشد و بهطور کامل درست تشکیل نشده باشد (نبود پدینگ، نویسههای خارج از الفبای base64)، نقص مناسبی به ویژگی نقص پیام افزوده خواهد شد (InvalidBase64PaddingDefectیاInvalidBase64CharactersDefect، بهترتیب).هنگامی که decode برابر
Falseباشد (پیشفرض)، بدنه بهصورت یک رشته بدون کدگشایی بر اساس Content-Transfer-Encoding بازگردانده میشود. با این حال، برای Content-Transfer-Encoding با مقدار 8bit، تلاشی برای کدگشایی بایتهای اصلی با استفاده ازcharsetمشخصشده توسط سرآیند Content-Type و با کنترلکنندهی خطایreplaceصورت میگیرد. اگر هیچcharsetمشخص نشده باشد، یاcharsetدادهشده توسط بستهی email شناخته نشود، بدنه با استفاده از نویسهگان پیشفرض ASCII کدگشایی میشود.این یک متد قدیمی است. در کلاس
EmailMessage، عملکرد آن باget_content()وiter_parts()جایگزین شده است.
- set_payload(payload, charset=None)¶
کل بار شیء پیام را روی payload تنظیم کنید. مسئولیت اطمینان از برقراری ناورداهای بار بر عهده کلاینت است. charset اختیاری، مجموعهی نویسهی پیشفرض پیام را تنظیم میکند؛ برای جزئیات
set_charset()را ببینید.این یک متد قدیمی است. در کلاس
EmailMessage، عملکرد آن باset_content()جایگزین شده است.
- set_charset(charset)¶
مجموعهی نویسههای بار را روی charset تنظیم کنید، که میتواند یک نمونه از
Charset(بهemail.charsetمراجعه کنید)، رشتهای که نام یک مجموعه نویسه را مشخص میکند، یاNoneباشد. اگر یک رشته باشد، به یک نمونه ازCharsetتبدیل خواهد شد. اگر charset برابرNoneباشد، پارامترcharsetاز سرآیند Content-Type حذف خواهد شد (پیام بهجز این مورد تغییر دیگری نخواهد کرد). هر چیز دیگری باعث ایجادTypeErrorخواهد شد.اگر سرآیند MIME-Version از قبل وجود نداشته باشد، یکی افزوده میشود. اگر سرآیند Content-Type از قبل وجود نداشته باشد، یکی با مقدار text/plain افزوده میشود. چه سرآیند Content-Type از قبل وجود داشته باشد و چه نداشته باشد، پارامتر
charsetآن به charset.output_charset تنظیم میشود. اگر charset.input_charset و charset.output_charset متفاوت باشند، بار به output_charset دوباره کدگذاری میشود. اگر سرآیند Content-Transfer-Encoding از قبل وجود نداشته باشد، در صورت نیاز، بار با استفاده ازCharsetتعیینشده، کدگذاری انتقالی میشود و سرآیندی با مقدار مناسب افزوده میشود. اگر سرآیند Content-Transfer-Encoding از قبل وجود داشته باشد، فرض میشود بار از قبل بهدرستی با استفاده از همان Content-Transfer-Encoding کدگذاری شده است و تغییر داده نمیشود.این یک متد قدیمی است. در کلاس
EmailMessage، عملکرد آن با پارامتر charset متدemail.message.EmailMessage.set_content()جایگزین شده است.
- get_charset()¶
نمونهی
Charsetمرتبط با بار پیام را برمیگرداند.این یک متد قدیمی است. در کلاس
EmailMessageهمیشهNoneرا برمیگرداند.
متدهای زیر یک رابط نگاشتمانند برای دسترسی به سرآیندهای RFC 2822 پیام پیادهسازی میکنند. توجه داشته باشید که برخی تفاوتهای معنایی میان این متدها و یک رابط نگاشت معمول (یعنی دیکشنری) وجود دارد. برای مثال، در دیکشنری هیچ کلید تکراری وجود ندارد، اما اینجا ممکن است سرآیندهای تکراری پیام وجود داشته باشد. همچنین، در دیکشنریها ترتیبی برای کلیدهای برگرداندهشده توسط
keys()تضمین نمیشود، اما در یک شیءMessage، سرآیندها همیشه به همان ترتیبی که در پیام اصلی ظاهر شدهاند یا بعداً به پیام اضافه شدهاند، برگردانده میشوند. هر سرآیندی که حذف و سپس دوباره اضافه شود، همیشه به انتهای فهرست سرآیندها افزوده میشود.این تفاوتهای معنایی عمدی هستند و به سمت حداکثر سهولت تمایل دارند.
توجه داشته باشید که در همه موارد، هر سرآیند پاکت (envelope header) موجود در پیام، در رابط نگاشت گنجانده نمیشود.
در مدلی که از بایتها تولید شده است، هر یک از مقادیر سرآیند که (برخلاف RFCها) حاوی بایتهای غیرASCII باشند، هنگام بازیابی از طریق این رابط، بهصورت اشیای
Headerبا مجموعهنویسهیunknown-8bitنمایش داده میشوند.- __len__()¶
تعداد کل سرآیندها، شامل تکراریها را برمیگرداند.
- __contains__(name)¶
اگر شیء پیام دارای فیلدی به نام name باشد،
Trueرا برمیگرداند. تطبیق بدون حساسیت به بزرگی و کوچکی حروف انجام میشود و name نباید شامل دونقطه پایانی باشد. برای عملگرinاستفاده میشود، برای مثال:if 'message-id' in myMessage: print('Message-ID:', myMessage['message-id'])
- __getitem__(name)¶
مقدار فیلد سرآیند نامبردهشده را برمیگرداند. name نباید شامل دونقطهی جداکنندهی فیلد باشد. اگر سرآیند وجود نداشته باشد،
Noneبازگشت داده میشود؛ هرگزKeyErrorپرتاب نمیشود.توجه داشته باشید که اگر فیلد نامبردهشده بیش از یک بار در سرآیندهای پیام ظاهر شود، دقیقاً اینکه کدامیک از مقادیر آن فیلد برگردانده خواهد شد، تعریفنشده است. برای دریافت مقادیر همهی سرآیندهای نامبردهشدهی موجود، از متد
get_all()استفاده کنید.
- __setitem__(name, val)¶
یک سرآیند با نام فیلد name و مقدار val به پیام اضافه کنید. این فیلد به انتهای فیلدهای موجود پیام افزوده میشود.
توجه داشته باشید که این کار هیچ سرآیند موجودی با نام یکسان را بازنویسی یا حذف نمیکند. اگر میخواهید اطمینان حاصل کنید که سرآیند جدید تنها سرآیند موجود در پیام با نام فیلد name است، ابتدا فیلد را حذف کنید، برای مثال:
del msg['subject'] msg['subject'] = 'Python roolz!'
- __delitem__(name)¶
تمام موارد فیلد با نام name را از سرآیندهای پیام حذف میکند. اگر فیلد نامبردهشده در سرآیندها وجود نداشته باشد، هیچ استثنایی پرتاب نمیشود.
- keys()¶
فهرستی از همهی نامهای فیلد سرایند پیام را برمیگرداند.
- values()¶
فهرستی از تمام مقادیر فیلدهای پیام را برمیگرداند.
- items()¶
فهرستی از تاپلهای دوتایی شامل تمام سرآیندها و مقادیر فیلدهای پیام را برمیگرداند.
- get(name, failobj=None)¶
مقدار فیلد سرآیند با نام مشخصشده را برمیگرداند. این دقیقاً مانند
__getitem__()است، با این تفاوت که اگر سرآیند با نام مشخصشده وجود نداشته باشد، failobj اختیاری برگردانده میشود (پیشفرضNoneاست).
در اینجا چند متد مفید دیگر آمده است:
- 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'))
که تولید میکند
Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt"
- replace_header(_name, _value)¶
یک سرآیند را جایگزین میکند. نخستین سرآیند یافتشده در پیام را که با _name مطابقت دارد، با حفظ ترتیب سرآیندها و حالت حروف نام فیلد جایگزین میکند. اگر هیچ سرآیند مطابقی یافت نشد، یک
KeyErrorپرتاب میشود.
- get_content_type()¶
نوع محتوای پیام را بازمیگرداند. رشتهی بازگرداندهشده به حروف کوچک تبدیل میشود و در قالب maintype/subtype خواهد بود. اگر سرآیند Content-Type در پیام وجود نداشته باشد، نوع پیشفرض دادهشده توسط
get_default_type()بازگردانده خواهد شد. از آنجا که طبق 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_params(failobj=None, header='content-type', unquote=True)¶
پارامترهای Content-Type پیام را بهصورت یک فهرست بازمیگرداند. عناصر فهرست برگرداندهشده تاپلهای دوتایی از جفتهای کلید/مقدار هستند که بر اساس علامت
'='تفکیک شدهاند. سمت چپ علامت'='کلید است، در حالی که سمت راست آن مقدار است. اگر علامت'='در پارامتر وجود نداشته باشد، مقدار یک رشته خالی است؛ در غیر این صورت مقدار همانگونه است که درget_param()توضیح داده شده است و اگر پارامتر اختیاری unquote برابرTrueباشد (پیشفرض)، بدون علامت نقلقول میشود.failobj اختیاری، شیءای است که اگر سرآیند Content-Type وجود نداشته باشد، بازگردانده میشود. header اختیاری، سرآیندی است که بهجای Content-Type جستجو میشود.
این یک متد قدیمی است. در کلاس
EmailMessage، عملکرد آن با ویژگی params اشیای سرآیند جداگانهای که توسط متدهای دسترسی به سرآیند برگردانده میشوند، جایگزین شده است.
- get_param(param, failobj=None, header='content-type', unquote=True)¶
مقدار پارامتر param از سرآیند Content-Type را بهصورت یک رشته برمیگرداند. اگر پیام سرآیند Content-Type نداشته باشد یا چنین پارامتری وجود نداشته باشد، failobj برگردانده میشود (پیشفرض آن
Noneاست).header اختیاری، در صورت داده شدن، سرآیند پیامی را مشخص میکند که بهجای Content-Type استفاده میشود.
کلیدهای پارامتر همیشه بدون حساسیت به بزرگی و کوچکی حروف مقایسه میشوند. مقدار بازگشتی میتواند یک رشته باشد، یا یک تاپل سهتایی در صورتی که پارامتر مطابق RFC 2231 کدگذاری شده باشد. هنگامی که یک تاپل سهتایی باشد، عناصر مقدار به شکل
(CHARSET, LANGUAGE, VALUE)هستند. توجه داشته باشید که هر دوCHARSETوLANGUAGEمیتوانندNoneباشند، که در این صورت باید فرض کنیدVALUEبا مجموعهنویسهus-asciiکدگذاری شده است. معمولاً میتوانیدLANGUAGEرا نادیده بگیرید.اگر برای برنامهی شما اهمیتی ندارد که پارامتر مطابق RFC 2231 کدگذاری شده باشد، میتوانید با فراخوانی
email.utils.collapse_rfc2231_value()و ارسال مقدار بازگشتی ازget_param()، مقدار پارامتر را یکپارچه کنید. این تابع، هنگامی که مقدار یک تاپل باشد، یک رشتهی Unicode را که بهطور مناسب کدگشایی شده است برمیگرداند، یا در غیر این صورت رشتهی اصلی بدون علامت نقلقول را برمیگرداند. برای مثال:rawparam = msg.get_param('foo') param = email.utils.collapse_rfc2231_value(rawparam)
در هر صورت، مقدار پارامتر (چه رشتهی برگرداندهشده، چه آیتم
VALUEدر ۳-تایی) همیشه بدون علامت نقلقول است، مگر اینکه unquote رویFalseتنظیم شده باشد.این یک متد قدیمی است. در کلاس
EmailMessage، عملکرد آن با ویژگی params اشیای سرآیند جداگانهای که توسط متدهای دسترسی به سرآیند برگردانده میشوند، جایگزین شده است.
- set_param(param, value, header='Content-Type', requote=True, charset=None, language='', replace=False)¶
پارامتری را در سرآیند Content-Type تنظیم کنید. اگر پارامتر از قبل در سرآیند وجود داشته باشد، مقدار آن با value جایگزین خواهد شد. اگر سرآیند Content-Type هنوز برای این پیام تعریفنشده باشد، به text/plain تنظیم خواهد شد و مقدار پارامتر جدید مطابق RFC 2045 افزوده خواهد شد.
header اختیاری یک سرآیند جایگزین بهجای Content-Type مشخص میکند، و همهی پارامترها در صورت لزوم داخل علامت نقلقول قرار میگیرند، مگر آنکه requote اختیاری
Falseباشد (پیشفرضTrueاست).اگر charset اختیاری مشخص شده باشد، پارامتر مطابق RFC 2231 کدگذاری خواهد شد. language اختیاری، زبان RFC 2231 را مشخص میکند و مقدار پیشفرض آن رشته خالی است. هر دو charset و language باید رشته باشند.
اگر replace برابر
Falseباشد (حالت پیشفرض)، سرآیند به انتهای فهرست سرآیندها منتقل میشود. اگر replace برابرTrueباشد، سرآیند در همان محل بهروزرسانی میشود.تغییر یافته در نسخهی 3.4: کلیدواژهی
replaceافزوده شد.
- del_param(param, header='content-type', requote=True)¶
پارامتر دادهشده را بهطور کامل از سرآیند Content-Type حذف میکند. سرآیند بهصورت درجا بدون پارامتر یا مقدار آن بازنویسی خواهد شد. همه مقادیر در صورت لزوم داخل علامت نقلقول قرار میگیرند، مگر اینکه requote
Falseباشد (پیشفرضTrueاست). پارامتر اختیاری header، جایگزینی برای Content-Type مشخص میکند.
- set_type(type, header='Content-Type', requote=True)¶
نوع اصلی و نوع فرعی را برای سرآیند Content-Type تنظیم کنید. type باید رشتهای به شکل maintype/subtype باشد، در غیر این صورت یک
ValueErrorپرتاب میشود.این متد سرآیند Content-Type را جایگزین میکند و تمام پارامترها را در جای خود نگه میدارد. اگر requote برابر
Falseباشد، نقلقول سرآیند موجود همانطور که هست باقی میماند، در غیر این صورت پارامترها داخل علامت نقلقول قرار میگیرند (حالت پیشفرض).میتوان یک سرآیند جایگزین را در آرگومان header مشخص کرد. هنگامی که سرآیند Content-Type تنظیم شود، سرآیند MIME-Version نیز اضافه میشود.
این یک متد قدیمی است. در کلاس
EmailMessage، عملکرد آن با متدهایmake_وadd_جایگزین شده است.
- 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 را در فهرست سرآیندها حفظ میکند. با این حال، این کار هیچیک از سطرهای ادامهای را که ممکن است در سرآیند اصلی Content-Type وجود داشته باشد، حفظ نمیکند.
- get_content_charset(failobj=None)¶
پارامتر
charsetسرآیند Content-Type را بهصورت حروف کوچک برمیگرداند. اگر سرآیند Content-Type وجود نداشته باشد، یا اگر آن سرآیند پارامترcharsetنداشته باشد، failobj برگردانده میشود.توجه داشته باشید که این متد با
get_charset()متفاوت است، که نمونهیCharsetرا برای کدگذاری پیشفرض بدنهی پیام برمیگرداند.
- get_charsets(failobj=None)¶
فهرستی شامل نام مجموعهنویسههای موجود در پیام برمیگرداند. اگر پیام از نوع multipart باشد، فهرست شامل یک المان بهازای هر زیربخش در بار خواهد بود، در غیر این صورت، فهرستی به طول ۱ خواهد بود.
هر آیتم در فهرست رشتهای خواهد بود که مقدار پارامتر
charsetدر سرآیند Content-Type برای زیربخش بازنماییشده است. با این حال، اگر زیربخش فاقد سرآیند Content-Type یا فاقد پارامترcharsetباشد، یا از نوع اصلی MIME text نباشد، آن آیتم در فهرست برگرداندهشده failobj خواهد بود.
- get_content_disposition()¶
در صورتی که پیام سرآیند Content-Disposition داشته باشد، مقدار با حروف کوچک (بدون پارامترها) آن را برمیگرداند؛ در غیر این صورت
Noneرا برمیگرداند. در صورتی که پیام از RFC 2183 پیروی کند، مقادیر ممکن برای این متد inline، attachment یاNoneهستند.اضافه شده در نسخهی 3.5.
- 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ببینیم:>>> 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وارد زیربخشها میشود.
اشیای
Messageهمچنین میتوانند بهصورت اختیاری دارای دو ویژگی نمونه باشند، که میتوان از آنها هنگام تولید متن ساده یک پیام MIME استفاده کرد.- preamble¶
قالب یک سند MIME اجازه میدهد که مقداری متن میان خط خالی پس از سرآیندها و نخستین رشتهی مرزی چندبخشی وجود داشته باشد. بهطور معمول، این متن در یک نامهخوان آگاه از MIME هرگز قابل مشاهده نیست، زیرا خارج از پوشش استاندارد MIME قرار دارد. با این حال، هنگام مشاهدهی متن خام پیام، یا هنگام مشاهدهی پیام در نامهخوانی که از MIME آگاه نیست، این متن میتواند قابل مشاهده شود.
ویژگی preamble شامل این متن نگهبان اضافی آغازین (extra-armor) برای اسناد MIME است. هنگامی که
Parserمتنی را پس از سرآیندها اما پیش از نخستین رشتهی مرزی پیدا کند، این متن را به ویژگی preamble پیام اختصاص میدهد. هنگامی کهGeneratorدر حال نوشتن نمایش متنی سادهی یک پیام MIME است و متوجه شود که پیام دارای ویژگی preamble است، این متن را در ناحیهی بین سرآیندها و نخستین مرز مینویسد. برای جزئیات،email.parserوemail.generatorرا ببینید.توجه داشته باشید که اگر شیء پیام فاقد preamble باشد، ویژگی preamble برابر
Noneخواهد بود.
- epilogue¶
ویژگی epilogue مانند ویژگی preamble عمل میکند، با این تفاوت که شامل متنی است که میان آخرین مرز (boundary) و پایان پیام قرار میگیرد.
برای اینکه
Generatorیک خط جدید در پایان پرونده چاپ کند، نیازی نیست بخش پایانی (epilogue) را به رشته خالی تنظیم کنید.
- defects¶
ویژگی defects شامل فهرستی از تمام مشکلات یافتشده هنگام تجزیهی این پیام است. برای شرح دقیق نقصهای ممکن در تجزیه،
email.errorsرا ببینید.