email.contentmanager
: Managing MIME Content¶
Kod źródłowy: Lib/email/contentmanager.py
Added in version 3.6: [1]
- class email.contentmanager.ContentManager¶
Базовий клас для менеджерів вмісту. Надає стандартні механізми реєстру для реєстрації конвертерів між вмістом MIME та іншими представленнями, а також методи відправлення
get_content
іset_content
.- get_content(msg, *args, **kw)¶
Знайдіть функцію обробки на основі
mimetype
msg (див. наступний параграф), викличте її, передаючи всі аргументи, і поверніть результат виклику. Очікується, що обробник витягне корисне навантаження з 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 aKeyError
for 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
встановітьmaintype
MIME на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
str
objects, 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'slinesep
property (even if the original string did not end with one).For
bytes
objects, 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
.
Catatan
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 і це список рядків у формі
назва заголовка: значення заголовка
або список об’єктівзаголовка
(відрізняються від рядків наявністю атрибутаназва
), додайте заголовки на повідомлення.
Catatan kaki