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 - пустая строка
Если ни для одного из этих ключей не найден обработчик, для полного типа MIME возбуждается исключение
KeyError. - строка, представляющая полный тип MIME (
-
set_content(msg, obj, *args, **kw) -
Если
maintypeравенmultipart, возбуждается исключениеTypeError; в противном случае функция-обработчик ищется по типу obj (см. следующий абзац), для msg вызываетсяclear_content(), а затем вызывается функция-обработчик с передачей всех аргументов. Предполагается, что обработчик преобразует и сохранит 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для текстовой части возвращает строку без необходимости вручную декодировать её приложением,set_contentпредоставляет широкий набор параметров для управления заголовками, добавляемыми к части, и кодированием передачи содержимого, а также позволяет использовать различные методыadd_, упрощая создание составных сообщений.-
email.contentmanager.get_content(msg, errors='replace') -
Возвращает полезную нагрузку части в виде строки (для частей
text), объектаEmailMessage(для частейmessage/rfc822) или объектаbytes(для всех остальных типов, кроме multipart). При вызове дляmultipartвозбуждается исключениеKeyError. Если часть имеет типtextи задан параметр errors, он используется в качестве обработчика ошибок при декодировании полезной нагрузки в строку. По умолчанию используется обработчик ошибок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задаёт maintype равным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. Если 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. - Для
-
Сноски
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/email.contentmanager.html