Spec-Zone.ru › Python 3.12

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 имеет значение False, заголовок конверта включается в возвращаемую строку. По умолчанию unixfrom имеет значение 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 имеет значение 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, полезная нагрузка должна быть объектом string (который может содержать двоичную полезную нагрузку, закодированную с помощью 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. Однако для значения 8bit заголовка Content-Transfer-Encoding предпринимается попытка декодировать исходные байты с использованием 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 заголовки всегда возвращаются в том порядке, в котором они встречались в исходном сообщении или были добавлены позднее. Любой удалённый, а затем повторно добавленный заголовок всегда помещается в конец списка заголовков.

Эти семантические различия предусмотрены намеренно и ориентированы на максимальное удобство.

Обратите внимание: заголовки конверта, если они присутствуют в сообщении, не включаются в интерфейс отображения.

В модели, созданной из байтов, значения заголовков, содержащие не-ASCII байты (вопреки требованиям RFC), при получении через этот интерфейс будут представлены объектами Header с кодировкой unknown-8bit.

__len__()

Возвращает общее количество заголовков, включая повторяющиеся.

__contains__(name)

Возвращает True, если объект сообщения содержит поле с именем name. Сравнение выполняется без учёта регистра; name не должно включать завершающее двоеточие. Используется для оператора in, например:

if 'message-id' in myMessage:
   print('Message-ID:', myMessage['message-id'])
__getitem__(name)

Возвращает значение указанного поля заголовка. name не должно включать двоеточие-разделитель поля. Если заголовок отсутствует, возвращается None; исключение KeyError никогда не вызывается.

Обратите внимание: если указанное поле встречается в заголовках сообщения несколько раз, конкретное возвращаемое значение не определено. Чтобы получить значения всех существующих заголовков с таким именем, используйте метод get_all().

__setitem__(name, val)

Добавляет в сообщение заголовок с именем поля name и значением val. Поле добавляется в конец существующих полей сообщения.

Обратите внимание: этот метод не заменяет и не удаляет существующие заголовки с тем же именем. Если нужно, чтобы в сообщении остался только новый заголовок с именем поля name, сначала удалите прежний, например:

del msg['subject']
msg['subject'] = 'Python roolz!'
__delitem__(name)

Удаляет из заголовков сообщения все вхождения поля с именем name. Если указанное поле отсутствует в заголовках, исключение не вызывается.

keys()

Возвращает список имён всех полей заголовков сообщения.

values()

Возвращает список значений всех полей сообщения.

items()

Возвращает список пар из двух элементов, содержащих все поля заголовков сообщения и их значения.

get(name, failobj=None)

Возвращает значение указанного поля заголовка. Этот метод идентичен __getitem__(), за исключением того, что при отсутствии указанного заголовка возвращается необязательный аргумент failobj (по умолчанию None).

Некоторые другие полезные методы:

get_all(name, failobj=None)

Возвращает список всех значений поля с именем name. Если в сообщении нет заголовков с таким именем, возвращается failobj (по умолчанию None).

add_header(_name, _value, **_params)

Расширенная установка заголовка. Этот метод похож на __setitem__(), но позволяет задавать дополнительные параметры заголовка в виде именованных аргументов. _name — это добавляемое поле заголовка, а _value — его основное значение.

Для каждого элемента словаря именованных аргументов _params ключ используется как имя параметра, а подчёркивания заменяются дефисами (поскольку дефисы недопустимы в идентификаторах Python). Обычно параметр добавляется как key="value", если только значение не равно None — в этом случае добавляется только ключ. Если значение содержит символы, отличные от ASCII, его можно задать в виде тройки в формате (CHARSET, LANGUAGE, VALUE), где CHARSET — строка с названием кодировки для кодирования значения, LANGUAGE обычно может иметь значение None или пустой строки (другие варианты см. в RFC 2231), а VALUE — строковое значение, содержащее кодовые точки, отличные от ASCII. Если тройка не передана, а значение содержит символы, отличные от ASCII, оно автоматически кодируется в формате RFC 2231 с использованием CHARSET со значением utf-8 и LANGUAGE со значением None.

Пример:

msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')

В результате будет добавлен заголовок следующего вида:

Content-Disposition: attachment; filename="bud.gif"

Пример с символами, отличными от ASCII:

msg.add_header('Content-Disposition', 'attachment',
               filename=('iso-8859-1', '', 'Fußballer.ppt'))

Результат:

Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt"
replace_header(_name, _value)

Заменяет заголовок. Заменяет первый найденный в сообщении заголовок, соответствующий _name, сохраняя порядок заголовков и регистр имени поля. Если соответствующий заголовок не найден, вызывается исключение KeyError.

get_content_type()

Возвращает тип содержимого сообщения. Возвращаемая строка приводится к нижнему регистру и имеет вид maintype/subtype. Если в сообщении отсутствует заголовок Content-Type, возвращается тип по умолчанию, заданный методом get_default_type(). Согласно RFC 2045, сообщения всегда имеют тип по умолчанию, поэтому get_content_type() всегда возвращает значение.

RFC 2045 определяет тип содержимого сообщения по умолчанию как text/plain, если только сообщение не находится внутри контейнера multipart/digest; в этом случае типом будет message/rfc822. Если заголовок Content-Type содержит недопустимое указание типа, RFC 2045 требует использовать тип text/plain по умолчанию.

get_content_maintype()

Возвращает основной тип содержимого сообщения. Это часть maintype строки, возвращаемой методом get_content_type().

get_content_subtype()

Возвращает подтип содержимого сообщения. Это часть subtype строки, возвращаемой методом get_content_type().

get_default_type()

Возвращает тип содержимого по умолчанию. У большинства сообщений тип содержимого по умолчанию — text/plain, за исключением сообщений, являющихся подчастями контейнеров multipart/digest. Для таких подчастей тип содержимого по умолчанию — message/rfc822.

set_default_type(ctype)

Задаёт тип содержимого по умолчанию. ctype должен иметь значение text/plain или message/rfc822, хотя это условие не проверяется. Тип содержимого по умолчанию не сохраняется в заголовке Content-Type.

get_params(failobj=None, header='content-type', unquote=True)

Возвращает параметры Content-Type сообщения в виде списка. Элементы возвращаемого списка — это пары «ключ/значение», разделённые знаком '='. Левая часть '=' является ключом, а правая — значением. Если в параметре нет знака '=', значением будет пустая строка; в противном случае значение описано в get_param() и снимается с кавычек, если необязательный аргумент unquote имеет значение True (по умолчанию).

Необязательный аргумент failobj задаёт объект, который возвращается, если заголовок Content-Type отсутствует. Необязательный аргумент header задаёт заголовок, который следует искать вместо Content-Type.

Это устаревший метод. В классе EmailMessage его функциональность заменена свойством params отдельных объектов заголовков, возвращаемых методами доступа к заголовкам.

get_param(param, failobj=None, header='content-type', unquote=True)

Возвращает значение параметра param заголовка Content-Type в виде строки. Если в сообщении нет заголовка Content-Type или указанного параметра, возвращается failobj (по умолчанию None).

Если задан необязательный аргумент header, он указывает заголовок сообщения, который следует использовать вместо Content-Type.

Сравнение ключей параметров всегда выполняется без учёта регистра. Возвращаемое значение может быть строкой или 3-элементным кортежем, если параметр закодирован по RFC 2231. В случае кортежа элементы значения имеют вид (CHARSET, LANGUAGE, VALUE). Обратите внимание: и CHARSET, и LANGUAGE могут иметь значение None; в этом случае следует считать, что VALUE закодировано в кодировке us-ascii. Обычно LANGUAGE можно игнорировать.

Если приложению не важно, был ли параметр закодирован согласно RFC 2231, значение параметра можно привести к обычному виду, вызвав email.utils.collapse_rfc2231_value() и передав ему возвращаемое значение get_param(). Если значение представляет собой кортеж, метод вернёт подходящую строку Юникода после декодирования; в противном случае он вернёт исходную строку без кавычек. Например:

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-документа допускает наличие текста между пустой строкой после заголовков и первой строкой-границей составной части. Обычно этот текст не виден в почтовых программах, поддерживающих 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/email.compat32-message.html

Spec-Zone.ru

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