email.contentmanager: Управление содержимым MIME
Новое в версии 3.4: в качестве временного модуля.
Исходный код: Lib/email/contentmanager.py
Примечание
Модуль contentmanager включён в стандартную библиотеку на временной основе. Несовместимые изменения (вплоть до удаления модуля) могут произойти, если это сочтут необходимым разработчики ядра.
Модуль message предоставляет класс, который может представлять произвольное электронное сообщение. Эта базовая модель сообщения имеет удобный и гибкий API, но предоставляет только API низкого уровня для взаимодействия с общими частями сообщения (заголовки, общие параметры заголовков и полезная нагрузка, которая может быть списком подчастей). Этот модуль предоставляет классы и инструменты, которые обеспечивают расширенный и расширяемый API для работы с различными конкретными типами содержимого, включая возможность извлечения содержимого сообщения как специализированного типа объекта, а не просто как объекта типа bytes. Модуль автоматически обрабатывает указанные в RFC детали MIME (необходимые заголовки и параметры и т. д.) для некоторых распространённых типов содержимого, а приложение может добавить поддержку дополнительных типов с помощью механизмов расширения.
В этом модуле определены одноимённые классы «Управление содержимым». Базовый класс ContentManager определяет API для регистрации функций управления содержимым, которые извлекают данные из Message объектов или вставляют данные и заголовки в Message объекты, предоставляя тем самым способ преобразования между Message объектами, содержащими данные, и другими представлениями этих данных (типы данных Python, специализированные объекты Python, внешние файлы и т. д.). Модуль также определяет один конкретный менеджер содержимого: raw_data_manager преобразует между типами MIME содержимого и данными str или bytes. Он также предоставляет удобный API для управления параметрами MIME при вставке содержимого в Message. Он также обрабатывает вставку и извлечение объектов Message при работе с типом содержимого message/rfc822.
Другая часть расширенного интерфейса — подклассы Message, которые предоставляют новые удобные функции API, включая удобные методы для вызова менеджеров содержимого, полученных из этого модуля.
Примечание
Хотя EmailMessage и MIMEPart в настоящее время документированы в этом модуле из-за временного характера кода, реализация находится в модуле email.message.
-
class email.message.EmailMessage(policy=default) -
Если задан параметр policy (он должен быть экземпляром класса
policy) используйте правила, которые он определяет, для обновления и сериализации представления сообщения. Если policy не задан, используйте политикуdefault, которая следует правилам RFC для электронной почты, за исключением символов конца строки (вместо предписанных RFC\r\n, она использует стандартные Python\nсимволы конца строки). Для получения дополнительной информации см. документациюpolicy.Этот класс является подклассом
Message. Он добавляет следующие методы:-
is_attachment() -
Возвращает
True, если есть заголовок Content-Disposition и его значение (независимо от регистра) равноattachment,Falseв противном случае.Изменено в версии 3.4.2: is_attachment теперь является методом, а не свойством, для согласованности с
is_multipart().
-
get_body(preferencelist=('related', 'html', 'plain')) -
Возвращает часть MIME, которая является лучшим кандидатом на роль «тела» сообщения.
preferencelist должен быть последовательностью строк из набора
related,html, иplain, и указывает порядок предпочтения типа содержимого возвращаемой части.Начинайте поиск соответствующих кандидатов с объекта, на котором вызывается метод
get_body.Если
relatedне включено в preferencelist, рассматривайте корневую часть (или подчасть корневой части) любых связанных элементов в качестве кандидата, если (под)часть соответствует предпочтению.При обнаружении
multipart/related, проверьте параметрstart, и если найдена часть с соответствующим Content-ID, учитывайте только её при поиске соответствующих кандидатов. В противном случае учитывайте только первую (по умолчанию корневую) частьmultipart/related.Если у части есть заголовок Content-Disposition, учитывайте эту часть в качестве соответствующего кандидата только если значение заголовка равно
inline.Если ни один из кандидатов не соответствует ни одному из предпочтений в preferencelist, верните
None.Примечания: (1) Для большинства приложений единственными комбинациями preferencelist, которые действительно имеют смысл, являются
('plain',),('html', 'plain'), и значение по умолчанию,('related', 'html', 'plain'). (2) Поскольку соответствие начинается с объекта, на котором вызываетсяget_body, вызовget_bodyнаmultipart/relatedвернёт сам объект, если preferencelist не имеет значения по умолчанию. (3) Сообщения (или части сообщений), которые не задают Content-Type или у которых заголовок Content-Type некорректен, будут обрабатываться так, как если бы они были типаtext/plain, что иногда может привести к тому, чтоget_bodyвернёт неожиданные результаты.
-
iter_attachments() -
Возвращает итератор по всем частям сообщения, которые не являются кандидатами на роль «тела» сообщения. То есть, пропускайте первую встречу каждой из
text/plain,text/html,multipart/related, илиmultipart/alternative(если они не явно отмечены как вложения с помощью Content-Disposition: attachment), и возвращайте все остальные части. При непосредственном применении кmultipart/related, возвращает итератор по всем связанным частям, за исключением корневой части (т.е.: части, на которую указывает параметрstart, или первой части, если нет параметраstartили параметрstartне соответствует Content-ID ни одной из частей). При применении непосредственно кmultipart/alternativeили не-multipart, возвращает пустой итератор.
-
iter_parts() -
Возвращает итератор по всем непосредственным подчастям сообщения, который будет пустым для не-
multipart. (См. такжеwalk().)
-
get_content(*args, content_manager=None, **kw) -
Вызывает метод
get_contentобъекта content_manager, передавая self в качестве объекта сообщения, и передавая любые другие аргументы или ключевые слова в качестве дополнительных аргументов. Если content_manager не указан, используйтеcontent_manager, определённую текущейpolicy.
-
set_content(*args, content_manager=None, **kw) -
Вызывает метод
set_contentобъекта content_manager, передавая self в качестве объекта сообщения, и передавая любые другие аргументы или ключевые слова в качестве дополнительных аргументов. Если content_manager не указан, используйтеcontent_manager, определённую текущейpolicy.
-
Преобразует сообщение, которое не является
multipart, в сообщениеmultipart/related, перемещая любые существующие заголовки Content- и содержимое в первую (новую) частьmultipart. Если задан параметр boundary, используйте его в качестве разделителя в multipart, в противном случае оставьте разделитель для автоматической генерации при необходимости (например, при сериализации сообщения).
-
make_alternative(boundary=None) -
Преобразует сообщение, которое не является
multipartилиmultipart/related, вmultipart/alternative, перемещая любые существующие заголовки Content- и содержимое в первую (новую) частьmultipart. Если задан параметр boundary, используйте его в качестве разделителя в multipart, в противном случае оставьте разделитель для автоматической генерации при необходимости (например, при сериализации сообщения).
-
make_mixed(boundary=None) -
Преобразует сообщение, которое не является
multipart,multipart/related, илиmultipart-alternative, вmultipart/mixed, перемещая любые существующие заголовки Content- и содержимое в первую (новую) частьmultipart. Если задан параметр boundary, используйте его в качестве разделителя в multipart, в противном случае оставьте разделитель для автоматической генерации при необходимости (например, при сериализации сообщения).
-
Если сообщение является
multipart/related, создайте новый объект сообщения, передайте все аргументы в его методset_content(), иattach()его вmultipart. Если сообщение не являетсяmultipart, вызовитеmake_related(), а затем выполните действия, как описано выше. Если сообщение является другим типомmultipart, вызовитеTypeError. Если content_manager не указан, используйтеcontent_manager, определённую текущейpolicy. Если добавленная часть не имеет заголовка Content-Disposition, добавьте его со значениемinline.
-
add_alternative(*args, content_manager=None, **kw) -
Если сообщение является
multipart/alternative, создайте новый объект сообщения, передайте все аргументы в его методset_content(), иattach()его вmultipart. Если сообщение не являетсяmultipartилиmultipart/related, вызовитеmake_alternative(), а затем выполните действия, как описано выше. Если сообщение является другим типомmultipart, вызовитеTypeError. Если content_manager не указан, используйтеcontent_manager, определённую текущейpolicy.
-
add_attachment(*args, content_manager=None, **kw) -
Если сообщение является
multipart/mixed, создайте новый объект сообщения, передайте все аргументы в его методset_content(), иattach()его вmultipart. Если сообщение не являетсяmultipart,multipart/related, илиmultipart/alternative, вызовитеmake_mixed(), а затем выполните действия, как описано выше. Если content_manager не указан, используйтеcontent_manager, определённую текущейpolicy. Если добавленная часть не имеет заголовка Content-Disposition, добавьте его со значениемattachment. Этот метод может использоваться как для явных вложений (Content-Disposition: attachment), так и дляinlineвложений (Content-Disposition: inline), передавая соответствующие параметры вcontent_manager.
-
-
clear() -
Удалить полезную нагрузку и все заголовки.
-
clear_content() -
Удалить полезную нагрузку и все
Content-заголовки, оставив все остальные заголовки нетронутыми и в исходном порядке.
-
-
class email.message.MIMEPart(policy=default) -
Этот класс представляет собой подчасть сообщения MIME. Он идентичен
EmailMessage, за исключением того, что заголовки MIME-Version не добавляются при вызовеset_content(), поскольку подчасти не нуждаются в собственных заголовках MIME-Version.
-
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__)
Если ни один из вышеперечисленных вариантов не подходит, повторите все проверки выше для каждого типа в 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().
-
1. Менеджеры контента
В настоящее время пакет 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, <'Message'>, cte=None, disposition=None, filename=None, cid=None, params=None, headers=None) -
email.contentmanager.set_content(msg, <'list'>, subtype='mixed', disposition=None, filename=None, cid=None, params=None, headers=None) -
Добавить заголовки и полезную нагрузку к msg:
Добавить заголовок Content-Type со значением
maintype/subtype.- Для
str, задайте MIMEmaintypeнаtext, и установите подтип на subtype, если он задан, илиplainесли он не задан. - Для
bytes, используйте указанные maintype и subtype, или вызовитеTypeError, если они не указаны. - Для объектов
Message, установите maintype наmessage, и установите подтип на subtype, если он задан, илиrfc822если он не задан. Если subtype являетсяpartial, вызовите ошибку (объектыbytesдолжны использоваться для построенияmessage/partialчастей). - Для <’list’>, который должен быть списком объектов
Message, установитеmaintypeнаmultipart, аsubtypeна subtype, если он задан, иmixedесли он не задан. Если части сообщения в <’list’> содержат заголовки MIME-Version, удалите их.
Если задан charset (что допустимо только для
str), закодируйте строку в байты с использованием указанного набора символов. По умолчаниюutf-8. Если указанный charset является известным псевдонимом для стандартного имени набора символов MIME, используйте стандартный набор символов вместо него.Если cte задано, закодируйте полезную нагрузку с использованием указанной кодировки перевода содержимого и задайте заголовок Content-Transfer-Encoding на это значение. Для объектов
str, если он не задан, используйте эвристику для определения наиболее компактной кодировки. Возможные значения для cte —quoted-printable,base64,7bit,8bit, иbinary. Если вход не может быть закодирован в указанной кодировке (например:7bit), вызовитеValueError. ДляMessage, в соответствии с RFC 2046, вызовите ошибку, если запрошено ctequoted-printableилиbase64для subtyperfc822, и для любого cte, отличного от7bitдля subtypeexternal-body. Дляmessage/rfc822, используйте8bitесли cte не указано. Для всех других значений subtype, используйте7bit.Примечание
cte значения
binaryна самом деле ещё не работает корректно. ОбъектMessage, изменённыйset_content, корректен, ноBytesGeneratorне сериализует его корректно.Если disposition задано, используйте его в качестве значения заголовка Content-Disposition. Если не задано и filename задано, добавьте заголовок со значением
attachment. Если не задано и filename также не задано, не добавляйте заголовок. Единственные допустимые значения для disposition —attachmentиinline.Если filename указано, используйте его в качестве значения параметра
filenameзаголовка Content-Disposition. Значения по умолчанию нет.Если cid задано, добавьте заголовок Content-ID со значением cid.
Если params задано, переберите его метод
itemsи используйте полученные пары(key, value)для установки дополнительных параметров в заголовке Content-Type.Если headers задано и является списком строк вида
headername: headervalueили списком объектовheader(отличающихся от строк наличием атрибутаname), добавьте заголовки к msg. - Для
-
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/email.contentmanager.html