email.message.Message: Представление сообщения электронной почты с помощью API compat32

Класс Message очень похож на класс EmailMessage, без методов, добавленных этим классом, и при этом поведение по умолчанию некоторых других методов несколько отличается. Мы также документируем здесь некоторые методы, которые, хотя и поддерживаются классом EmailMessage, не рекомендуются, если вы не имеете дело с унаследованными код.

Философия и структура двух классов в остальном одинаковы.

В этом документе описывается поведение в политике Message по умолчанию (для Compat32). Если вы собираетесь использовать другую политику, вместо нее следует использовать класс EmailMessage.

Сообщение электронной почты состоит из headers и payload. Заголовки должны быть именами стилей RFC 5233 и значения, где имя поля и значение разделены двоеточием. Двоеточие не является частью имени поля или поля значение. Полезной нагрузкой может быть простое текстовое сообщение, или двоичный объект, или структурированная последовательность подсообщения, каждое со своим набором заголовков и своей собственной полезной нагрузкой. Последний тип полезной нагрузки указывается сообщением, имеющим тип MIME, такой как multipart/* или message/rfc822.

Концептуальная модель, обеспечиваемая объектом Message, представляет собой модель упорядоченного словаря заголовков с дополнительными способами для доступа как к специализированной информации из заголовков, для доступа к полезной нагрузке, для генерации сериализованной версии сообщения и для рекурсивного обхода дерева объектов. Обратите внимание, что двойные заголовки поддержаны, но специальные методы должны быть используемый, чтобы получить доступ к ним.

Псевдословарь Message внесен в указатель названиями заголовка, которые должны быть ASCII значения. значения словаря являются строки, которые должны содержать только символы ASCII; существует специальная обработка для ввода данных, отличных от ASCII, но она не всегда дает правильные результаты. Заголовки сохранены и сохраняющая случай форма возвращенныйin, но имена полей - подобранный случай нечувствительно. Также может быть одиночный заголовок конверта, также известный как заголовок Unix-From или заголовок From_. В случае простых объектов сообщения или списка объектов payload для документов контейнера MIME (например, строка и message/rfc822) Message является либо multipart/*, либо байтами.

Вот методы класса Message:

class email.message.Message(policy=compat32)

Если задано значение policy (оно должно быть сущность класса policy), используйте указанные правила для обновления и сериализации представления сообщения. Если параметр policy не задан, используйте политику compat32, поддерживающую обратную совместимость с версией пакета электронной почты Python 3.2. Дополнительные сведения см. в документации по policy.

Изменено в версии 3.3: The policy keyword argument was added.

as_string(unixfrom=False, maxheaderlen=0, policy=None)

Возвращает всего сообщения, сплющиваемого как строка. Когда дополнительный unixfrom верен, заголовок конверта включен в возвращенныйstring. unixfrom по умолчанию принимает значение False. По причинам обратной совместимости, дефолтам maxheaderlen к 0, поэтому если вы хотите другой значение, вы должны отвергнуть его явно (значение, определенный для max_line_length в политике, будет проигнорирован этим методом). Аргумент policy может быть используемый для переопределения политики по умолчанию, полученной из сообщения сущность. Это может быть используемый для управления некоторым форматированием, создаваемым методом, так как указанное policy будет передано Generator.

Распрямление сообщения может вызвать изменения Message, если для завершения преобразования в строка необходимо заполнить значения по умолчанию (например, границы MIME могут быть сгенерированы или изменены).

Обратите внимание, что этот метод предоставляется для удобства и не всегда форматирует сообщение так, как вы хотите. Например, по умолчанию не выполняется управление строками, начинающимися с From, что требуется форматом unix mbox. Для большей гибкости создайте экземпляр Generator сущность и используйте его метод flatten() напрямую. Например:

from io import StringIO
from email.generator import Generator
fp = StringIO()
g = Generator(fp, mangle_from_=True, maxheaderlen=60)
g.flatten(msg)
text = fp.getvalue()

Если объект сообщения содержит двоичные данные, которые не являются кодированный в соответствии со стандартами RFC, несоответствующие данные будут заменены unicode «unknown символ» код points. (См. также as_bytes() и BytesGenerator.)

Изменено в версии 3.4: policy keyword argument was added.

__str__()

Эквивалентно as_string(). Позволяет str(msg) создавать строка, содержащие форматированное сообщение.

as_bytes(unixfrom=False, policy=None)

Возвращает всего сообщения, сведенного как объект в байтах. Когда дополнительный unixfrom верен, заголовок конверта включен в возвращенныйstring. unixfrom по умолчанию принимает значение False. Аргумент policy может быть используемый для переопределения политики по умолчанию, полученной из сообщения сущность. Это может быть используемый для управления некоторым форматированием, создаваемым методом, так как указанное policy будет передано BytesGenerator.

Распрямление сообщения может вызвать изменения Message, если для завершения преобразования в строка необходимо заполнить значения по умолчанию (например, границы MIME могут быть сгенерированы или изменены).

Обратите внимание, что этот метод предоставляется для удобства и не всегда форматирует сообщение так, как вы хотите. Например, по умолчанию не выполняется управление строками, начинающимися с From, что требуется форматом unix mbox. Для большей гибкости создайте экземпляр BytesGenerator сущность и используйте его метод flatten() напрямую. Например:

from io import BytesIO
from email.generator import BytesGenerator
fp = BytesIO()
g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60)
g.flatten(msg)
text = fp.getvalue()

Добавлено в версии 3.4.

__bytes__()

Эквивалентно as_bytes(). Позволяет bytes(msg) создавать объект в байтах, содержащий форматированное сообщение.

Добавлено в версии 3.4.

is_multipart()

Возвращает True если полезная нагрузка сообщения представляет собой список подчиненныхMessage объектов, в противном случае возвращает False. Когда is_multipart() возвращает False, полезный груз должен быть объектом строка (который мог бы быть полезным грузом набора из двух предметов CTE кодированный). (Обратите внимание, что is_multipart(), возвращая True не обязательно означает, что «сообщение get_content_maintype () == „многослойный“» будет возвращает True. Например, is_multipart будет возвращает True, когда Message имеет тип message/rfc822.)

set_unixfrom(unixfrom)

Установите для заголовка конверта сообщения значение unixfrom, которое должно быть строка.

get_unixfrom()

Возвращает заголовок конверта сообщения. Значение по умолчанию равно None, если заголовок конверта не был установлен.

attach(payload)

Добавьте данный payload к текущему полезному грузу, который должен быть None или списком объектов Message перед требованием. После вызова полезной нагрузкой всегда будет список объектов Message. Если требуется установить для полезной нагрузки скалярный объект (например, строка), используйте команду set_payload().

Это устаревший метод. В классе EmailMessage его функциональность заменяется на set_content() и связанные методы make и add.

get_payload(i=None, decode=False)

Текущий полезный груз возвращает the, который будет списком объектов Message, когда is_multipart() будет True или строка, когда is_multipart() - False. Если полезная нагрузка является списком и объект списка изменяется, необходимо изменить полезную нагрузку сообщения на месте.

С дополнительным аргументом i get_payload() будет элемент возвращает the i-th полезного груза, учитывающегося с нуля, если is_multipart() будет True. IndexError будет поднят, если i будет меньше чем 0 или больше, чем или равный количеству предметов в полезном грузе. Если полезная нагрузка является строка (то есть is_multipart() является False) и задана i, поднимается TypeError.

Необязательный decode - флаг, указывающий, следует ли декодировать полезную нагрузку в соответствии с заголовком Content-Transfer-Encoding. Если True и сообщение не является многопартийным, то полезная нагрузка декодируется, если значение значение этого заголовка равно quoted-printable или base64. Если какой-либо другой кодировка является используемый, или заголовок Content-Transfer-Encoding отсутствует, полезная нагрузка является возвращенныйas-is (недекодированной). Во всех случаях возвращенныйзначение является двоичными данными. Если сообщение является многопартийным и флаг decode равен True, возвращается значение None. Если полезная нагрузка - base64 и она не была полностью сформирована (отсутствие заполнения, символы вне алфавита base64), то соответствующий дефект будет добавлен к свойству дефекта сообщения (InvalidBase64PaddingDefect или InvalidBase64CharactersDefect соответственно).

Когда decode - False (дефолт), тело - возвращенныйas строка, не расшифровывая Content-Transfer-Encoding. Однако для Content-Transfer-Encoding 8 битов, попытка предпринята, чтобы расшифровать оригинальные байты, используя charset, определенный заголовком Content-Type, используя ошибочного обработчика replace. Если charset не указан, или если charset не распознан пакетом электронной почты, тело декодируется с помощью ASCII-кодировки по умолчанию.

Это устаревший метод. На классе EmailMessage его функциональность заменяется на get_content() и iter_parts().

set_payload(payload, charset=None)

Установите для полезной нагрузки всего объекта сообщения значение payload. Клиент несет ответственность за обеспечение инвариантов полезной нагрузки. Дополнительный charset устанавливает дефолт сообщения набор символ; для получения дополнительной информации см. раздел set_charset().

Это устаревший метод. На классе EmailMessage его функциональность заменена на set_content().

set_charset(charset)

Установите набор символ полезного груза к charset, который может или быть Charset сущность (см. email.charset), строка, называющий набор символ или None. Если это строка, он будет преобразован в Charset сущность. Если charset будет None, то параметр charset будет удален из заголовка Content-Type (сообщение не будет иначе изменено). Все остальное создаст TypeError.

При отсутствии существующего заголовка MIME-Version добавляется один заголовок. При отсутствии существующего заголовка Content-Type добавляется значение text/plain. Независимо от того, существует ли заголовок Content-Type или нет, для его параметра charset будет установлено значение charset.output_charset. Если charset.input_charset и charset.output_charset различаются, полезная нагрузка будет re-кодированный к output_charset. Если заголовок Content-Transfer-Encoding отсутствует, то при необходимости полезная нагрузка будет transfer-кодированный с использованием указанного Charset, и будет добавлен заголовок с соответствующим значение. Если заголовок Content-Transfer-Encoding уже существует, полезный груз, как предполагается, уже является правильно кодированный, используя это Content-Transfer-Encoding и не изменен.

Это устаревший метод. В классе EmailMessage его функциональность заменяется параметром charset метода email.emailmessage.EmailMessage.set_content().

get_charset()

Возвращает Charset сущность, связанный с полезной нагрузкой сообщения.

Это устаревший метод. В классе EmailMessage он всегда возвращает None.

Следующие методы осуществляют подобный отображению интерфейс для доступа к заголовкам сообщения RFC 2822. Следует отметить, что существуют некоторые семантические различия между этими методами и обычным интерфейсом отображения (т.е. словарем). Например, в словаре нет дубликатов ключей, но здесь могут быть дубликаты заголовки сообщений. Кроме того, в словарях нет никакого гарантируемого заказа к возвращенный keys() ключей, но в объекте Message, заголовки всегда - возвращенныйin заказ, они появились в исходном сообщении или были добавлены к сообщению позже. Любой заголовок, удаляемый и затем вновь добавляемый, всегда добавляется к концу списка заголовков.

Эти семантические различия являются намеренными и смещены к максимальному удобству.

Следует отметить, что во всех случаях любой заголовок конверта, присутствующий в сообщении, не включается в интерфейс отображения.

В модели, генерируемой из байтов, любой заголовок значения, который (в нарушение RFC) содержит байты не-ASCII, при извлечении через этот интерфейс будет представлен как Header объекты с набором символов „unknown-8bit“.

__len__()

Возвращает общее количество заголовков, включая дубликаты.

__contains__(name)

Возвращает True, если объект сообщения имеет поле с именем name. Сопоставление выполняется без учета регистра, и name не должен включать в себя конечную двоеточие. Используется для оператора in, например,:

if 'message-id' in myMessage:
   print('Message-ID:', myMessage['message-id'])
__getitem__(name)

Возвращает значение именованного поля заголовка. name не должен включать разделитель полей двоеточия. Если заголовок отсутствует, возвращается значение None; KeyError никогда не воспитывается.

Обратите внимание, что, если названное поле появляется несколько раз в заголовках сообщения, точно кто из тех выставляет значения, будет возвращенный неопределенный. Используйте метод get_all(), чтобы получить значения всех существующих именованных заголовков.

__setitem__(name, val)

Добавьте заголовок к сообщению с именем поля name и значение val. Поле добавляется к концу существующих полей сообщения.

Обратите внимание, что это делает not, переписывают или удаляют любой существующий заголовок с тем же именем. Если необходимо убедиться, что новый заголовок является единственным заголовком в сообщении с именем поля name, сначала удалите поле, например,:

del msg['subject']
msg['subject'] = 'Python roolz!'
__delitem__(name)

Удалите все вхождения поля с именем name из заголовков сообщения. Исключение не возникает, если именованное поле отсутствует в заголовках.

keys()

Возвращает a список всех имен полей заголовка сообщения.

values()

Возвращает a список всех полей сообщения значения.

items()

Возвращает a список 2-кортежей, содержащих все заголовки полей сообщения и значения.

get(name, failobj=None)

Возвращает значение именованного поля заголовка. Это идентично __getitem__() за исключением того, что дополнительный failobj - возвращенныйif, который названный заголовок пропускает (дефолты к None).

Вот несколько дополнительных полезных методов:

get_all(name, failobj=None)

Возвращает a список всех значения для поля с именем name. Если в сообщении нет таких именованных заголовков, возвращается значение failobj (значение по умолчанию - None).

add_header(_name, _value, **_params)

Расширенная настройка заголовка. Этот метод аналогичен __setitem__(), за исключением того, что дополнительные параметры заголовка могут быть предоставлены в качестве аргументов ключевой. _name - добавляемое поле заголовка, а _value - primary значение для заголовка.

Для каждого предмета в словаре аргумента ключевой _params ключ взят в качестве названия параметра, с подчеркивает преобразованный в черты (так как черты незаконны в идентификаторах Python). Обычно, параметр будет добавлен как key="value", если значение не будет None, в этом случае только ключ будет добавлен. Если значение содержит знаки неASCII, можно определить как три кортежа в формате (CHARSET, LANGUAGE, VALUE), где CHARSET - строка, называющий кодировку, чтобы быть используемый, чтобы закодировать значение, LANGUAGE может обычно устанавливаться в None или пустой строка (см. RFC 2231 для других возможностей), и VALUE - строка значение, содержащий неASCII точки код. Если три кортежа не переданы, и значение содержит знаки неASCII, это - автоматически кодированный в формате RFC 2231, используя CHARSET utf-8 и LANGUAGE None.

Вот пример:

msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')

Это добавит заголовок, который выглядит как:

Content-Disposition: attachment; filename="bud.gif"

Пример с символами, отличными от ASCII:

msg.add_header('Content-Disposition', 'attachment',
               filename=('iso-8859-1', '', 'Fußballer.ppt'))

Который производит:

Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt"
replace_header(_name, _value)

Замените заголовок. Замените первый заголовок в сообщении, совпадающем с _name, сохранив порядок заголовка и регистр имени поля. Если никакое соответствие заголовку не было найдено, KeyError поднят.

get_content_type()

Возвращает тип содержимого сообщения. возвращенныйstring принуждается к нижнему регистру формы maintype/subtype. Если в сообщении не было заголовка Content-Type, то будет возвращен тип по умолчанию, заданный параметром get_default_type(). С тех пор согласно RFC 2045, у сообщений всегда есть тип по умолчанию, get_content_type() всегда будет возвращает a значение.

RFC 2045 определяет тип сообщения по умолчанию, который должен быть text/plain, если только он не отображается внутри контейнера multipart/digest, и в этом случае он будет message/rfc822. Если заголовок Content-Type имеет недопустимую спецификацию типа, RFC 2045 требует, чтобы тип по умолчанию был text/plain.

get_content_maintype()

основной тип содержимого сообщения возвращает the. Это maintype часть строка возвращенный get_content_type().

get_content_subtype()

Возвращает тип субсодержимого сообщения. Это subtype часть строка возвращенный get_content_type().

get_default_type()

Возвращает тип содержимого по умолчанию. Большинство сообщений имеют тип содержимого text/plain по умолчанию, за исключением сообщений, являющихся подкатегориями контейнеров multipart/digest. Такие подразделы имеют тип содержимого message/rfc822 по умолчанию.

set_default_type(ctype)

Задайте тип содержимого по умолчанию. ctype должны быть либо text/plain, либо message/rfc822, хотя это не принудительно. Тип содержимого по умолчанию не хранится в заголовке Content-Type.

get_params(failobj=None, header='content-type', unquote=True)

Параметры сообщения Content-Type возвращает the, как список. Элементы возвращенныйlist представляют собой 2-кортежи пар key/значение, как расщепленные на знаке '='. Левая сторона '=' является ключом, а правая сторона - значение. Если в параметре нет знака '=', то значение является пустым строка, в противном случае значение соответствует описанию в разделе get_param() и отменяется, если опция unquote имеет значение True (значение по умолчанию).

Дополнительный failobj - объект к возвращает if есть заголовок № Content-Type. Необязательный header - заголовок для поиска, а не Content-Type.

Это устаревший метод. На классе EmailMessage его функциональность заменена собственностью params отдельного возвращенный объектов заголовка методы доступа заголовка.

get_param(param, failobj=None, header='content-type', unquote=True)

Возвращает значение параметра заголовка Content-Type param как строка. Если сообщение не имеет заголовка Content-Type или нет такого параметра, возвращается значение failobj (значение по умолчанию - None).

Необязательный header, если задан, указывает заголовок сообщения, который будет использоваться вместо Content-Type.

Ключи параметров всегда сравниваются без учета регистра. возвращает значение может быть строка или 3-кортежем, если параметр имеет значение RFC 2231 кодированный. Когда это 3-кортеж, элементы значение имеют вид (CHARSET, LANGUAGE, VALUE). Обратите внимание, что и CHARSET и LANGUAGE могут быть None, в этом случае вы должны полагать, что VALUE кодированный в кодировке us-ascii. Вы обычно можете игнорировать LANGUAGE.

Если приложение не заботится о том, был ли параметр кодированный, как в RFC 2231, можно свернуть параметр значение, вызвав email.utils.collapse_rfc2231_value(), передав возвращает значение из get_param(). Этот будет, возвращает a соответственно расшифровал Unicode строка, когда значение - кортеж, или оригинальный строка закрыл кавычки, если это не. Например:

rawparam = msg.get_param('foo')
param = email.utils.collapse_rfc2231_value(rawparam)

В любом случае, параметр, значение (или возвращенныйstring или предмет VALUE в с 3 кортежами) всегда закрывается кавычки, если unquote не установлен в False.

Это устаревший метод. На классе EmailMessage его функциональность заменена собственностью params отдельного возвращенный объектов заголовка методы доступа заголовка.

set_param(param, value, header='Content-Type', requote=True, charset=None, language='', replace=False)

Параметр установить в заголовке Content-Type. Если параметр уже существует в заголовке, его значение будет заменен на value. Если заголовок Content-Type еще не определен для этого сообщения, он будет установлен в text/plain и новый параметр значение будет добавлен в соответствии с RFC 2045.

Дополнительный header определяет альтернативный заголовок к Content-Type, и все параметры будут указаны по мере необходимости, если не дополнительный, requote - False (дефолт - True).

Если дополнительный charset определен, параметр будет кодированный согласно RFC 2231. Дополнительный language определяет язык RFC 2231, не выполняя своих обязательств к пустому строка. И charset, и language должны быть строки.

Если replace - False (дефолт), заголовок перемещен до конца списка заголовков. Если replace является True, заголовок будет обновлен.

Изменено в версии 3.4: replace keyword was added.

del_param(param, header='content-type', requote=True)

Полностью удалите данный параметр из заголовка Content-Type. Заголовок будет перезаписан на месте без параметра или его значение. Весь значения будет указан по мере необходимости, если requote не будет False (дефолт - True). Необязательная header задает альтернативу Content-Type.

set_type(type, header='Content-Type', requote=True)

Задайте основной тип и подтип для заголовка Content-Type. type должен быть строка в форме maintype/subtype, в противном случае поднимается ValueError.

Этот метод заменяет заголовок Content-Type, сохраняя все параметры на месте. Если requote является False, квотирование существующего заголовка остается как есть, в противном случае параметры будут котироваться (по умолчанию).

В аргументе header можно указать альтернативный заголовок. При установке заголовка Content-Type также добавляется заголовок MIME-Version.

Это устаревший метод. В классе EmailMessage его функциональность заменяется методами make_ и add_.

get_filename(failobj=None)

Возвращает значение параметра filename заголовка Content-Disposition сообщения. Если заголовок не имеет параметра filename, этот метод возвращается к поиску параметра name в заголовке Content-Type. Если ни один из них не найден, или заголовок отсутствует, возвращается значение failobj. возвращенныйstring всегда будет отменен в соответствии с email.utils.unquote().

get_boundary(failobj=None)

Возвращает значение параметра boundary заголовка Content-Type сообщения или failobj, если или заголовок отсутствует или имеет параметр № boundary. возвращенныйstring всегда будет отменен в соответствии с email.utils.unquote().

set_boundary(boundary)

Установите для параметра boundary заголовка Content-Type значение boundary. set_boundary() всегда будет цитировать boundary, если это необходимо. HeaderParseError поднят, если у объекта сообщения есть заголовок № Content-Type.

Следует отметить, что использование этого метода незначительно отличается от удаления старого заголовка Content-Type и добавления нового заголовка с новой границей через add_header(), поскольку set_boundary() сохраняет порядок заголовка Content-Type в списке заголовков. Однако это делает заповедник not любые линии продолжения, которые, возможно, присутствовали в оригинальном заголовке Content-Type.

get_content_charset(failobj=None)

Возвращает charset параметр заголовка Content-Type, принуждаемый к нижнему регистру. Если заголовок Content-Type отсутствует или заголовок не имеет параметра charset, возвращается значение failobj.

Обратите внимание, что этот метод отличается от get_charset(), который возвращает Charset сущность для дефолта кодировка текста сообщения.

get_charsets(failobj=None)

Список возвращает a, содержащий имена наборов символ в сообщении. Если сообщение является multipart, то список будет содержать один элемент для каждого подраздела полезной нагрузки, в противном случае это будет список длины 1.

Каждый элемент в списке будет представлять собой строка, который является значение параметра charset в заголовке Content-Type для представленного подраздела. Однако если подраздел не имеет заголовка Content-Type, параметра charset или не относится к типу MIME text, то этот элемент в возвращенныйlist будет failobj.

get_content_disposition()

Возвращает нижний регистр значение (без параметров) заголовка сообщения Content-Disposition, если он имеет его, или None. Возможные значения для этого метода являются inline, attachment или None, если сообщение следует за RFC 2183.

Добавлено в версии 3.5.

walk()

Метод walk() - универсальный генератор, который может быть используемый, чтобы повторить по всем частям и подразделениям дерева объекта сообщения в глубине первый пересекающийся заказ. Вы будете, как правило, использовать walk() в качестве iterator в петле for; каждая итерация возвращает следующий подраздел.

Вот пример, в котором печатается тип MIME каждой части многопартийной структуры сообщений:

>>> for part in msg.walk():
...     print(part.get_content_type())
multipart/report
text/plain
message/delivery-status
text/plain
text/plain
message/rfc822
text/plain

walk итератируется по подразделам любой части, где is_multipart() возвращается True, даже если msg.get_content_maintype() == 'multipart' может возвращает False. Мы видим, что это в нашем примере, используя _structure отлаживает помощника function:

>>> for part in msg.walk():
...     print(part.get_content_maintype() == 'multipart',
...           part.is_multipart())
True True
False False
False True
False False
False False
False True
False False
>>> _structure(msg)
multipart/report
    text/plain
    message/delivery-status
        text/plain
        text/plain
    message/rfc822
        text/plain

Здесь message части не являются multiparts, но они содержат подразделы. is_multipart() возвращает True и walk опускается в подразделы.

Message объекты могут также необязательно содержать два сущность атрибуты, которые могут быть используемый при генерации обычного текста MIME- сообщения.

preamble

Формат MIME-документа позволяет создавать текст между пустой строкой, следующей за заголовками, и первой многоточечной границей строка. Как правило, этот текст никогда не отображается в считывателе почты с поддержкой MIME, поскольку он выходит за пределы стандартной брони MIME. Однако при просмотре необработанного текста сообщения или при просмотре сообщения в считывающем устройстве, не поддерживающем MIME, этот текст может стать видимым.

В файле preamble атрибут содержится ведущий текст для документов MIME. Когда Parser открывает некоторый текст после заголовков, но перед первым граничным строка, он назначает этот текст на сообщение preamble атрибут. Когда Generator записывает обычное текстовое представление MIME- сообщения и обнаруживает, что сообщение имеет preamble атрибут, он запишет этот текст в область между заголовками и первой границей. Дополнительные сведения см. в разделах email.parser и email.generator.

Следует отметить, что если у объекта сообщения нет преамбулы, то preamble атрибут будет None.

epilogue

epilogue атрибут действует так же, как preamble атрибут, за исключением того, что он содержит текст, который появляется между последней границей и концом сообщения.

Вы не должны устанавливать эпилог в пустой строка для Generator печатать newline в конце файла.

defects

В defects атрибут содержится список всех проблем, обнаруженных при парсинг этого сообщения. См. email.errors для подробного описания возможных дефектов парсинга.