email.message.Message: Представление электронного сообщения с использованием API compat32
Класс Message очень похож на класс EmailMessage, без методов, добавленных этим классом, и с немного отличающимся поведением по умолчанию некоторых других методов. Мы также документируем здесь некоторые методы, которые, хотя и поддерживаются классом EmailMessage, не рекомендуются, если вы не работаете с устаревшим кодом.
Философия и структура этих двух классов в остальном одинаковы.
В этом документе описывается поведение по умолчанию (для Message) политики Compat32. Если вы собираетесь использовать другую политику, вам следует использовать класс EmailMessage вместо этого.
Электронное сообщение состоит из заголовков и тела. Заголовки должны быть именами и значениями в стиле RFC 5322, где имя поля и значение разделены двоеточием. Двоеточие не является частью ни имени поля, ни значения поля. Тело может быть простым текстовым сообщением, двоичным объектом или структурированной последовательностью подсообщений, каждое со своим набором заголовков и своим телом. Последний тип тела указывается типом MIME сообщения, таким как multipart/* или 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, которая поддерживает обратную совместимость с версией пакета email Python 3.2. Для получения дополнительной информации см. документацию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). (Обратите внимание, чтоis_multipart()возвращаяTrueне обязательно означает, что «msg.get_content_maintype() == ‘multipart’» вернёт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) -
Возвращает текущую полезную нагрузку, которая будет списком объектов
Message, когдаis_multipart()имеет значениеTrue, или строкой, когдаis_multipart()имеет значениеFalse. Если полезная нагрузка является списком, и вы изменяете объект списка, вы изменяете полезную нагрузку сообщения на месте.С необязательным аргументом i,
get_payload()вернёт i-й элемент полезной нагрузки, считая с нуля, еслиis_multipart()имеет значениеTrue. Если i меньше 0 или больше или равно количеству элементов в полезной нагрузке, будет поднято исключениеIndexError. Если полезная нагрузка является строкой (т.е.is_multipart()имеет значениеFalse), и задан i, будет поднято исключениеTypeError.Необязательный параметр decode — флаг, указывающий, нужно ли декодировать полезную нагрузку или нет, в соответствии с заголовком Content-Transfer-Encoding. Когда
Trueи сообщение не является многочастным, полезная нагрузка будет декодирована, если значение этого заголовка равноquoted-printableилиbase64. Если используется другой кодирование, или заголовок Content-Transfer-Encoding отсутствует, полезная нагрузка возвращается как есть (без декодирования). Во всех случаях возвращаемое значение — это данные в двоичном формате. Если сообщение является многочастным, и флаг decode имеет значениеTrue, то возвращаетсяNone. Если полезная нагрузка закодирована в base64, и она не была правильно сформирована (отсутствует заполнение, символы вне алфавита base64), то соответствующий недостаток будет добавлен к свойству дефектов сообщения (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. Клиент несёт ответственность за обеспечение соблюдения инвариантов полезной нагрузки. Необязательный параметр 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 отличаются, полезная нагрузка будет закодирована заново в output_charset. Если заголовок Content-Transfer-Encoding не существует, то полезная нагрузка будет закодирована, если необходимо, с помощью указанногоCharset, и будет добавлен заголовок с соответствующим значением. Если заголовок Content-Transfer-Encoding уже существует, предполагается, что полезная нагрузка уже правильно закодирована с использованием этого Content-Transfer-Encoding, и не изменяется.Это устаревший метод. В классе
EmailMessageего функциональность заменена параметром charset методаemail.emailmessage.EmailMessage.set_content().
-
get_charset() -
Возвращает экземпляр
Charset, связанный с полезной нагрузкой сообщения.Это устаревший метод. В классе
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 с использованиемCHARSETutf-8иLANGUAGENone.Вот пример:
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) -
Возвращает значение параметра заголовка Content-Type param в виде строки. Если у сообщения нет заголовка Content-Type или такого параметра, возвращается failobj (по умолчанию
None).Необязательный параметр header, если задан, указывает заголовок сообщения, который следует использовать вместо Content-Type.
Ключи параметров всегда сравниваются без учета регистра. Возвращаемое значение может быть либо строкой, либо кортежем из 3 элементов, если параметр был закодирован в формате 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 в кавычки, если это необходимо. Если у объекта сообщения нет заголовка Content-Type, возникает исключениеHeaderParseError.Обратите внимание, что использование этого метода отличается от удаления старого заголовка Content-Type и добавления нового с новым граничным значением через
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 каждой части структуры сообщения multipart:
>>> 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-документов. Когда
Parserобнаруживает текст после заголовков, но перед первой границей, он присваивает этот текст атрибуту preamble сообщения. КогдаGeneratorвыводит текстовое представление MIME-сообщения и находит у сообщения атрибут preamble, он записывает этот текст в область между заголовками и первой границей. Подробности см. вemail.parserиemail.generator.Обратите внимание, что если у объекта сообщения нет преамбулы, атрибут preamble будет
None.
-
epilogue -
Атрибут epilogue действует так же, как атрибут preamble, за исключением того, что он содержит текст, появляющийся между последней границей и концом сообщения.
Вам не нужно устанавливать epilogue в пустую строку, чтобы
Generatorпечатал перевод строки в конце файла.
-
defects -
Атрибут defects содержит список всех проблем, обнаруженных при разборе этого сообщения. Подробное описание возможных проблем при разборе см. в
email.errors.
-
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/email.compat32-message.html