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.
-
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__).квалификационное имя типа (
typ.__qualname__)имя типа (
typ.__name__).
Если ни один из них не подходит, повторите все вышеописанные проверки для каждого из типов в MRO (
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().
-
Экземпляры контент-менеджера¶
В настоящее время пакет электронной почты предоставляет только один конкретный менеджер содержимого, raw_data_manager, хотя в будущем могут быть добавлены и другие. raw_data_manager - это content_manager, предоставляемый EmailPolicy и его производными.
-
email.contentmanager.raw_data_manager¶ Этот менеджер содержимого предоставляет лишь минимальный интерфейс, превосходящий тот, который предоставляет сам
Message: он работает только с текстом, необработанными байтовыми строками и объектамиMessage. Тем не менее, он предоставляет значительные преимущества по сравнению с базовым API:get_contentна текстовой части вернет строку юникода без необходимости приложения вручную декодировать ее,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) Добавьте заголовки и полезную нагрузку к msg:
Добавьте заголовок Content-Type со значением
maintype/subtype.Для
strустановите MIMEmaintypeвtextи установите подтип в subtype, если он указан, илиplain, если он не указан.Для
bytesиспользуйте указанные основной тип и подтип, или вызовите ошибкуTypeError, если они не указаны.Для объектов
EmailMessageустановите основной тип в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, вызывайте ошибку, если для подтипаquoted-printableзапрашивается cte изbase64илиrfc822, и для любого cte, отличного от7bitдля подтипаexternal-body. Дляmessage/rfc822используйте8bit, если cte не указан. Для всех остальных значений подтипа используйте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 как provisional module.