email.message: Представление электронного письма
Исходный код: Lib/email/message.py
Добавлено в версии 3.6: [1]
Центральным классом пакета email является класс EmailMessage, импортируемый из модуля email.message. Это базовый класс объектной модели email. EmailMessage предоставляет основные функции для установки и получения полей заголовка, доступа к телам сообщений, а также создания и изменения структурированных сообщений.
Электронное письмо состоит из заголовков и полезной нагрузки (также называемой содержимым). Заголовки представляют собой имена и значения полей в формате RFC 5322 или RFC 6532, где имя поля и его значение разделены двоеточием. Двоеточие не является частью ни имени поля, ни его значения. Полезная нагрузка может быть простым текстовым сообщением, двоичным объектом или структурированной последовательностью вложенных сообщений, каждое из которых имеет собственный набор заголовков и собственную полезную нагрузку. На последний тип полезной нагрузки указывает MIME-тип сообщения, например multipart/* или message/rfc822.
Концептуальная модель, предоставляемая объектом EmailMessage, представляет собой упорядоченный словарь заголовков и связанную с ним полезную нагрузку, представляющую тело сообщения в формате RFC 5322, которое может быть списком вложенных объектов EmailMessage. Помимо обычных методов словаря для доступа к именам и значениям заголовков, имеются методы для получения специализированной информации из заголовков (например, типа содержимого MIME), работы с полезной нагрузкой, создания сериализованной версии сообщения и рекурсивного обхода дерева объектов.
Интерфейс объекта EmailMessage, подобный словарю, индексируется по именам заголовков, которые должны быть значениями ASCII. Значения словаря — это строки с дополнительными методами. Заголовки сохраняются и возвращаются с исходным регистром, но при сопоставлении имён полей регистр не учитывается. Ключи упорядочены, однако, в отличие от настоящего словаря, могут повторяться. Для работы с заголовками, имеющими повторяющиеся ключи, предусмотрены дополнительные методы.
Полезная нагрузка — это либо строка или объект bytes в случае простых объектов сообщений, либо список объектов EmailMessage для MIME-контейнеров, таких как multipart/* и message/rfc822.
-
class email.message.EmailMessage(policy=default) -
Если указана policy, используйте заданные ею правила для обновления и сериализации представления сообщения. Если policy не задана, используйте политику
default, которая следует правилам RFC для электронной почты, за исключением окончаний строк (вместо предписанных RFC\r\nиспользуются окончания строк\n, принятые в стандартной библиотеке Python). Дополнительные сведения см. в документации поpolicy.-
as_string(unixfrom=False, maxheaderlen=None, policy=None) -
Возвращает всё сообщение, сведённое в строку. Если необязательный параметр unixfrom имеет значение true, в возвращаемую строку включается заголовок конверта. По умолчанию unixfrom равен
False. Для обратной совместимости с базовым классомMessageпринимается параметр maxheaderlen, по умолчанию равныйNone; это означает, что по умолчанию длина строки определяется значениемmax_line_lengthполитики. Аргумент policy можно использовать, чтобы переопределить политику по умолчанию, полученную из экземпляра сообщения. Это позволяет управлять некоторыми аспектами форматирования, выполняемого методом, поскольку указанная policy будет передана вGenerator.Сведение сообщения может привести к изменениям в
EmailMessage, если для преобразования в строку необходимо заполнить значения по умолчанию (например, границы MIME могут быть созданы или изменены).Обратите внимание: этот метод предоставлен для удобства и может быть не самым полезным способом сериализации сообщений в вашем приложении, особенно если вы работаете с несколькими сообщениями. Более гибкий API для сериализации сообщений см. в
email.generator.Generator. Также обратите внимание, что еслиutf8имеет значениеFalse, что является значением по умолчанию, этот метод ограничен созданием сообщений, сериализованных в формате «7 bit clean».Изменено в версии 3.6: поведение по умолчанию, если maxheaderlen не указан, изменено: вместо значения 0 теперь используется значение max_line_length из политики.
-
__str__() -
Эквивалентен
as_string(policy=self.policy.clone(utf8=True)). Позволяетstr(msg)создавать строку с сериализованным сообщением в удобочитаемом формате.Изменено в версии 3.4: метод был изменён и теперь использует
utf8=True, создавая представление сообщения, подобное RFC 6531, вместо того чтобы быть прямым псевдонимомas_string().
-
as_bytes(unixfrom=False, policy=None) -
Возвращает всё сообщение, сведённое в объект bytes. Если необязательный параметр unixfrom имеет значение true, в возвращаемую строку включается заголовок конверта. По умолчанию unixfrom равен
False. Аргумент policy можно использовать, чтобы переопределить политику по умолчанию, полученную из экземпляра сообщения. Это позволяет управлять некоторыми аспектами форматирования, выполняемого методом, поскольку указанная policy будет передана вBytesGenerator.Сведение сообщения может привести к изменениям в
EmailMessage, если для преобразования в строку необходимо заполнить значения по умолчанию (например, границы MIME могут быть созданы или изменены).Обратите внимание: этот метод предоставлен для удобства и может быть не самым полезным способом сериализации сообщений в вашем приложении, особенно если вы работаете с несколькими сообщениями. Более гибкий API для сериализации сообщений см. в
email.generator.BytesGenerator.
-
__bytes__() -
Эквивалентен
as_bytes(). Позволяетbytes(msg)создавать объект bytes, содержащий сериализованное сообщение.
-
is_multipart() -
Возвращает
True, если полезная нагрузка сообщения представляет собой список объектов-подсообщенийEmailMessage; в противном случае возвращаетFalse. Еслиis_multipart()возвращаетFalse, полезная нагрузка должна быть строковым объектом (который может содержать двоичные данные, закодированные методом CTE). Обратите внимание: еслиis_multipart()возвращаетTrue, это не обязательно означает, что «msg.get_content_maintype() == ‘multipart’» вернётTrue. Например,is_multipartвернётTrue, еслиEmailMessageимеет типmessage/rfc822.
-
set_unixfrom(unixfrom) -
Задаёт заголовок конверта сообщения равным unixfrom, который должен быть строкой. (Краткое описание этого заголовка см. в
mboxMessage.)
-
get_unixfrom() -
Возвращает заголовок конверта сообщения. Если заголовок конверта ни разу не задавался, по умолчанию возвращается
None.
Следующие методы реализуют интерфейс, подобный отображению, для доступа к заголовкам сообщения. Обратите внимание: эти методы семантически отличаются от обычного интерфейса отображения (то есть словаря). Например, в словаре нет повторяющихся ключей, но здесь могут быть повторяющиеся заголовки сообщений. Кроме того, для ключей, возвращаемых методом
keys(), порядок не гарантируется, тогда как в объектеEmailMessageзаголовки всегда возвращаются в том порядке, в котором они присутствовали в исходном сообщении или были добавлены позднее. Любой удалённый, а затем добавленный заголовок всегда помещается в конец списка заголовков.Эти семантические отличия сделаны намеренно и ориентированы на удобство в наиболее распространённых сценариях использования.
Обратите внимание: заголовок конверта, если он есть в сообщении, не включается в интерфейс отображения.
-
__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(), чтобы получить значения всех существующих заголовков с именем name.При использовании стандартных политик (не
compat32) возвращаемое значение является экземпляром подклассаemail.headerregistry.BaseHeader.
-
__setitem__(name, val) -
Добавляет в сообщение заголовок с именем поля name и значением val. Поле добавляется в конец имеющихся заголовков сообщения.
Обратите внимание: этот метод не перезаписывает и не удаляет имеющиеся заголовки с таким же именем. Если вы хотите убедиться, что в сообщении присутствует только что добавленный заголовок с именем поля name, сначала удалите это поле, например:
del msg['subject'] msg['subject'] = 'Python roolz!'
Если
policyопределяет некоторые заголовки как уникальные (как это делают стандартные политики), этот метод может возбуждать исключениеValueErrorпри попытке присвоить значение такому заголовку, если он уже существует. Такое поведение предусмотрено намеренно для единообразия, но не полагайтесь на него: в будущем мы можем изменить поведение так, чтобы при таком присваивании существующий заголовок автоматически удалялся.
-
__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'))
-
replace_header(_name, _value) -
Заменяет заголовок. Заменяет первый заголовок сообщения, совпадающий с _name, сохраняя порядок заголовков и регистр букв в имени исходного заголовка. Если подходящий заголовок не найден, возбуждается исключение
KeyError.
-
get_content_type() -
Возвращает тип содержимого сообщения, приведённый к нижнему регистру и представленный в форме maintype/subtype. Если в сообщении нет заголовка Content-Type, возвращается значение, возвращаемое методом
get_default_type(). Если заголовок Content-Type недопустим, возвращаетсяtext/plain.(Согласно 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_content_type, если в сообщении отсутствует заголовок Content-Type.
-
set_param(param, value, header='Content-Type', requote=True, charset=None, language='', replace=False) -
Задаёт параметр в заголовке Content-Type. Если параметр уже есть в заголовке, его значение заменяется на value. Если header равен
Content-Type(значение по умолчанию), а заголовок ещё отсутствует в сообщении, он добавляется, ему присваивается значение text/plain, после чего добавляется новое значение параметра. Необязательный параметр header задаёт альтернативный заголовок вместо Content-Type.Если значение содержит символы, отличные от ASCII, набор символов и язык можно явно указать с помощью необязательных параметров charset и language. Необязательный параметр language задаёт язык RFC 2231; по умолчанию используется пустая строка. Значения обоих параметров — charset и language — должны быть строками. По умолчанию для charset используется
utf8, а для language —None.Если replace равен
False(значение по умолчанию), заголовок перемещается в конец списка заголовков. Если replace равенTrue, заголовок обновляется на месте.Использование параметра requote с объектами
EmailMessageустарело.Обратите внимание: существующие значения параметров заголовков можно получить через атрибут
paramsзначения заголовка (например,msg['Content-Type'].params['charset']).Изменено в версии 3.4: добавлен ключевой аргумент
replace.
-
del_param(param, header='content-type', requote=True) -
Полностью удаляет указанный параметр из заголовка Content-Type. Заголовок перезаписывается на месте без параметра и его значения. Необязательный параметр header задаёт альтернативный заголовок вместо Content-Type.
Использование параметра requote с объектами
EmailMessageустарело.
-
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 в списке заголовков.
-
get_content_charset(failobj=None) -
Возвращает параметр
charsetзаголовка Content-Type, приведённый к нижнему регистру. Если заголовок Content-Type отсутствует или в нём нет параметраcharset, возвращается failobj.
-
get_charsets(failobj=None) -
Возвращает список названий наборов символов в сообщении. Если сообщение имеет тип multipart, список будет содержать по одному элементу для каждой части полезной нагрузки; в противном случае его длина будет равна 1.
Каждый элемент списка — строка со значением параметра
charsetзаголовка Content-Type соответствующей части. Если у части нет заголовка Content-Type или параметраcharset, либо её основной тип MIME не равен text, соответствующим элементом возвращаемого списка будет failobj.
-
is_attachment() -
Возвращает
True, если присутствует заголовок Content-Disposition и его значение (без учёта регистра) равноattachment; в противном случае возвращаетFalse.Изменено в версии 3.4.2: теперь is_attachment является методом, а не свойством, для единообразия с
is_multipart().
-
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:>>> from email.iterators import _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выполняет обход подчастей.
-
-
get_body(preferencelist=('related', 'html', 'plain')) -
Возвращает часть MIME, которая является наиболее подходящим кандидатом на роль «тела» сообщения.
preferencelist должна быть последовательностью строк из набора
related,htmlиplainи указывает порядок предпочтения типа содержимого возвращаемой части.Начинает поиск подходящих кандидатов с объекта, для которого вызван метод
get_body.Если
relatedне входит в preferencelist, корневая часть (или подчасть корневой части) любого встреченного связанного объекта рассматривается как кандидат, если эта часть соответствует одному из предпочтений.При обнаружении
multipart/relatedпроверяется параметрstart. Если найдена часть с соответствующим Content-ID, при поиске подходящих кандидатов рассматривается только она. В противном случае рассматривается только первая часть (корневая часть по умолчанию) объектаmultipart/related.Если у части есть заголовок Content-Disposition, она считается подходящим кандидатом, только если значение заголовка равно
inline.Если ни один из кандидатов не соответствует предпочтениям в preferencelist, возвращается
None.Примечания: (1) Для большинства приложений имеют смысл только следующие сочетания preferencelist:
('plain',),('html', 'plain')и значение по умолчанию('related', 'html', 'plain'). (2) Поскольку поиск начинается с объекта, для которого вызванget_body, вызовget_bodyдляmultipart/relatedвернёт сам объект, если только preferencelist не имеет значения, отличного от значения по умолчанию. (3) Сообщения (или части сообщений), для которых не указан Content-Type либо заголовок Content-Type которых некорректен, будут считаться имеющими типtext/plain, что иногда может приводить к неожиданным результатам при вызовеget_body.
-
iter_attachments() -
Возвращает итератор по всем непосредственным дочерним частям сообщения, которые не являются кандидатами на роль «тела». То есть пропускает первое вхождение каждого из типов
text/plain,text/html,multipart/relatedилиmultipart/alternative(если они явно не помечены как вложения с помощью Content-Disposition: attachment) и возвращает все остальные части. При непосредственном вызове дляmultipart/relatedвозвращает итератор по всем связанным частям, кроме корневой (то есть части, на которую указывает параметрstart, или первой части, если параметрstartотсутствует либо параметрstartне соответствует Content-ID ни одной из частей). При непосредственном вызове дляmultipart/alternativeили объекта, не являющегосяmultipart, возвращает пустой итератор.
-
iter_parts() -
Возвращает итератор по всем непосредственным дочерним частям сообщения. Для объекта, не являющегося
multipart, итератор будет пустым. (См. такжеwalk().)
-
get_content(*args, content_manager=None, **kw) -
Вызывает метод
get_content()объекта content_manager, передавая ему self в качестве объекта сообщения и передавая все остальные аргументы и именованные аргументы как дополнительные аргументы. Если content_manager не указан, используетсяcontent_manager, заданный текущим объектомpolicy.
-
set_content(*args, content_manager=None, **kw) -
Вызывает метод
set_content()объекта content_manager, передавая ему self в качестве объекта сообщения и передавая все остальные аргументы и именованные аргументы как дополнительные аргументы. Если content_manager не указан, используетсяcontent_manager, заданный текущим объектомpolicy.
-
Преобразует сообщение, не являющееся
multipart, в сообщение типаmultipart/related, перемещая все имеющиеся заголовки Content- и содержимое в новую первую часть объектаmultipart. Если указан boundary, использует его в качестве строки-разделителя multipart; в противном случае оставляет создание разделителя автоматическим и выполняемым при необходимости (например, при сериализации сообщения).
-
make_alternative(boundary=None) -
Преобразует сообщение, не являющееся
multipart, или сообщение типаmultipart/relatedв сообщение типаmultipart/alternative, перемещая все имеющиеся заголовки Content- и содержимое в новую первую часть объектаmultipart. Если указан boundary, использует его в качестве строки-разделителя multipart; в противном случае оставляет создание разделителя автоматическим и выполняемым при необходимости (например, при сериализации сообщения).
-
make_mixed(boundary=None) -
Преобразует сообщение, не являющееся
multipart, сообщение типаmultipart/relatedили сообщение типаmultipart-alternativeв сообщение типаmultipart/mixed, перемещая все имеющиеся заголовки Content- и содержимое в новую первую часть объектаmultipart. Если указан boundary, использует его в качестве строки-разделителя multipart; в противном случае оставляет создание разделителя автоматическим и выполняемым при необходимости (например, при сериализации сообщения).
-
Если сообщение имеет тип
multipart/related, создаёт новый объект сообщения, передаёт все аргументы его методуset_content()иattach()его к объектуmultipart. Если сообщение не являетсяmultipart, вызываетmake_related(), а затем выполняет описанные выше действия. Если сообщение относится к любому другому типуmultipart, вызывает исключениеTypeError. Если content_manager не указан, используетсяcontent_manager, заданный текущим объектомpolicy. Если у добавленной части нет заголовка Content-Disposition, добавляет его со значениемinline.
-
add_alternative(*args, content_manager=None, **kw) -
Если сообщение имеет тип
multipart/alternative, создаёт новый объект сообщения, передаёт все аргументы его методуset_content()иattach()его к объектуmultipart. Если сообщение не являетсяmultipartили имеет типmultipart/related, вызываетmake_alternative(), а затем выполняет описанные выше действия. Если сообщение относится к любому другому типуmultipart, вызывает исключениеTypeError. Если content_manager не указан, используетсяcontent_manager, заданный текущим объектомpolicy.
-
add_attachment(*args, content_manager=None, **kw) -
Если сообщение имеет тип
multipart/mixed, создаёт новый объект сообщения, передаёт все аргументы его методуset_content()иattach()его к объектуmultipart. Если сообщение не являетсяmultipart, имеет типmultipart/relatedилиmultipart/alternative, вызываетmake_mixed(), а затем выполняет описанные выше действия. Если content_manager не указан, используетсяcontent_manager, заданный текущим объектомpolicy. Если у добавленной части нет заголовка Content-Disposition, добавляет его со значениемattachment. Этот метод можно использовать как для явных вложений (Content-Disposition: attachment), так и для вложенийinline(Content-Disposition: inline), передав соответствующие параметры объектуcontent_manager.
-
clear() -
Удаляет содержимое и все заголовки.
-
clear_content() -
Удаляет содержимое и все заголовки !Content-, сохраняя все остальные заголовки без изменений и в исходном порядке.
У объектов
EmailMessageимеются следующие атрибуты экземпляра:-
preamble -
Формат MIME-документа допускает наличие текста между пустой строкой после заголовков и первой строкой-разделителем multipart. Обычно этот текст не виден в почтовых программах, поддерживающих MIME, поскольку он находится за пределами стандартной MIME-области. Однако при просмотре исходного текста сообщения или при просмотре сообщения в программе, не поддерживающей MIME, этот текст может стать видимым.
Атрибут preamble содержит этот дополнительный текст перед MIME-областью в MIME-документах. Когда
Parserобнаруживает текст после заголовков, но перед первой строкой-разделителем, он присваивает этот текст атрибуту сообщения preamble. КогдаGeneratorзаписывает текстовое представление MIME-сообщения и обнаруживает у сообщения атрибут preamble, он записывает этот текст между заголовками и первым разделителем. Подробности см. в разделахemail.parserиemail.generator.Если у объекта сообщения нет преамбулы, атрибут preamble будет иметь значение
None.
-
epilogue -
Атрибут epilogue действует так же, как атрибут preamble, но содержит текст, расположенный между последним разделителем и концом сообщения. Как и
preamble, если текст эпилога отсутствует, этот атрибут будет иметь значениеNone.
-
defects -
Атрибут defects содержит список всех проблем, обнаруженных при разборе этого сообщения. Подробное описание возможных ошибок разбора см. в разделе
email.errors.
-
-
class email.message.MIMEPart(policy=default) -
Этот класс представляет подчасть MIME-сообщения. Он идентичен
EmailMessage, за исключением того, что при вызовеset_content()не добавляются заголовки MIME-Version, поскольку подчастям не нужны собственные заголовки MIME-Version.
Сноски
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/email.message.html