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 как функцию, вызываемую, когда объект типа, соответствующего typekey, передаётся в
set_content(). Возможные значения 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задаёт maintype равнымmessage, а subtype — 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–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/email.contentmanager.html