email.contentmanager: Managing MIME Content¶
Вихідний код: Lib/email/contentmanager.py
Added in version 3.6: [1]
- class email.contentmanager.ContentManager¶
Базовий клас для менеджерів вмісту. Надає стандартні механізми реєстру для реєстрації конвертерів між вмістом MIME та іншими представленнями, а також методи відправлення
get_contentіset_content.- get_content(msg, *args, **kw)¶
Знайдіть функцію обробки на основі
mimetypemsg (див. наступний параграф), викличте її, передаючи всі аргументи, і поверніть результат виклику. Очікується, що обробник витягне корисне навантаження з msg і поверне об’єкт, який кодує інформацію про витягнуті дані.Щоб знайти обробник, знайдіть такі розділи в реєстрі, зупинившись на першому знайденому:
рядок, що представляє повний тип MIME (
maintype/subtype)рядок, що представляє
maintypeпорожній рядок
Якщо жоден із цих ключів не створює обробник, викличте
KeyErrorдля повного типу MIME.
- 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__).the type’s
qualname(typ.__qualname__)the type’s
name(typ.__name__).
If none of the above match, repeat all of the checks above for each of the types in the MRO (
typ.__mro__). Finally, if no other key yields a handler, check for a handler for the keyNone. If there is no handler forNone, raise aKeyErrorfor the fully qualified name of the type.Також додайте заголовок MIME-Version, якщо його немає (див. також
MIMEPart).
- add_get_handler(key, handler)¶
Запишіть функцію обробник як обробник для ключа. Можливі значення key див. у
get_content().
- add_set_handler(typekey, handler)¶
Запишіть обробник як функцію для виклику, коли об’єкт типу, який відповідає typekey, передається до
set_content(). Можливі значення typekey див. уset_content().
Примірники Content Manager¶
Наразі пакет електронної пошти містить лише один конкретний менеджер вмісту, raw_data_manager, хоча в майбутньому може бути додано більше. raw_data_manager — це content_manager, наданий EmailPolicy та його похідними.
- email.contentmanager.raw_data_manager¶
Цей менеджер вмісту надає лише мінімальний інтерфейс, окрім того, який надає сам
Message: він має справу лише з текстом, необробленими рядками байтів та об’єктамиMessage. Тим не менш, він надає значні переваги порівняно з базовим API:get_contentу текстовій частині поверне рядок Unicode без необхідності програми вручну декодувати його,set_contentнадає багатий набір параметрів для керування заголовками додається до частини та контролює кодування передачі вмісту, а також дозволяє використовувати різні методиadd_, тим самим спрощуючи створення багатокомпонентних повідомлень.- email.contentmanager.get_content(msg, errors='replace')¶
Повертає корисне навантаження частини як рядок (для частин
text), об’єктEmailMessage(для частинmessage/rfc822) абоbytesоб’єкт (для всіх інших нескладних типів). ВикликаєKeyError, якщо викликається наmultipart. Якщо частина є частиною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)
Додайте заголовки та корисне навантаження до повідомлення:
Додайте заголовок Content-Type зі значенням
maintype/subtype.Для
strвстановітьmaintypeMIME наtextі встановіть підтип на subtype, якщо він указаний, абоplain, якщо він не вказано.Для
bytesвикористовуйте вказані maintype і subtype або викликайтеTypeError, якщо вони не вказані.Для об’єктів
EmailMessageвстановіть основний тип якmessage, а для підтипу встановіть subtype, якщо він указаний, абоrfc822, якщо його немає. Якщо subtype має значенняpartial, виникає помилка (об’єктиbytesповинні використовуватися для створення частинmessage/partial).
Якщо надано charset (який дійсний лише для
str), закодуйте рядок у байти за допомогою вказаного набору символів. Типовим єutf-8. Якщо вказаний набір символів є відомим псевдонімом для назви стандартного набору кодів MIME, замість цього використовуйте стандартний набір символів.Якщо встановлено cte, закодуйте корисне навантаження, використовуючи вказане кодування передачі вмісту, і встановіть це значення для заголовка Content-Transfer-Encoding. Можливі значення для cte:
quoted-printable,base64,7bit,8bitіbinary. Якщо вхідні дані не можна закодувати у вказаному кодуванні (наприклад, вказавши cte7bitдля вхідних даних, які містять значення, відмінні від ASCII), викликайтеValueError.For
strobjects, if cte is not set use heuristics to determine the most compact encoding. Prior to encoding,str.splitlines()is used to normalize all line boundaries, ensuring that each line of the payload is terminated by the current policy’slinesepproperty (even if the original string did not end with one).For
bytesobjects, cte is taken to be base64 if not set, and the aforementioned newline translation is not performed.Для
EmailMessage, відповідно до RFC 2046, викликати помилку, якщо ctequoted-printableабоbase64запитується для підтипуrfc822і для будь-якого cte, крім7bitдля підтипуexternal-body. Дляmessage/rfc822використовуйте8bit, якщо cte не вказано. Для всіх інших значень 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 і це список рядків у формі
назва заголовка: значення заголовкаабо список об’єктівзаголовка(відрізняються від рядків наявністю атрибутаназва), додайте заголовки на повідомлення.
Виноски