Содержание страницы
email.contentmanager: управление MIME-содержимым¶email.contentmanager: Managing MIME Content
Исходный код: 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 как функцию, вызываемую, когда объект типа, соответствующего typekey, передаётся в
set_content(). Возможные значения typekey описаны вset_content().
Экземпляры диспетчера содержимого¶Content Manager Instances
В настоящее время пакет 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при вызове для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устанавливает MIMEmaintypeвtext, а подтип – в subtype, если он указан, или вplain, если нет.Для
bytesиспользует указанные maintype и subtype, или вызываетTypeError, если они не указаны.Для объектов
EmailMessageустанавливает maintype вmessage, а подтип – в subtype, если он указан, или вrfc822, если нет. Если subtype равенpartial, вызывает ошибку (объектыbytesдолжны использоваться для создания частейmessage/partial).
Если указан charset (действителен только для
str), кодирует строку в байты с использованием указанной кодировки. По умолчанию используетсяutf-8. Если указанный charset является известным псевдонимом стандартного имени кодировки MIME, использует стандартную кодировку.Если установлен cte, кодирует содержимое с использованием указанной кодировки передачи содержимого и устанавливает заголовок Content-Transfer-Encoding в это значение. Возможные значения для cte:
quoted-printable,base64,7bit,8bitиbinary. Если входные данные невозможно закодировать в указанной кодировке (например, указание cte равным7bitдля входных данных, содержащих не-ASCII значения), вызываетValueError.Для объектов
str, если cte не установлен, использует эвристику для определения наиболее компактной кодировки. Перед кодированиемstr.splitlines()используется для нормализации всех границ строк, гарантируя, что каждая строка содержимого завершается свойствомlinesepтекущей политики (даже если исходная строка не заканчивалась им).Для объектов
bytes, если cte не установлен, он считается равным base64, и вышеупомянутое преобразование новых строк не выполняется.Для
EmailMessage, согласно RFC 2046, вызывает ошибку, если запрашивается cte равныйquoted-printableилиbase64для subtyperfc822, и для любого cte, отличного от7bit, для subtypeexternal-body. Дляmessage/rfc822использует8bit, если cte не указан. Для всех остальных значений 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.
Сноски
Эта страница – перевод. Оригинал на английском – docs.python.org. Нашли неточность? Сообщите нам.