email.message.md
1> **Источник:** https://python-all.ru/3.0/library/email.message.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`email`](https://python-all.ru/3.0/library/email.html#module-email): Представление сообщения электронной почты89Центральный класс пакета [`email`](https://python-all.ru/3.0/library/email.html#module-email) – это класс [`Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message), импортируемый из модуля `email.message`. Он является базовым классом для объектной модели [`email`](https://python-all.ru/3.0/library/email.html#module-email). [`Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message) предоставляет основную функциональность для настройки и запроса полей заголовков, а также для доступа к содержимому сообщений.1011Conceptually, a [`Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message) object consists of *headers* and *payloads*. Headers are [**RFC 2822**](https://python-all.ru/3.0/library/email.message.html) style field names and values where the field name and value are separated by a colon. The colon is not part of either the field name or the field value.1213Заголовки хранятся и возвращаются с сохранением регистра, но сравнение выполняется без учёта регистра. Также может присутствовать один конвертный заголовок, также известный как заголовок *Unix-From* или заголовок `From_`. Полезная нагрузка представляет собой либо строку в случае простых объектов сообщений, либо список объектов [`Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message) для MIME-контейнерных документов (например, *multipart/\** и *message/rfc822*).1415Объекты [`Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message) предоставляют интерфейс в стиле отображения для доступа к заголовкам сообщения и явный интерфейс для доступа как к заголовкам, так и к полезной нагрузке. Они предоставляют удобные методы для создания плоского текстового представления дерева объектов сообщения, для доступа к часто используемым параметрам заголовков и для рекурсивного обхода дерева объектов.1617Вот методы класса [`Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message):1819#### `[email.message.Message]class email.message.Message`2021Конструктор не принимает аргументов.2223#### `[email.message.Message.as_string]as_string([unixfrom])`2425Возвращает всё сообщение, преобразованное в строку. Если необязательный параметр *unixfrom* равен `True`, конвертный заголовок включается в возвращаемую строку. По умолчанию *unixfrom* равен `False`.2627Обратите внимание: этот метод предоставлен для удобства и не всегда форматирует сообщение так, как вам нужно. Например, по умолчанию он искажает строки, начинающиеся с `From`. Для большей гибкости создайте экземпляр `Generator` и используйте его метод `flatten()` напрямую. Например:2829```python30from io import StringIO31from email.generator import Generator32fp = StringIO()33g = Generator(fp, mangle_from_=False, maxheaderlen=60)34g.flatten(msg)35text = fp.getvalue()36```3738#### `[email.message.Message.__str__]__str__()`3940Эквивалентно4142`as_string(unixfrom=True)`4344.4546#### `[email.message.Message.is_multipart]is_multipart()`4748Возвращает4950`True`5152, если полезная нагрузка сообщения является списком объектов подкласса5354[`Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message)5556, в противном случае возвращает5758`False`5960. Когда6162[`is_multipart()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.is_multipart)6364возвращает False, полезная нагрузка должна быть строковым объектом.6566#### `[email.message.Message.set_unixfrom]set_unixfrom(unixfrom)`6768Устанавливает конвертный заголовок сообщения равным6970*unixfrom*7172, который должен быть строкой.7374#### `[email.message.Message.get_unixfrom]get_unixfrom()`7576Возвращает конвертный заголовок сообщения. По умолчанию равен7778`None`7980, если конвертный заголовок никогда не был установлен.8182#### `[email.message.Message.attach]attach(payload)`8384Добавляет указанную8586*полезную нагрузку*8788к текущей полезной нагрузке, которая перед вызовом должна быть8990`None`9192или списком объектов9394[`Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message)9596. После вызова полезная нагрузка всегда будет списком объектов9798[`Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message)99100. Если нужно установить полезную нагрузку в скалярный объект (например, строку), используйте101102[`set_payload()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.set_payload)103104.105106#### `[email.message.Message.get_payload]get_payload([i[, decode]])`107108Возвращает текущую полезную нагрузку, которая будет списком объектов [`Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message), когда [`is_multipart()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.is_multipart) равно `True`, или строкой, когда [`is_multipart()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.is_multipart) равно `False`. Если полезная нагрузка является списком и вы изменяете объект списка, вы изменяете полезную нагрузку сообщения на месте.109110С необязательным аргументом *i*, [`get_payload()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.get_payload) вернёт *i*-й элемент полезной нагрузки, считая с нуля, если [`is_multipart()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.is_multipart) равно `True`. Будет возбуждено исключение [`IndexError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.IndexError), если *i* меньше 0 или больше или равно количеству элементов в полезной нагрузке. Если полезная нагрузка является строкой (т.е. [`is_multipart()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.is_multipart) равно `False`) и указан *i*, возбуждается [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError).111112Необязательный параметр *decode* – это флаг, указывающий, следует ли декодировать содержимое в соответствии с заголовком *Content-Transfer-Encoding*. Если `True` и сообщение не является составным (multipart), то содержимое будет декодировано, если значение этого заголовка равно `quoted-printable` или `base64`. Если используется другая кодировка, или заголовок *Content-Transfer-Encoding* отсутствует, или содержимое содержит некорректные данные base64, оно возвращается как есть (без декодирования). Если сообщение является составным и флаг *decode* равен `True`, то возвращается `None`. Значение по умолчанию для *decode* – `False`.113114#### `[email.message.Message.set_payload]set_payload(payload[, charset])`115116Устанавливает полезную нагрузку всего объекта сообщения в117118*payload*119120. Ответственность за соблюдение инвариантов полезной нагрузки лежит на клиенте. Необязательный параметр121122*charset*123124задаёт набор символов сообщения по умолчанию; подробнее см.125126[`set_charset()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.set_charset)127128.129130#### `[email.message.Message.set_charset]set_charset(charset)`131132Устанавливает набор символов полезной нагрузки в *charset*, который может быть экземпляром `Charset` (см. [`email.charset`](https://python-all.ru/3.0/library/email.charset.html#module-email.charset)), строкой, задающей имя набора символов, или `None`. Если это строка, она будет преобразована в экземпляр `Charset`. Если *charset* равен `None`, параметр `charset` будет удалён из заголовка *Content-Type*. Любое другое значение вызовет [`TypeError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.TypeError).133134Сообщение будет считаться имеющим тип *text/\**, закодированное с помощью *charset.input\_charset*. Оно будет преобразовано в *charset.output\_charset* и при необходимости правильно закодировано при создании текстового представления сообщения. При необходимости будут добавлены MIME-заголовки (*MIME-Version*, *Content-Type*, *Content-Transfer-Encoding*).135136#### `[email.message.Message.get_charset]get_charset()`137138Возвращает экземпляр139140`Charset`141142, связанный с полезной нагрузкой сообщения.143144Следующие методы реализуют интерфейс, подобный отображению (mapping), для доступа к заголовкам сообщения [**RFC 2822**](https://python-all.ru/3.0/library/email.message.html). Обратите внимание, что между этими методами и обычным интерфейсом отображения (т.е. словаря) есть некоторые семантические различия. Например, в словаре нет повторяющихся ключей, но здесь могут быть повторяющиеся заголовки сообщения. Также в словарях нет гарантированного порядка ключей, возвращаемых [`keys()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.keys), но в объекте [`Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message) заголовки всегда возвращаются в том порядке, в котором они появились в исходном сообщении или были добавлены позже. Любой удалённый и затем повторно добавленный заголовок всегда добавляется в конец списка заголовков.145146Эти семантические различия являются намеренными и направлены на максимальное удобство.147148Обратите внимание, что во всех случаях заголовки конверта, присутствующие в сообщении, не включаются в интерфейс отображения.149150#### `[email.message.Message.__len__]__len__()`151152Возвращает общее количество заголовков, включая дубликаты.153154#### `[email.message.Message.__contains__]__contains__(name)`155156Возвращает истину, если объект сообщения имеет поле с именем *name*. Сравнение выполняется без учёта регистра, и *name* не должно включать завершающее двоеточие. Используется для оператора `in`, например:157158```python159if 'message-id' in myMessage:160 print('Message-ID:', myMessage['message-id'])161```162163#### `[email.message.Message.__getitem__]__getitem__(name)`164165Возвращает значение указанного поля заголовка. *name* не должно включать разделитель полей – двоеточие. Если заголовок отсутствует, возвращается `None`; исключение [`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError) никогда не вызывается.166167Обратите внимание: если указанное поле встречается в заголовках сообщения более одного раза, то какое именно из этих значений будет возвращено, не определено. Используйте метод [`get_all()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.get_all), чтобы получить значения всех существующих заголовков с этим именем.168169#### `[email.message.Message.__setitem__]__setitem__(name, val)`170171Добавляет заголовок в сообщение с именем поля *name* и значением *val*. Поле добавляется в конец существующих полей сообщения.172173Обратите внимание, что это *не* перезаписывает и не удаляет существующие заголовки с тем же именем. Если требуется гарантировать, что новый заголовок будет единственным в сообщении с именем поля *name*, сначала удалите это поле, например:174175```python176del msg['subject']177msg['subject'] = 'Python roolz!'178```179180#### `[email.message.Message.__delitem__]__delitem__(name)`181182Удаляет все вхождения поля с именем183184*name*185186из заголовков сообщения. Исключение не вызывается, если указанное поле отсутствует в заголовках.187188#### `__contains__(name)`189190Возвращает true, если сообщение содержит поле заголовка с именем191192*name*193194, в противном случае возвращает false.195196#### `[email.message.Message.keys]keys()`197198Возвращает список всех имён полей заголовков сообщения.199200#### `[email.message.Message.values]values()`201202Возвращает список всех значений полей сообщения.203204#### `[email.message.Message.items]items()`205206Возвращает список кортежей из двух элементов, содержащих все заголовки и значения полей сообщения.207208#### `[email.message.Message.get]get(name[, failobj])`209210Возвращает значение указанного поля заголовка. Этот метод идентичен211212[`__getitem__()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.__getitem__)213214, за исключением того, что если указанный заголовок отсутствует, возвращается необязательный параметр215216*failobj*217218(по умолчанию219220`None`221222).223224Вот несколько дополнительных полезных методов:225226#### `[email.message.Message.get_all]get_all(name[, failobj])`227228Возвращает список всех значений для поля с именем229230*name*231232. Если в сообщении нет таких заголовков, возвращается233234*failobj*235236(по умолчанию237238`None`239240).241242#### `[email.message.Message.add_header]add_header(_name, _value, **_params)`243244Расширенная установка заголовка. Этот метод похож на [`__setitem__()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.__setitem__), за исключением того, что дополнительные параметры заголовка могут быть переданы в виде именованных аргументов. *\_name* – это добавляемое поле заголовка, а *\_value* – это *основное* значение заголовка.245246Для каждого элемента словаря именованных аргументов *\_params* ключ используется как имя параметра, при этом символы подчёркивания заменяются на дефисы (поскольку дефисы недопустимы в идентификаторах Python). Обычно параметр добавляется в виде `key="value"`, если только значение не равно `None`; в этом случае добавляется только ключ.247248Вот пример:249250```python251msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')252```253254Это добавит заголовок, который выглядит как255256```python257Content-Disposition: attachment; filename="bud.gif"258```259260#### `[email.message.Message.replace_header]replace_header(_name, _value)`261262Заменяет заголовок. Заменяет первый найденный в сообщении заголовок, который соответствует263264*\_name*265266, сохраняя порядок заголовков и регистр имени поля. Если соответствующий заголовок не найден, вызывается267268[`KeyError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.KeyError)269270.271272#### `[email.message.Message.get_content_type]get_content_type()`273274Возвращает тип содержимого сообщения. Возвращаемая строка приводится к нижнему регистру и имеет вид *maintype/subtype*. Если в сообщении не было заголовка *Content-Type*, будет возвращён тип по умолчанию, задаваемый [`get_default_type()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.get_default_type). Поскольку согласно [**RFC 2045**](https://python-all.ru/3.0/library/email.message.html) сообщения всегда имеют тип по умолчанию, [`get_content_type()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.get_content_type) всегда возвращает значение.275276[**RFC 2045**](https://python-all.ru/3.0/library/email.message.html) определяет тип по умолчанию сообщения как *text/plain*, если только оно не находится внутри контейнера *multipart/digest*, в этом случае он будет *message/rfc822*. Если заголовок *Content-Type* содержит недопустимую спецификацию типа, [**RFC 2045**](https://python-all.ru/3.0/library/email.message.html) предписывает, что типом по умолчанию должен быть *text/plain*.277278#### `[email.message.Message.get_content_maintype]get_content_maintype()`279280Возвращает основной тип содержимого сообщения. Это часть281282*maintype*283284строки, возвращаемой285286[`get_content_type()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.get_content_type)287288.289290#### `[email.message.Message.get_content_subtype]get_content_subtype()`291292Возвращает подтип содержимого сообщения. Это часть293294*subtype*295296строки, возвращаемой297298[`get_content_type()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.get_content_type)299300.301302#### `[email.message.Message.get_default_type]get_default_type()`303304Возвращает тип содержимого по умолчанию. Большинство сообщений имеют тип содержимого по умолчанию305306*text/plain*307308, за исключением сообщений, которые являются подчастями контейнеров309310*multipart/digest*311312. Такие подчасти имеют тип содержимого по умолчанию313314*message/rfc822*315316.317318#### `[email.message.Message.set_default_type]set_default_type(ctype)`319320Устанавливает тип содержимого по умолчанию.321322*ctype*323324должен быть либо325326*text/plain*327328, либо329330*message/rfc822*331332, хотя это не принудительно. Тип содержимого по умолчанию не хранится в заголовке333334*Content-Type*335336.337338#### `[email.message.Message.get_params]get_params([failobj[, header[, unquote]]])`339340Возвращает параметры заголовка *Content-Type* сообщения в виде списка. Элементы возвращаемого списка – это кортежи из двух элементов (ключ, значение), разделённые знаком `'='`. Левая часть `'='` – это ключ, правая – значение. Если в параметре нет знака `'='`, значением будет пустая строка; иначе значение определяется так, как описано в [`get_param()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.get_param), и при этом снимаются кавычки, если необязательный параметр *unquote* равен `True` (по умолчанию).341342Необязательный параметр *failobj* – объект, возвращаемый при отсутствии заголовка *Content-Type*. Необязательный параметр *header* – заголовок, который нужно искать вместо *Content-Type*.343344#### `[email.message.Message.get_param]get_param(param[, failobj[, header[, unquote]]])`345346Возвращает значение параметра *param* заголовка *Content-Type* в виде строки. Если в сообщении нет заголовка *Content-Type* или такого параметра не существует, возвращается *failobj* (по умолчанию `None`).347348Необязательный параметр *header*, если указан, задаёт заголовок сообщения, который следует использовать вместо *Content-Type*.349350Ключи параметров всегда сравниваются без учёта регистра. Возвращаемое значение может быть либо строкой, либо кортежем из трёх элементов, если параметр был закодирован по [**RFC 2231**](https://python-all.ru/3.0/library/email.message.html). Если это кортеж из трёх элементов, то элементы значения имеют вид `(CHARSET, LANGUAGE, VALUE)`. Обратите внимание, что как `CHARSET`, так и `LANGUAGE` могут быть `None`; в этом случае следует считать, что `VALUE` закодирован в кодировке `us-ascii`. Обычно параметр `LANGUAGE` можно игнорировать.351352Если приложению всё равно, был ли параметр закодирован согласно [**RFC 2231**](https://python-all.ru/3.0/library/email.message.html), можно свернуть значение параметра, вызвав `email.Utils.collapse_rfc2231_value()` и передав возвращаемое значение из [`get_param()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.get_param). Эта функция вернёт должным образом декодированную строку Unicode, когда значение является кортежем, или исходную строку без кавычек в противном случае. Например:353354```python355rawparam = msg.get_param('foo')356param = email.Utils.collapse_rfc2231_value(rawparam)357```358359В любом случае значение параметра (возвращаемая строка или элемент `VALUE` кортежа из трёх) всегда возвращается без кавычек, если только *unquote* не равен `False`.360361#### `[email.message.Message.set_param]set_param(param, value[, header[, requote[, charset[, language]]]])`362363Устанавливает параметр в заголовке *Content-Type*. Если параметр уже существует в заголовке, его значение будет заменено на *value*. Если заголовок *Content-Type* ещё не задан для этого сообщения, он будет установлен в *text/plain*, а новое значение параметра будет добавлено в соответствии с [**RFC 2045**](https://python-all.ru/3.0/library/email.message.html).364365Необязательный параметр *header* указывает альтернативный заголовок для *Content-Type*, и все параметры будут заключаться в кавычки по мере необходимости, если необязательный параметр *requote* не равен `False` (по умолчанию `True`).366367Если указан необязательный параметр *charset*, параметр будет закодирован в соответствии с [**RFC 2231**](https://python-all.ru/3.0/library/email.message.html). Необязательный параметр *language* задаёт язык по RFC 2231, по умолчанию – пустая строка. И *charset*, и *language* должны быть строками.368369#### `[email.message.Message.del_param]del_param(param[, header[, requote]])`370371Полностью удаляет указанный параметр из заголовка372373*Content-Type*374375. Заголовок перезаписывается на месте без параметра и его значения. Все значения заключаются в кавычки по необходимости, если только376377*requote*378379не равен380381`False`382383(по умолчанию384385`True`386387). Необязательный388389*header*390391задаёт альтернативу392393*Content-Type*394395.396397#### `[email.message.Message.set_type]set_type(type[, header][, requote])`398399Устанавливает основной тип и подтип для заголовка *Content-Type*. *type* должен быть строкой вида *maintype/subtype*, иначе вызывается [`ValueError`](https://python-all.ru/3.0/library/exceptions.html#exceptions.ValueError).400401Этот метод заменяет заголовок *Content-Type*, сохраняя все параметры на месте. Если *requote* равен `False`, то существующие кавычки в заголовке остаются без изменений; в противном случае параметры заключаются в кавычки (по умолчанию).402403Альтернативный заголовок можно указать в аргументе *header*. При установке заголовка *Content-Type* также добавляется заголовок *MIME-Version*.404405#### `[email.message.Message.get_filename]get_filename([failobj])`406407Возвращает значение параметра408409`filename`410411заголовка412413*Content-Disposition*414415сообщения. Если в заголовке нет параметра416417`filename`418419, этот метод переходит к поиску параметра420421`name`422423. Если не найден ни один из них или заголовок отсутствует, возвращается424425*failobj*426427. Возвращаемая строка всегда будет без кавычек, в соответствии с428429`Utils.unquote()`430431.432433#### `[email.message.Message.get_boundary]get_boundary([failobj])`434435Возвращает значение параметра436437`boundary`438439заголовка440441*Content-Type*442443сообщения или444445*failobj*446447, если заголовок отсутствует или не имеет параметра448449`boundary`450451. Возвращаемая строка всегда будет без кавычек, в соответствии с452453`Utils.unquote()`454455.456457#### `[email.message.Message.set_boundary]set_boundary(boundary)`458459Устанавливает параметр `boundary` заголовка *Content-Type* в *boundary*. [`set_boundary()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.set_boundary) всегда будет экранировать *boundary*, если это необходимо. Исключение `HeaderParseError` возникает, если объект сообщения не имеет заголовка *Content-Type*.460461Обратите внимание, что использование этого метода незначительно отличается от удаления старого заголовка *Content-Type* и добавления нового с новым разделителем через [`add_header()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.add_header), потому что [`set_boundary()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.set_boundary) сохраняет порядок заголовка *Content-Type* в списке заголовков. Однако он *не* сохраняет никакие строки продолжения, которые могли присутствовать в исходном заголовке *Content-Type*.462463#### `[email.message.Message.get_content_charset]get_content_charset([failobj])`464465Возвращает параметр `charset` заголовка *Content-Type*, приведённый к нижнему регистру. Если заголовка *Content-Type* нет или в нём отсутствует параметр `charset`, возвращается *failobj*.466467Обратите внимание, что этот метод отличается от [`get_charset()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.get_charset), который возвращает экземпляр `Charset` для кодировки по умолчанию тела сообщения.468469#### `[email.message.Message.get_charsets]get_charsets([failobj])`470471Возвращает список, содержащий имена наборов символов в сообщении. Если сообщение является *multipart*, список будет содержать по одному элементу для каждой вложенной части в полезной нагрузке; в противном случае это будет список длиной 1.472473Каждый элемент списка будет строкой, которая является значением параметра `charset` в заголовке *Content-Type* для представленной подчасти. Однако если подчасть не имеет заголовка *Content-Type*, не имеет параметра `charset` или не является *text* основным MIME-типом, то этот элемент в возвращаемом списке будет равен *failobj*.474475#### `[email.message.Message.walk]walk()`476477Метод [`walk()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.walk) – это универсальный генератор, который можно использовать для перебора всех частей и подчастей дерева объектов сообщения в порядке обхода в глубину. Обычно [`walk()`](https://python-all.ru/3.0/library/email.message.html#email.message.Message.walk) применяется как итератор в цикле `for`; каждая итерация возвращает следующую подчасть.478479Вот пример, который выводит MIME-тип каждой части многокомпонентной структуры сообщения:480481```python482>>> for part in msg.walk():483... print(part.get_content_type())484multipart/report485text/plain486message/delivery-status487text/plain488text/plain489message/rfc822490```491492Объекты [`Message`](https://python-all.ru/3.0/library/email.message.html#email.message.Message) также могут опционально содержать два атрибута экземпляра, которые можно использовать при создании обычного текста MIME-сообщения.493494#### `[email.message.Message.preamble]preamble`495496Формат MIME-документа допускает наличие некоторого текста между пустой строкой после заголовков и первой строкой границы multipart. Обычно этот текст не виден в MIME-совместимом почтовом клиенте, поскольку он находится вне стандартной MIME-защиты. Однако при просмотре необработанного текста сообщения или при просмотре сообщения в клиенте, не поддерживающем MIME, этот текст может стать видимым.497498Атрибут *preamble* содержит этот начальный текст перед основным содержимым для MIME- документов. Когда `Parser` обнаруживает некоторый текст после заголовков, но до первой граничной строки, он присваивает его атрибуту сообщения *preamble*. Когда `Generator` формирует текстовое представление MIME-сообщения и обнаруживает, что у сообщения есть атрибут *preamble*, он записывает этот текст в область между заголовками и первой границей. Подробнее см. [`email.parser`](https://python-all.ru/3.0/library/email.parser.html#module-email.parser) и [`email.generator`](https://python-all.ru/3.0/library/email.generator.html#module-email.generator).499500Обратите внимание: если объект сообщения не имеет преамбулы, атрибут *preamble* будет равен `None`.501502#### `[email.message.Message.epilogue]epilogue`503504Атрибут *epilogue* действует так же, как атрибут *preamble*, за исключением того, что он содержит текст, который появляется между последней границей и концом сообщения.505506Не нужно устанавливать epilogue в пустую строку, чтобы `Generator` выводил перевод строки в конце файла.507508#### `[email.message.Message.defects]defects`509510Атрибут511512*defects*513514содержит список всех проблем, обнаруженных при разборе этого сообщения. Подробное описание возможных дефектов разбора см. в515516[`email.errors`](https://python-all.ru/3.0/library/email.errors.html#module-email.errors)517518.519