Spec-Zone.ru › Python 3.10

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__).
  • 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 на текстовой части вернет строку 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, <'EmailMessage'>, cte=None, disposition=None, filename=None, cid=None, params=None, headers=None)

Добавление заголовков и полезной нагрузки в msg:

Добавление заголовка Content-Type со значением maintype/subtype.

  • Для str, установите MIME maintype в 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 для subtype rfc822, и для любого cte, отличного от 7bit для subtype external-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 как временный модуль

© 2001–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/email.contentmanager.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API