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 установите значение MIME maintype равным 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.

Сноски

Вернуться на верх