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.
Сноски