Spec-Zone.ru › Python 3.14

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

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

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

В этом документе описано поведение при использовании политики Compat32, применяемой по умолчанию для Message. Если вы собираетесь использовать другую политику, вместо этого следует использовать класс 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), в свойство 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, из заголовка Content-Type будет удалён параметр charset (в остальном сообщение не изменится). Любое другое значение приведёт к исключению 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.message.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 с использованием 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 сообщения в виде списка. Элементы возвращаемого списка — это 2-кортежи пар ключ/значение, разделённых знаком '='. Левая часть '=' является ключом, а правая — значением. Если в параметре нет знака '=', значение представляет собой пустую строку; в противном случае значение определяется методом 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: Добавлено ключевое слово 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 каждой части структуры составного сообщения:

>>> 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, но содержит текст между последней строкой границы и концом сообщения.

Чтобы Generator добавил перевод строки в конец файла, не нужно устанавливать для эпилога пустую строку.

defects

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

© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/email.compat32-message.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API