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. - строка, представляющая полный тип 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задает тип MIMEmaintypeравным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, указано cte7bit), возникает исключениеValueError.- Для объектов
str, если cte не задан, с помощью эвристик выбирается наиболее компактное кодирование. Перед кодированием для нормализации всех границ строк используетсяstr.splitlines(), чтобы каждая строка полезной нагрузки завершалась разделителем строк, заданным свойствомlinesepтекущей политики (даже если исходная строка не оканчивалась разделителем). - Для объектов
bytes, если cte не задан, используется base64; упомянутое выше преобразование символов новой строки не выполняется. - Для объектов
EmailMessageсогласно RFC 2046 возникает ошибка, если для subtyperfc822запрошено ctequoted-printableилиbase64, а для subtypeexternal-body— любое cte, кроме7bit. Дляmessage/rfc822, если cte не указан, используется8bit. Для всех остальных значений subtype используется7bit.
Примечание
Значение cte
binaryпока работает некорректно. ОбъектEmailMessageпосле изменения методомset_contentкорректен, ноBytesGeneratorсериализует его неправильно.Если задан disposition, используется это значение заголовка Content-Disposition. Если значение не задано, но указан filename, заголовок добавляется со значением
attachment. Если не заданы ни disposition, ни filename, заголовок не добавляется. Допустимы только значения dispositionattachmentиinline.Если задан filename, он используется в качестве значения параметра
filenameзаголовка Content-Disposition.Если задан cid, добавляется заголовок Content-ID со значением cid.
Если задан params, перебираются результаты вызова его метода
items, а полученные пары(key, value)используются для установки дополнительных параметров заголовка Content-Type.Если задан headers и это список строк в формате
headername: headervalueлибо список объектовheader(их можно отличить от строк по наличию атрибутаname), заголовки добавляются в msg. - Для
-
Сноски
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/email.contentmanager.html