email.contentmanager: Управление содержимым MIME
Исходный код: Lib/email/contentmanager.py
Новая в версии 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. - строка, представляющая полный тип 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__) - qualname типа (
typ.__qualname__) - имя типа (
typ.__name__)
Если ни один из вышеперечисленных вариантов не совпадает, повторяются все проверки для каждого типа в цепочке наследования (
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().
-
Примеры менеджеров содержимого
В настоящее время пакет email предоставляет только один конкретный менеджер содержимого, 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 указан, используйте его как обработчик ошибок при декодировании полезной нагрузки в unicode. По умолчанию используется обработчик ошибок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, установить MIMEmaintypeнаtext, и установить подтип на subtype, если он указан, илиplainесли нет. - Для
bytes, использовать указанные maintype и subtype, или вызвать исключениеTypeError, если они не указаны. - Для объектов
EmailMessage, установить maintype наmessage, и установить подтип на subtype, если он указан, илиrfc822если нет. Если subtype равноpartial, вызвать ошибку (объектыbytesдолжны использоваться для созданияmessage/partialчастей).
Если предоставлен charset (что допустимо только для
str), закодировать строку в байты, используя указанный набор символов. По умолчаниюutf-8. Если указанный charset является известным псевдонимом стандартного имени набора символов MIME, использовать стандартный набор символов вместо него.Если cte задано, закодировать полезную нагрузку с помощью указанной кодировки передачи содержимого и установить заголовок Content-Transfer-Encoding на это значение. Возможные значения для cte:
quoted-printable,base64,7bit,8bit, иbinary. Если вход не может быть закодирован в указанной кодировке (например, при указании cte7bitдля входа, содержащего не ASCII-значения), вызватьValueError.- Для
strобъектов, если cte не указано, использовать эвристику для определения наиболее компактной кодировки. - Для
EmailMessage, согласно RFC 2046, вызвать ошибку, если cte равноquoted-printableилиbase64для subtyperfc822, и для любой cte, отличной от7bitдля subtypeexternal-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 задано и является списком строк формата
headername: headervalueили списком объектовheader(отличая от строк наличием атрибутаname), добавить заголовки в msg. - Для
-
Примечания
-
1 -
Первоначально добавлен в 3.4 как пробный модуль
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/email.contentmanager.html