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)В любом случае значение параметра (возвращённая строка или элемент
VALUE3-кортежа) всегда возвращается без кавычек, если только для 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