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, несоответствующие данные будут заменены точками кода юникода «неизвестный символ». (См. также
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. Будет поднято исключениеIndexError, если i меньше 0 или больше или равно числу элементов в полезной нагрузке. Если полезная нагрузка является строкой (т.е.is_multipart()равноFalse) и задан i, то поднимается исключениеTypeError.Необязательный decode — флаг, указывающий, должна ли полезная нагрузка быть декодирована или нет, в соответствии с заголовком Content-Transfer-Encoding. Когда
Trueи сообщение не является составным, полезная нагрузка будет декодирована, если значение этого заголовка равноquoted-printableилиbase64. Если используется какой-то другой кодирование, или заголовок Content-Transfer-Encoding отсутствует, полезная нагрузка возвращается как есть (не декодированная). Во всех случаях возвращаемое значение — это двоичные данные. Если сообщение составное, и флаг decode равенTrue, то возвращаетсяNone. Если полезная нагрузка закодирована base64, и она была не полностью сформирована (не хватает заполнения, символы вне алфавита base64), то соответствующий дефект будет добавлен к свойству defects сообщения (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() -
Возвращает список кортежей из 2-х элементов, содержащих все заголовки полей и значения сообщения.
-
-
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.
Ключи параметров всегда сравниваются без учёта регистра. Возвращаемое значение может быть либо строкой, либо тройкой, если параметр был закодирован по 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 и добавления нового с новым разделителем через
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, или он не является типа text основного MIME-типа, то этот элемент в возвращаемом списке будет 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.10/library/email.compat32-message.html