email.message.Message: Представление электронного сообщения с использованием API compat32
Класс Message очень похож на класс EmailMessage, без методов, добавленных этим классом, и с немного отличающимся по умолчанию поведением некоторых других методов. Мы также документируем здесь некоторые методы, которые, хотя и поддерживаются классом EmailMessage, не рекомендуются, если вы не работаете с устаревшим кодом.
Философия и структура этих двух классов в остальном одинаковы.
В данном документе описывается поведение по умолчанию (для Message) политики Compat32. Если вы собираетесь использовать другую политику, вам следует использовать класс EmailMessage вместо него.
Электронное сообщение состоит из заголовков и данных. Заголовки должны быть именами и значениями в стиле RFC 5233, где имя поля и значение разделены двоеточием. Двоеточие не является частью ни имени поля, ни значения поля. Данные могут быть простым текстовым сообщением, двоичным объектом или структурированной последовательностью подсообщений, каждое из которых имеет свой набор заголовков и свои данные. Последний тип данных указывается типом 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. Будет поднята ошибка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 уже существует, предполагается, что полезная нагрузка уже правильно закодирована с использованием этого заголовка, и не будет изменена.Это устаревший метод. В классе
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) -
Возвращает значение параметра param заголовка Content-Type в виде строки. Если у сообщения нет заголовка 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(). Это вернёт соответствующую декодированную строку Unicode, если значение является кортежем, или исходную строку без кавычек, если это не так. Например:rawparam = msg.get_param('foo') param = email.utils.collapse_rfc2231_value(rawparam)В любом случае значение параметра (либо возвращённая строка, либо элемент
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:
replacekeyword был добавлен.
-
-
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, или не является типа 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 для MIME-документов. Когда
Parserобнаруживает некоторый текст после заголовков, но перед первой строкой разделителя, он присваивает этот текст атрибуту preamble сообщения. КогдаGeneratorзаписывает текстовое представление MIME-сообщения и обнаруживает, что у сообщения есть атрибут preamble, он запишет этот текст в область между заголовками и первой строкой разделителя. Подробнее см.email.parserиemail.generator.Обратите внимание, что если у объекта сообщения нет преамбулы, атрибут preamble будет
None.
-
epilogue -
Атрибут epilogue действует аналогично атрибуту preamble, за исключением того, что он содержит текст, который появляется между последним разделителем и концом сообщения.
Вам не нужно устанавливать epilogue в пустую строку, чтобы
Generatorпечатал перенос строки в конце файла.
-
defects -
Атрибут defects содержит список всех проблем, обнаруженных при разборе этого сообщения. См.
email.errorsдля подробного описания возможных дефектов разбора.
-
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/email.compat32-message.html