Документация Python неофициальный перевод

email.message.md

344 строк · 40.8 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/2.7/library/email.message.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.1.1. [`email.message`](https://python-all.ru/2.7/library/email.message.html#module-email.message): Представление сообщения электронной почты89Центральный класс в пакете [`email`](https://python-all.ru/2.7/library/email.html#module-email) – это класс [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message), импортируемый из модуля [`email.message`](https://python-all.ru/2.7/library/email.message.html#module-email.message). Он служит базовым для объектной модели [`email`](https://python-all.ru/2.7/library/email.html#module-email). [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message) предоставляет основные средства для установки и чтения полей заголовков и доступа к телам сообщений.1011Концептуально объект [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message) состоит из *заголовков* и *полезных нагрузок*. Заголовки представляют собой имена и значения полей в стиле [**RFC 2822**](https://python-all.ru/2.7/library/email.message.html), где имя и значение поля разделяются двоеточием. Двоеточие не является частью ни имени, ни значения поля.1213Заголовки хранятся и возвращаются с сохранением регистра, но сравниваются без учёта регистра. Также может присутствовать одиночный конвертный заголовок, известный как заголовок *Unix-From* или заголовок `From_`. Полезная нагрузка – это либо строка для простых сообщений, либо список объектов [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message) для MIME-контейнеров (например, *multipart/\** и *message/rfc822*).1415Объекты [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message) предоставляют интерфейс в стиле отображения для доступа к заголовкам сообщения, а также явный интерфейс для доступа как к заголовкам, так и к полезной нагрузке. Они предоставляют удобные методы для создания плоского текстового представления дерева объектов сообщения, для доступа к часто используемым параметрам заголовков и для рекурсивного обхода дерева объектов.1617Ниже приведены методы класса [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message):1819#### `class email.message.Message`2021Конструктор не принимает аргументов.2223#### `as_string([unixfrom])`2425Возвращает всё сообщение в виде плоской строки. Если необязательный *unixfrom* равен `True`, в возвращаемую строку включается конвертный заголовок. *unixfrom* по умолчанию равен `False`. Уплощение сообщения может вызвать изменения в [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message), если для завершения преобразования в строку необходимо заполнить значения по умолчанию (например, могут быть созданы или изменены MIME-границы).2627Обратите внимание, что этот метод предоставляется для удобства и не всегда форматирует сообщение так, как требуется. Например, по умолчанию он искажает строки, начинающиеся с `From`. Для большей гибкости можно создать экземпляр [`Generator`](https://python-all.ru/2.7/library/email.generator.html#email.generator.Generator) и использовать его метод [`flatten()`](https://python-all.ru/2.7/library/email.generator.html#email.generator.Generator.flatten) напрямую. Например:2829```python30from cStringIO import StringIO31from email.generator import Generator32fp = StringIO()33g = Generator(fp, mangle_from_=False, maxheaderlen=60)34g.flatten(msg)35text = fp.getvalue()36```3738#### `__str__()`3940Эквивалентно `as_string(unixfrom=True)`.4142#### `is_multipart()`4344Возвращает `True`, если полезная нагрузка сообщения является списком подобъектов [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message), в противном случае возвращает `False`. Когда [`is_multipart()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.is_multipart) возвращает `False`, полезная нагрузка должна быть строковым объектом.4546#### `set_unixfrom(unixfrom)`4748Устанавливает конвертный заголовок сообщения равным *unixfrom*, который должен быть строкой.4950#### `get_unixfrom()`5152Возвращает конвертный заголовок сообщения. По умолчанию равен `None`, если конвертный заголовок никогда не был установлен.5354#### `attach(payload)`5556Добавляет указанный *payload* к текущему payload, который до вызова должен быть `None` или списком объектов [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message). После вызова payload всегда будет списком объектов [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message). Если нужно установить payload в виде скалярного объекта (например, строки), используйте [`set_payload()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.set_payload).5758#### `get_payload([i[, decode]])`5960Возвращает текущий payload: список объектов [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message), если [`is_multipart()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.is_multipart) равно `True`, или строку, если [`is_multipart()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.is_multipart) равно `False`. Если payload является списком и вы изменяете его, вы изменяете payload сообщения на месте.6162С необязательным аргументом *i*, [`get_payload()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.get_payload) возвращает *i*-й элемент payload (нумерация с нуля), если [`is_multipart()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.is_multipart) равно `True`. Возникает [`IndexError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IndexError), если *i* меньше 0 или больше или равно количеству элементов в payload. Если payload является строкой (т.е. [`is_multipart()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.is_multipart) равно `False`) и передан *i*, возникает [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).6364Необязательный *decode* – флаг, указывающий, следует ли декодировать полезную нагрузку в соответствии с заголовком *Content-Transfer-Encoding*. Когда `True` и сообщение не является многокомпонентным, полезная нагрузка будет декодирована, если значение этого заголовка равно `quoted-printable` или `base64`. Если используется какая-либо другая кодировка, или заголовок *Content-Transfer-Encoding* отсутствует, или полезная нагрузка содержит некорректные данные base64, она возвращается как есть (недекодированной). Если сообщение является многокомпонентным и флаг *decode* равен `True`, возвращается `None`. Значение по умолчанию для *decode*`False`.6566#### `set_payload(payload[, charset])`6768Устанавливает payload всего объекта сообщения в *payload*. Ответственность за соблюдение инвариантов payload лежит на клиенте. Необязательный *charset* задаёт кодировку сообщения по умолчанию; подробнее см. [`set_charset()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.set_charset).6970Изменено в версии 2.2.2: добавлен аргумент *charset*.7172#### `set_charset(charset)`7374Устанавливает кодировку payload в *charset*, который может быть экземпляром [`Charset`](https://python-all.ru/2.7/library/email.charset.html#email.charset.Charset) (см. [`email.charset`](https://python-all.ru/2.7/library/email.charset.html#module-email.charset)), строкой с названием кодировки или `None`. Если это строка, она преобразуется в экземпляр [`Charset`](https://python-all.ru/2.7/library/email.charset.html#email.charset.Charset). Если *charset* равен `None`, параметр `charset` удаляется из заголовка *Content-Type* (сообщение больше не изменяется). Любое другое значение вызывает [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError).7576Если отсутствует заголовок *MIME-Version*, он будет добавлен. Если отсутствует заголовок *Content-Type*, он будет добавлен со значением *text/plain*. Независимо от того, существует ли заголовок *Content-Type*, его параметр `charset` будет установлен в *charset.output\_charset*. Если *charset.input\_charset* и *charset.output\_charset* различаются, payload будет перекодирован в *output\_charset*. Если отсутствует заголовок *Content-Transfer-Encoding*, payload будет закодирован для передачи при необходимости с использованием указанного [`Charset`](https://python-all.ru/2.7/library/email.charset.html#email.charset.Charset), и будет добавлен соответствующий заголовок. Если заголовок *Content-Transfer-Encoding* уже существует, считается, что payload уже корректно закодирован с использованием этого *Content-Transfer-Encoding*, и он не изменяется.7778Предполагается, что сообщение имеет тип *text/\**, а полезная нагрузка представлена либо в unicode, либо закодирована с помощью *charset.input\_charset*. При создании текстового представления сообщения она будет закодирована или преобразована в *charset.output\_charset* и при необходимости правильно закодирована для передачи. Заголовки MIME (*MIME-Version*, *Content-Type*, *Content-Transfer-Encoding*) будут добавлены по мере необходимости.7980Новое в версии 2.2.2.8182#### `get_charset()`8384Возвращает экземпляр [`Charset`](https://python-all.ru/2.7/library/email.charset.html#email.charset.Charset), связанный с payload сообщения.8586Новое в версии 2.2.2.8788Следующие методы реализуют интерфейс, похожий на словарь, для доступа к заголовкам сообщения в формате [**RFC 2822**](https://python-all.ru/2.7/library/email.message.html). Обратите внимание на некоторые семантические отличия от обычного словаря. Например, в словаре нет дублирующихся ключей, а здесь могут быть повторяющиеся заголовки. Также в словарях нет гарантированного порядка ключей, возвращаемых [`keys()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.keys), а в объекте [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message) заголовки всегда возвращаются в том порядке, в котором они встречались в исходном сообщении или были добавлены позже. Любой удалённый и затем повторно добавленный заголовок всегда добавляется в конец списка заголовков.8990Эти семантические различия являются намеренными и направлены на максимальное удобство.9192Обратите внимание, что во всех случаях заголовки конверта, присутствующие в сообщении, не включаются в интерфейс отображения.9394#### `__len__()`9596Возвращает общее количество заголовков, включая дубликаты.9798#### `__contains__(name)`99100Возвращает true, если объект сообщения имеет поле с именем *name*. Поиск выполняется без учёта регистра, и *name* не должен включать завершающее двоеточие. Используется для оператора `in`, например:101102```python103if 'message-id' in myMessage:104    print 'Message-ID:', myMessage['message-id']105```106107#### `__getitem__(name)`108109Возвращает значение указанного поля заголовка. *name* не должен содержать разделитель-двоеточие. Если заголовок отсутствует, возвращается `None`; исключение [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError) никогда не возбуждается.110111Обратите внимание: если указанное поле встречается в заголовках сообщения более одного раза, то не определено, какое именно из этих значений будет возвращено. Используйте метод [`get_all()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.get_all), чтобы получить значения всех существующих заголовков с данным именем.112113#### `__setitem__(name, val)`114115Добавляет заголовок в сообщение с именем поля *name* и значением *val*. Поле добавляется в конец существующих полей сообщения.116117Обратите внимание, что это *не* перезаписывает и не удаляет существующие заголовки с тем же именем. Если требуется гарантировать, что новый заголовок будет единственным в сообщении с именем поля *name*, сначала удалите это поле, например:118119```python120del msg['subject']121msg['subject'] = 'Python roolz!'122```123124#### `__delitem__(name)`125126Удаляет все вхождения поля с именем *name* из заголовков сообщения. Исключение не вызывается, если указанное поле отсутствует в заголовках.127128#### `has_key(name)`129130Возвращает true, если сообщение содержит поле заголовка с именем *name*, в противном случае возвращает false.131132#### `keys()`133134Возвращает список всех имён полей заголовков сообщения.135136#### `values()`137138Возвращает список всех значений полей сообщения.139140#### `items()`141142Возвращает список кортежей из двух элементов, содержащих все заголовки и значения полей сообщения.143144#### `get(name[, failobj])`145146Возвращает значение указанного поля заголовка. Этот метод идентичен методу [`__getitem__()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.__getitem__) за исключением того, что если указанный заголовок отсутствует, возвращается необязательный параметр *failobj* (по умолчанию `None`).147148Вот несколько дополнительных полезных методов:149150#### `get_all(name[, failobj])`151152Возвращает список всех значений для поля с именем *name*. Если в сообщении нет таких заголовков, возвращается *failobj* (по умолчанию `None`).153154#### `add_header(_name, _value, **_params)`155156Расширенная настройка заголовка. Этот метод похож на [`__setitem__()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.__setitem__), за исключением того, что дополнительные параметры заголовка можно передавать в виде именованных аргументов. *\_name* – это добавляемое поле заголовка, а *\_value**основное* значение заголовка.157158Для каждого элемента в словаре аргументов ключевых слов *\_params* ключ рассматривается как имя параметра, причем символы подчеркивания преобразуются в дефисы (поскольку дефисы недопустимы в идентификаторах Python). Обычно параметр добавляется как `key="value"`, если только значение не равно `None`; в этом случае добавляется только ключ. Если значение содержит символы, отличные от ASCII, оно должно быть задано в виде кортежа из трех элементов в формате `(CHARSET, LANGUAGE, VALUE)`, где `CHARSET` – строка, задающая кодировку для кодирования значения, `LANGUAGE` обычно может быть установлено в `None` или пустую строку (см. [**RFC 2231**](https://python-all.ru/2.7/library/email.message.html) для других возможностей), а `VALUE` – строковое значение, содержащее символы, отличные от ASCII.159160Вот пример:161162```python163msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')164```165166Это добавит заголовок, который выглядит как167168```python169Content-Disposition: attachment; filename="bud.gif"170```171172Пример с не-ASCII символами:173174```python175msg.add_header('Content-Disposition', 'attachment',176               filename=('iso-8859-1', '', 'Fußballer.ppt'))177```178179Что даёт180181```python182Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt"183```184185#### `replace_header(_name, _value)`186187Заменяет заголовок. Заменяет первый заголовок в сообщении, который совпадает с *\_name*, сохраняя порядок заголовков и регистр имени поля. Если подходящий заголовок не найден, возбуждается [`KeyError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.KeyError).188189Новое в версии 2.2.2.190191#### `get_content_type()`192193Возвращает тип содержимого сообщения. Возвращаемая строка приводится к нижнему регистру в форме *maintype/subtype*. Если в сообщении не было заголовка *Content-Type*, будет возвращен тип по умолчанию, заданный [`get_default_type()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.get_default_type). Поскольку согласно [**RFC 2045**](https://python-all.ru/2.7/library/email.message.html) сообщения всегда имеют тип по умолчанию, [`get_content_type()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.get_content_type) всегда возвращает значение.194195[**RFC 2045**](https://python-all.ru/2.7/library/email.message.html) определяет тип по умолчанию сообщения как *text/plain*, если только оно не находится внутри контейнера *multipart/digest*, в этом случае он будет *message/rfc822*. Если заголовок *Content-Type* содержит недопустимую спецификацию типа, [**RFC 2045**](https://python-all.ru/2.7/library/email.message.html) предписывает, что типом по умолчанию должен быть *text/plain*.196197Новое в версии 2.2.2.198199#### `get_content_maintype()`200201Возвращает основной тип содержимого сообщения. Это часть *maintype* строки, возвращаемой [`get_content_type()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.get_content_type).202203Новое в версии 2.2.2.204205#### `get_content_subtype()`206207Возвращает подтип содержимого сообщения. Это часть *subtype* строки, возвращаемой [`get_content_type()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.get_content_type).208209Новое в версии 2.2.2.210211#### `get_default_type()`212213Возвращает тип содержимого по умолчанию. Большинство сообщений имеют тип содержимого по умолчанию *text/plain*, за исключением сообщений, которые являются подчастями контейнеров *multipart/digest*. Такие подчасти имеют тип содержимого по умолчанию *message/rfc822*.214215Новое в версии 2.2.2.216217#### `set_default_type(ctype)`218219Устанавливает тип содержимого по умолчанию. *ctype* должен быть либо *text/plain*, либо *message/rfc822*, хотя это не принудительно. Тип содержимого по умолчанию не хранится в заголовке *Content-Type*.220221Новое в версии 2.2.2.222223#### `get_params([failobj[, header[, unquote]]])`224225Возвращает параметры заголовка *Content-Type* сообщения в виде списка. Элементы возвращаемого списка – кортежи из двух элементов (ключ/значение), разделённые знаком `'='`. Левая часть от `'='` – ключ, а правая – значение. Если в параметре нет знака `'='`, значением является пустая строка; в противном случае значение соответствует [`get_param()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.get_param) и не экранируется, если необязательный параметр *unquote* равен `True` (по умолчанию).226227Необязательный параметр *failobj* – объект, возвращаемый при отсутствии заголовка *Content-Type*. Необязательный параметр *header* – заголовок, который нужно искать вместо *Content-Type*.228229Изменено в версии 2.2.2: *unquote* добавлен аргумент.230231#### `get_param(param[, failobj[, header[, unquote]]])`232233Возвращает значение параметра *param* заголовка *Content-Type* в виде строки. Если сообщение не содержит заголовка *Content-Type* или такого параметра нет, возвращается *failobj* (по умолчанию `None`).234235Необязательный параметр *header*, если указан, задаёт заголовок сообщения, который следует использовать вместо *Content-Type*.236237Ключи параметров всегда сравниваются без учёта регистра. Возвращаемое значение может быть строкой или кортежем из трёх элементов, если параметр был закодирован по [**RFC 2231**](https://python-all.ru/2.7/library/email.message.html). Если это кортеж из трёх элементов, элементы значения имеют вид `(CHARSET, LANGUAGE, VALUE)`. Обратите внимание, что и `CHARSET`, и `LANGUAGE` могут быть `None`; в этом случае следует считать, что `VALUE` закодирован в кодировке `us-ascii`. Обычно `LANGUAGE` можно игнорировать.238239Если вашему приложению безразлично, был ли параметр закодирован по [**RFC 2231**](https://python-all.ru/2.7/library/email.message.html), можно свернуть значение параметра, вызвав [`email.utils.collapse_rfc2231_value()`](https://python-all.ru/2.7/library/email.utils.html#email.utils.collapse_rfc2231_value) и передав возвращаемое значение из [`get_param()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.get_param). Это вернёт подходящим образом декодированную строку Unicode, если значение является кортежем, или исходную строку без кавычек, если нет. Например:240241```python242rawparam = msg.get_param('foo')243param = email.utils.collapse_rfc2231_value(rawparam)244```245246В любом случае значение параметра (возвращённая строка или элемент `VALUE` кортежа из трёх элементов) всегда не экранируется, если только *unquote* не установлен в `False`.247248Изменено в версии 2.2.2: *unquote* добавлен аргумент, и стало возможным возвращаемое значение в виде кортежа из 3 элементов.249250#### `set_param(param, value[, header[, requote[, charset[, language]]]])`251252Устанавливает параметр в заголовке *Content-Type*. Если параметр уже существует в заголовке, его значение будет заменено на *value*. Если заголовок *Content-Type* ещё не задан для этого сообщения, он будет установлен в *text/plain*, а новое значение параметра будет добавлено в соответствии с [**RFC 2045**](https://python-all.ru/2.7/library/email.message.html).253254Необязательный параметр *header* задаёт альтернативный заголовок для *Content-Type*; все параметры будут экранированы при необходимости, если только необязательный параметр *requote* не равен `False` (по умолчанию `True`).255256Если указан необязательный параметр *charset*, параметр будет закодирован в соответствии с [**RFC 2231**](https://python-all.ru/2.7/library/email.message.html). Необязательный параметр *language* задаёт язык по RFC 2231, по умолчанию – пустая строка. И *charset*, и *language* должны быть строками.257258Новое в версии 2.2.2.259260#### `del_param(param[, header[, requote]])`261262Полностью удаляет указанный параметр из заголовка *Content-Type*. Заголовок будет перезаписан на месте без параметра и его значения. Все значения будут экранированы при необходимости, если только *requote* не равен `False` (по умолчанию `True`). Необязательный параметр *header* задаёт альтернативу заголовку *Content-Type*.263264Новое в версии 2.2.2.265266#### `set_type(type[, header][, requote])`267268Устанавливает основной тип и подтип для заголовка *Content-Type*. *type* должен быть строкой вида *maintype/subtype*, в противном случае возбуждается [`ValueError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.ValueError).269270Этот метод заменяет заголовок *Content-Type*, сохраняя все параметры на месте. Если *requote* равен `False`, экранирование существующего заголовка остаётся без изменений; в противном случае параметры будут экранированы (по умолчанию).271272Альтернативный заголовок можно указать в аргументе *header*. При установке заголовка *Content-Type* также добавляется заголовок *MIME-Version*.273274Новое в версии 2.2.2.275276#### `get_filename([failobj])`277278Возвращает значение параметра `filename` заголовка *Content-Disposition* сообщения. Если в заголовке нет параметра `filename`, этот метод пытается найти параметр `name` в заголовке *Content-Type*. Если ни один из них не найден или заголовок отсутствует, возвращается *failobj*. Возвращаемая строка всегда будет раскрыта в соответствии с [`email.utils.unquote()`](https://python-all.ru/2.7/library/email.utils.html#email.utils.unquote).279280#### `get_boundary([failobj])`281282Возвращает значение параметра `boundary` заголовка *Content-Type* сообщения или *failobj*, если заголовок отсутствует или не содержит параметра `boundary`. Возвращаемая строка всегда будет раскрыта в соответствии с [`email.utils.unquote()`](https://python-all.ru/2.7/library/email.utils.html#email.utils.unquote).283284#### `set_boundary(boundary)`285286Устанавливает параметр `boundary` заголовка *Content-Type* в значение *boundary*. [`set_boundary()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.set_boundary) всегда будет заключать *boundary* в кавычки при необходимости. Возбуждается исключение [`HeaderParseError`](https://python-all.ru/2.7/library/email.errors.html#email.errors.HeaderParseError), если объект сообщения не имеет заголовка *Content-Type*.287288Обратите внимание, что использование этого метода незначительно отличается от удаления старого заголовка *Content-Type* и добавления нового с новым boundary через [`add_header()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.add_header), поскольку [`set_boundary()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.set_boundary) сохраняет порядок заголовка *Content-Type* в списке заголовков. Однако он *не* сохраняет строки продолжения, которые могли быть в исходном заголовке *Content-Type*.289290#### `get_content_charset([failobj])`291292Возвращает параметр `charset` заголовка *Content-Type*, приведённый к нижнему регистру. Если заголовок *Content-Type* отсутствует или не содержит параметра `charset`, возвращается *failobj*.293294Обратите внимание, что этот метод отличается от [`get_charset()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.get_charset), который возвращает экземпляр [`Charset`](https://python-all.ru/2.7/library/email.charset.html#email.charset.Charset) для кодировки тела сообщения по умолчанию.295296Новое в версии 2.2.2.297298#### `get_charsets([failobj])`299300Возвращает список, содержащий имена наборов символов в сообщении. Если сообщение является *multipart*, список будет содержать по одному элементу для каждой вложенной части в полезной нагрузке; в противном случае это будет список длиной 1.301302Каждый элемент списка будет строкой, которая является значением параметра `charset` в заголовке *Content-Type* для представленной вложенной части. Однако если у вложенной части нет заголовка *Content-Type*, нет параметра `charset`, или она не относится к основному MIME-типу *text*, то такой элемент списка будет равен *failobj*.303304#### `walk()`305306Метод [`walk()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.walk) – это универсальный генератор, который можно использовать для обхода всех частей и подчастей дерева объекта сообщения в порядке прямого обхода в глубину. Обычно [`walk()`](https://python-all.ru/2.7/library/email.message.html#email.message.Message.walk) используется как итератор в цикле `for`; каждая итерация возвращает следующую подчасть.307308Вот пример, который выводит MIME-тип каждой части многокомпонентной структуры сообщения:309310```python311>>> for part in msg.walk():312...     print part.get_content_type()313multipart/report314text/plain315message/delivery-status316text/plain317text/plain318message/rfc822319```320321Изменено в версии 2.5: Ранее устаревшие методы `get_type()`, `get_main_type()` и `get_subtype()` были удалены.322323Объекты [`Message`](https://python-all.ru/2.7/library/email.message.html#email.message.Message) также могут опционально содержать два атрибута экземпляра, которые можно использовать при создании обычного текста MIME-сообщения.324325#### `preamble`326327Формат MIME-документа допускает наличие некоторого текста между пустой строкой после заголовков и первой строкой границы multipart. Обычно этот текст не виден в MIME-совместимом почтовом клиенте, поскольку он находится вне стандартной MIME-защиты. Однако при просмотре необработанного текста сообщения или при просмотре сообщения в клиенте, не поддерживающем MIME, этот текст может стать видимым.328329Атрибут *preamble* содержит этот дополнительный текст за пределами MIME-защиты для MIME-документов. Когда [`Parser`](https://python-all.ru/2.7/library/email.parser.html#email.parser.Parser) обнаруживает некоторый текст после заголовков, но до первой строки границы, он присваивает этот текст атрибуту *preamble* сообщения. Когда [`Generator`](https://python-all.ru/2.7/library/email.generator.html#email.generator.Generator) записывает текстовое представление MIME-сообщения и обнаруживает, что сообщение имеет атрибут *preamble*, он записывает этот текст в области между заголовками и первой границей. Подробнее см. [`email.parser`](https://python-all.ru/2.7/library/email.parser.html#module-email.parser) и [`email.generator`](https://python-all.ru/2.7/library/email.generator.html#module-email.generator).330331Обратите внимание: если у объекта сообщения нет преамбулы, атрибут *preamble* будет равен `None`.332333#### `epilogue`334335Атрибут *epilogue* действует так же, как атрибут *preamble*, за исключением того, что он содержит текст, который появляется между последней границей и концом сообщения.336337Изменено в версии 2.5: Не нужно устанавливать эпилог в пустую строку, чтобы [`Generator`](https://python-all.ru/2.7/library/email.generator.html#email.generator.Generator) выводил перевод строки в конце файла.338339#### `defects`340341Атрибут *defects* содержит список всех проблем, обнаруженных при разборе этого сообщения. См. [`email.errors`](https://python-all.ru/2.7/library/email.errors.html#module-email.errors) для подробного описания возможных дефектов разбора.342343Новое в версии 2.4.344