Spec-Zone.ru › Python 3.12

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__)
  • name типа (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().

Экземпляры менеджеров содержимого

В настоящее время пакет email предоставляет только один конкретный менеджер содержимого — 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 (для всех остальных типов, не являющихся составными). Если метод вызван для multipart, возникает исключение KeyError. Если часть имеет тип 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, если не указан. Если subtype равен partial, возникает ошибка (для создания частей message/partial следует использовать объекты bytes).

Если задан charset (что допустимо только для str), кодирует строку в байты с использованием указанной кодировки. По умолчанию используется utf-8. Если указанный charset является известным псевдонимом стандартного имени набора символов MIME, вместо него используется стандартное имя.

Если задан cte, кодирует полезную нагрузку с использованием указанного кодирования передачи содержимого и устанавливает значение заголовка Content-Transfer-Encoding равным этому значению. Возможные значения cte: quoted-printable, base64, 7bit, 8bit и binary. Если входные данные нельзя закодировать указанным способом (например, если для данных, содержащих значения не ASCII, указано cte 7bit), возникает исключение ValueError.

  • Для объектов str, если cte не задан, с помощью эвристик выбирается наиболее компактное кодирование. Перед кодированием для нормализации всех границ строк используется str.splitlines(), чтобы каждая строка полезной нагрузки завершалась разделителем строк, заданным свойством linesep текущей политики (даже если исходная строка не оканчивалась разделителем).
  • Для объектов bytes, если cte не задан, используется base64; упомянутое выше преобразование символов новой строки не выполняется.
  • Для объектов EmailMessage согласно RFC 2046 возникает ошибка, если для subtype rfc822 запрошено cte quoted-printable или base64, а для subtype external-body — любое cte, кроме 7bit. Для message/rfc822, если cte не указан, используется 8bit. Для всех остальных значений 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/email.contentmanager.html

Spec-Zone.ru

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