Содержание страницы
email.contentmanager: управление MIME-содержимым¶email.contentmanager: Managing MIME Content
Исходный код: 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__).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().
-
Экземпляры диспетчера содержимого¶Content Manager Instances
В настоящее время пакет 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(для всех других не multipart-типов). Вызывает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. Если входные данные невозможно закодировать в указанной кодировке (например, указание cte равным7bitдля входных данных, содержащих не-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 как временный модуль