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, используйте его в качестве обработчика ошибок при декодировании полезной нагрузки в 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
задайте в качестве основного типа значениеmessage
, а в качестве подтипа - значение subtype, если оно указано, илиrfc822
, если оно не указано. Если подтип равенpartial
, возникает ошибка (bytes
объекты должны использоваться для созданияmessage/partial
частей).
Если указана кодировка * (которая допустима только для
str
), закодируйте строку в байты, используя указанный набор символов. Значение по умолчанию -utf-8
. Если указанная кодировка является известным псевдонимом для стандартного имени кодировки 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
. Для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.
Сноски