email.contentmanager
: Управление содержимым MIME¶
Источник: 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__
).название типа (
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 в качестве функции, которая будет вызываться, когда в
set_content()
будет передан объект типа, соответствующего typekey. Возможные значения 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
(для всех остальных типов, не являющихся многокомпонентными). При вызове наmultipart
поднимается сообщениеKeyError
. Если часть является частью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
, а подтип - в подтип, если он указан, или вrfc822
, если не указан. Если подтип равен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, вызывайте ошибку, если для подтипаrfc822
запрашивается cte изquoted-printable
илиbase64
, и для любого cte, отличного от7bit
, для подтипаexternal-body
. Если cte не указан, то для подтипаmessage/rfc822
используйте8bit
. Для всех остальных значений подтипа используйте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.
Сноски