email.message.Message: представление email-сообщения с помощью API compat32¶email.message.Message: Representing an email message using the compat32 API
Класс Message очень похож на класс
EmailMessage, но без методов, добавленных в этом
классе, и с немного отличающимся поведением по умолчанию некоторых других методов.
Здесь также описаны методы, которые, хотя и поддерживаются классом
EmailMessage, не рекомендуются к использованию, кроме случаев работы с
устаревшим кодом.
В остальном философия и структура обоих классов одинаковы.
В этом документе описывается поведение при использовании политики Compat32 по умолчанию (для Message).
При использовании другой политики следует использовать класс EmailMessage.
An email message consists of headers and a payload. Headers must be RFC 5322 style 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. The payload may be a simple text message, or a binary object, or a structured sequence of sub-messages each with their own set of headers and their own payload. The latter type of payload is indicated by the message having a MIME type such as multipart/* or message/rfc822.
Концептуальная модель объекта Message представляет собой
упорядоченный словарь заголовков с дополнительными методами для доступа как к
специализированной информации из заголовков, так и к полезной нагрузке, для
генерации сериализованной версии сообщения и для рекурсивного обхода
дерева объектов. Обратите внимание, что дублирующиеся заголовки поддерживаются, но для доступа к ним
необходимо использовать специальные методы.
Псевдословарь Message индексируется по именам заголовков, которые
должны быть значениями ASCII. Значения словаря – строки, которые
должны содержать только символы ASCII; предусмотрена специальная обработка для
входных данных, не являющихся ASCII, но она не всегда дает правильные результаты. Заголовки
хранятся и возвращаются с сохранением регистра, но имена полей сопоставляются
без учета регистра. Также может присутствовать единичный конвертный заголовок, также известный как
заголовок Unix-From или заголовок From_. Полезная нагрузка представляет собой либо
строку, либо байты в случае простых объектов сообщений, либо список
объектов Message для документов-контейнеров MIME (например,
multipart/* и message/rfc822).
Ниже приведены методы класса Message:
-
class
email.message.Message(policy=compat32)¶ Если указан параметр policy (он должен быть экземпляром класса
policy), используйте заданные им правила для обновления и сериализации представления сообщения. Если policy не задан, используется политикаcompat32, которая обеспечивает обратную совместимость с версией Python 3.2 пакета email. Дополнительную информацию см. в документацииpolicy.Изменено в версии 3.3: Был добавлен именованный аргумент policy.
-
as_string(unixfrom=False, maxheaderlen=0, policy=None)¶ Возвращает всё сообщение, преобразованное в строку. Если необязательный параметр unixfrom имеет значение true, в возвращаемую строку включается конвертный заголовок. Значение 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 «неизвестный символ». (См. также
as_bytes()иBytesGenerator.)Изменено в версии 3.4: Добавлен именованный аргумент policy.
-
__str__()¶ Эквивалентно
as_string(). Позволяетstr(msg)создавать строку, содержащую отформатированное сообщение.
-
as_bytes(unixfrom=False, policy=None)¶ Возвращает всё сообщение, преобразованное в объект bytes. Если необязательный параметр unixfrom равен true, в возвращаемую строку включается конвертный заголовок. 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)создавать объект bytes, содержащий отформатированное сообщение.Новое в версии 3.4.
-
is_multipart()¶ Возвращает
True, если полезная нагрузка сообщения является списком объектовMessage, иначе возвращаетFalse. Когдаis_multipart()возвращаетFalse, полезная нагрузка должна быть строковым объектом (который может быть двоичной полезной нагрузкой, закодированной с помощью CTE). (Обратите внимание, что возвратTrueметодомis_multipart()не обязательно означает, что «msg.get_content_maintype() == 'multipart'» вернётTrue. Например,is_multipartвернётTrue, когдаMessageимеет типmessage/rfc822.)
-
set_unixfrom(unixfrom)¶ Устанавливает конвертный заголовок сообщения равным unixfrom, который должен быть строкой.
-
get_unixfrom()¶ Возвращает конвертный заголовок сообщения. По умолчанию равен
None, если конвертный заголовок никогда не был установлен.
-
attach(payload)¶ Добавляет указанный payload к текущему payload, который до вызова должен быть
Noneили списком объектовMessage. После вызова payload всегда будет списком объектовMessage. Если нужно установить payload в виде скалярного объекта (например, строки), используйтеset_payload().Это устаревший метод. В классе
EmailMessageего функциональность заменена методамиset_content(),makeиadd.
-
get_payload(i=None, decode=False)¶ Возвращает текущий payload: список объектов
Message, еслиis_multipart()равноTrue, или строку, еслиis_multipart()равноFalse. Если payload является списком и вы изменяете его, вы изменяете payload сообщения на месте.С необязательным аргументом i,
get_payload()возвращает i-й элемент payload (нумерация с нуля), еслиis_multipart()равноTrue. ВозникаетIndexError, если i меньше 0 или больше или равно количеству элементов в payload. Если payload является строкой (т.е.is_multipart()равноFalse) и передан i, возникаетTypeError.Необязательный флаг decode указывает, нужно ли декодировать payload в соответствии с заголовком Content-Transfer-Encoding. Когда
Trueи сообщение не является multipart, payload будет декодирован, если значение этого заголовка равноquoted-printableилиbase64. Если используется другая кодировка или заголовок Content-Transfer-Encoding отсутствует, payload возвращается как есть (без декодирования). Во всех случаях возвращаемые данные являются бинарными. Если сообщение multipart и флаг decode равенTrue, возвращаетсяNone. Если payload в формате base64 был сформирован некорректно (отсутствует дополнение, символы вне алфавита base64), в свойство defect сообщения добавляется соответствующий дефект (InvalidBase64PaddingDefectилиInvalidBase64CharactersDefectсоответственно).Когда decode равен
False(по умолчанию), тело возвращается в виде строки без декодирования Content-Transfer-Encoding. Однако для Content-Transfer-Encoding со значением 8bit предпринимается попытка декодировать исходные байты с использованиемcharset, указанной в заголовке Content-Type, с помощью обработчика ошибокreplace. Еслиcharsetне указана или указаннаяcharsetне распознана пакетом email, тело декодируется с использованием кодировки ASCII по умолчанию.Это устаревший метод. В классе
EmailMessageего функциональность заменена методамиget_content()иiter_parts().
-
set_payload(payload, charset=None)¶ Устанавливает payload всего объекта сообщения в payload. Ответственность за соблюдение инвариантов payload лежит на клиенте. Необязательный charset задаёт кодировку сообщения по умолчанию; подробнее см.
set_charset().Это устаревший метод. В классе
EmailMessageего функциональность заменена методомset_content().
-
set_charset(charset)¶ Устанавливает кодировку payload в 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 различаются, payload будет перекодирован в output_charset. Если отсутствует заголовок Content-Transfer-Encoding, payload будет закодирован для передачи при необходимости с использованием указанногоCharset, и будет добавлен соответствующий заголовок. Если заголовок Content-Transfer-Encoding уже существует, считается, что payload уже корректно закодирован с использованием этого Content-Transfer-Encoding, и он не изменяется.Это устаревший метод. В классе
EmailMessageего функциональность заменена параметром charset методаemail.emailmessage.EmailMessage.set_content().
-
get_charset()¶ Возвращает экземпляр
Charset, связанный с payload сообщения.Это устаревший метод. В классе
EmailMessageон всегда возвращаетNone.
Следующие методы реализуют интерфейс, похожий на словарь, для доступа к заголовкам сообщения в формате RFC 2822. Обратите внимание на некоторые семантические отличия от обычного словаря. Например, в словаре нет дублирующихся ключей, а здесь могут быть повторяющиеся заголовки. Также в словарях нет гарантированного порядка ключей, возвращаемых
keys(), а в объектеMessageзаголовки всегда возвращаются в том порядке, в котором они встречались в исходном сообщении или были добавлены позже. Любой удалённый и затем повторно добавленный заголовок всегда добавляется в конец списка заголовков.Эти семантические различия являются намеренными и направлены на максимальное удобство.
Обратите внимание, что во всех случаях заголовки конверта, присутствующие в сообщении, не включаются в интерфейс отображения.
В модели, созданной из байтов, любые значения заголовков, которые (вопреки 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. Поле добавляется в конец существующих полей сообщения.
Обратите внимание, что это не перезаписывает и не удаляет существующие заголовки с тем же именем. Если требуется гарантировать, что новый заголовок будет единственным в сообщении с именем поля name, сначала удалите это поле, например:
del msg['subject'] msg['subject'] = 'Python roolz!'
-
__delitem__(name)¶ Удаляет все вхождения поля с именем name из заголовков сообщения. Исключение не возбуждается, если указанное поле отсутствует в заголовках.
-
keys()¶ Возвращает список всех имён полей заголовков сообщения.
-
values()¶ Возвращает список всех значений полей сообщения.
-
items()¶ Возвращает список кортежей из двух элементов, содержащих все заголовки и значения полей сообщения.
-
get(name, failobj=None)¶ Возвращает значение указанного поля заголовка. Этот метод идентичен методу
__getitem__()за исключением того, что если указанный заголовок отсутствует, возвращается необязательный параметр failobj (по умолчаниюNone).
Вот несколько дополнительных полезных методов:
-
get_all(name, failobj=None)¶ Возвращает список всех значений для поля с именем name. Если в сообщении нет таких заголовков, возвращается failobj (по умолчанию
None).
-
add_header(_name, _value, **_params)¶ Расширенная настройка заголовка. Этот метод похож на
__setitem__(), за исключением того, что дополнительные параметры заголовка можно передавать в виде именованных аргументов. _name – это добавляемое поле заголовка, а _value – основное значение заголовка.Для каждого элемента в словаре именованных аргументов _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()¶ Возвращает тип содержимого сообщения. Возвращаемая строка приводится к нижнему регистру в форме maintype/subtype. Если в сообщении не было заголовка Content-Type, будет возвращен тип по умолчанию, заданный
get_default_type(). Поскольку согласно RFC 2045 сообщения всегда имеют тип по умолчанию,get_content_type()всегда возвращает значение.RFC 2045 определяет тип по умолчанию сообщения как text/plain, если только оно не находится внутри контейнера multipart/digest, в этом случае он будет message/rfc822. Если заголовок Content-Type содержит недопустимую спецификацию типа, RFC 2045 предписывает, что типом по умолчанию должен быть text/plain.
-
get_content_maintype()¶ Возвращает основной тип содержимого сообщения. Это часть 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 сообщения в виде списка. Элементы возвращаемого списка – кортежи из двух элементов (ключ/значение), разделённые знаком
'='. Левая часть от'='– ключ, а правая – значение. Если в параметре нет знака'=', значением является пустая строка; в противном случае значение соответствуетget_param()и не экранируется, если необязательный параметр unquote равенTrue(по умолчанию).Необязательный параметр failobj – объект, возвращаемый при отсутствии заголовка Content-Type. Необязательный параметр header – заголовок, который нужно искать вместо Content-Type.
Это устаревший метод. В классе
EmailMessageего функциональность заменена свойством params отдельных объектов заголовков, возвращаемых методами доступа к заголовкам.
-
get_param(param, failobj=None, header='content-type', unquote=True)¶ Возвращает значение параметра param заголовка Content-Type в виде строки. Если сообщение не содержит заголовка Content-Type или такого параметра нет, возвращается failobj (по умолчанию
None).Необязательный параметр header, если указан, задаёт заголовок сообщения, который следует использовать вместо Content-Type.
Ключи параметров всегда сравниваются без учёта регистра. Возвращаемое значение может быть строкой или кортежем из трёх элементов, если параметр был закодирован по RFC 2231. Если это кортеж из трёх элементов, элементы значения имеют вид
(CHARSET, LANGUAGE, VALUE). Обратите внимание, что иCHARSET, иLANGUAGEмогут бытьNone; в этом случае следует считать, чтоVALUEзакодирован в кодировкеus-ascii. ОбычноLANGUAGEможно игнорировать.Если вашему приложению безразлично, был ли параметр закодирован по RFC 2231, можно свернуть значение параметра, вызвав
email.utils.collapse_rfc2231_value()и передав возвращаемое значение изget_param(). Это вернёт подходящим образом декодированную строку Unicode, если значение является кортежем, или исходную строку без кавычек, если нет. Например:rawparam = msg.get_param('foo') param = email.utils.collapse_rfc2231_value(rawparam)
В любом случае значение параметра (возвращённая строка или элемент
VALUEкортежа из трёх элементов) всегда не экранируется, если только 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добавлен ключевой параметр.
-
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. Возвращаемая строка всегда будет раскрыта в соответствии сemail.utils.unquote().
-
get_boundary(failobj=None)¶ Возвращает значение параметра
boundaryзаголовка Content-Type сообщения или failobj, если заголовок отсутствует или не содержит параметраboundary. Возвращаемая строка всегда будет раскрыта в соответствии сemail.utils.unquote().
-
set_boundary(boundary)¶ Устанавливает параметр
boundaryзаголовка Content-Type в значение boundary.set_boundary()всегда будет заключать boundary в кавычки при необходимости. Возбуждается исключениеHeaderParseError, если объект сообщения не имеет заголовка Content-Type.Обратите внимание, что использование этого метода незначительно отличается от удаления старого заголовка Content-Type и добавления нового с новым boundary через
add_header(), посколькуset_boundary()сохраняет порядок заголовка Content-Type в списке заголовков. Однако он не сохраняет строки продолжения, которые могли быть в исходном заголовке Content-Type.
-
get_content_charset(failobj=None)¶ Возвращает параметр
charsetзаголовка Content-Type, приведённый к нижнему регистру. Если заголовок Content-Type отсутствует или не содержит параметраcharset, возвращается failobj.Обратите внимание, что этот метод отличается от
get_charset(), который возвращает экземплярCharsetдля кодировки тела сообщения по умолчанию.
-
get_charsets(failobj=None)¶ Возвращает список, содержащий имена наборов символов в сообщении. Если сообщение является multipart, список будет содержать по одному элементу для каждой вложенной части в полезной нагрузке; в противном случае это будет список длиной 1.
Каждый элемент списка будет строкой, которая является значением параметра
charsetв заголовке Content-Type для представленной вложенной части. Однако если у вложенной части нет заголовка Content-Type, нет параметраcharset, или она не относится к основному MIME-типу text, то такой элемент списка будет равен failobj.
-
get_content_disposition()¶ Возвращает значение заголовка Content-Disposition сообщения в нижнем регистре (без параметров), если он есть, или
None. Возможные значения этого метода: inline, attachment илиNone, если сообщение соответствует RFC 2183.Новое в версии 3.5.
-
walk()¶ Метод
walk()– это универсальный генератор, который можно использовать для обхода всех частей и подчастей дерева объекта сообщения в порядке прямого обхода в глубину. Обычноwalk()используется как итератор в цикле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:>>> 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-документа допускает наличие некоторого текста между пустой строкой после заголовков и первой строкой границы multipart. Обычно этот текст не виден в MIME-совместимом почтовом клиенте, поскольку он находится вне стандартной MIME-защиты. Однако при просмотре необработанного текста сообщения или при просмотре сообщения в клиенте, не поддерживающем MIME, этот текст может стать видимым.
Атрибут preamble содержит этот дополнительный текст за пределами MIME-защиты для MIME-документов. Когда
Parserобнаруживает некоторый текст после заголовков, но до первой строки границы, он присваивает этот текст атрибуту preamble сообщения. КогдаGeneratorзаписывает текстовое представление MIME-сообщения и обнаруживает, что сообщение имеет атрибут preamble, он записывает этот текст в области между заголовками и первой границей. Подробнее см.email.parserиemail.generator.Обратите внимание: если у объекта сообщения нет преамбулы, атрибут preamble будет равен
None.
-
epilogue¶ Атрибут epilogue действует так же, как атрибут preamble, за исключением того, что он содержит текст, который появляется между последней границей и концом сообщения.
Нет необходимости устанавливать epilogue в пустую строку, чтобы
Generatorвыводил символ новой строки в конце файла.
-
defects¶ Атрибут defects содержит список всех проблем, обнаруженных при разборе этого сообщения. См.
email.errorsдля подробного описания возможных дефектов разбора.
-