Spec-Zone.ru › Python 3.13

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. Если 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. Однако при значении 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.message.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()

Возвращает список 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-обрамлением. Если Parser обнаруживает текст после заголовков, но перед первой строкой-границей, он присваивает этот текст атрибуту preamble сообщения. Когда Generator записывает текстовое представление MIME-сообщения и обнаруживает у сообщения атрибут preamble, он записывает этот текст между заголовками и первой строкой-границей. Подробности см. в разделах email.parser и email.generator.

Если у объекта сообщения нет преамбулы, атрибут preamble будет равен None.

epilogue

Атрибут epilogue работает так же, как атрибут preamble, но содержит текст между последней строкой-границей и концом сообщения.

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

defects

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

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

Spec-Zone.ru

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