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. Значения словаря — это строки с дополнительными методами. Заголовки хранятся и возвращаются в форме с сохранением регистра, но имена полей сопоставляются без учёта регистра. Ключи упорядочены, но, в отличие от реального словаря, могут быть дубликатами. Предоставляются дополнительные методы для работы с заголовками, имеющими дублирующиеся ключи.
Наполнитель — это либо строка или байтовый объект в случае простых объектов сообщений, либо список объектов EmailMessage в случае документов контейнеров MIME, таких как multipart/* и message/rfc822.
-
class email.message.EmailMessage(policy=default) -
Если policy указан, используйте правила, которые он задаёт, для обновления и сериализации представления сообщения. Если policy не задан, используйте политику
default, которая следует правилам RFC для электронной почты, за исключением конечных строк (вместо предписанных RFC\r\n, она использует стандартные Python\nконечные строки). Для получения дополнительной информации см.policyдокументацию.-
as_string(unixfrom=False, maxheaderlen=None, policy=None) -
Возвращает всё сообщение, сглаженное в виде строки. Когда необязательный параметр unixfrom равен true, заголовок конверта включён в возвращаемую строку. unixfrom по умолчанию равен
False. Для обратной совместимости с базовым классомMessageпринимается maxheaderlen, но по умолчанию равенNone, что означает, что длина строки по умолчанию контролируется параметромmax_line_lengthполитики. Аргумент policy может быть использован для переопределения политики, полученной из экземпляра сообщения. Это можно использовать для управления некоторым форматированием, создаваемым методом, так как указанная policy будет передана вGenerator.Сглаживание сообщения может вызвать изменения в
EmailMessage, если для завершения преобразования в строку необходимо заполнить значения по умолчанию (например, могут быть сгенерированы или изменены границы MIME).Обратите внимание, что этот метод предоставляется для удобства и может не быть наиболее подходящим способом сериализации сообщений в вашем приложении, особенно если вы работаете с несколькими сообщениями. См.
email.generator.Generatorдля более гибкого API для сериализации сообщений. Также обратите внимание, что этот метод ограничен созданием сериализованных сообщений, как «чистые 7 бит», когдаutf8равенFalse, что является значением по умолчанию.Изменено в версии 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).Обратите внимание, что этот метод предоставляется для удобства и может не быть наиболее подходящим способом сериализации сообщений в вашем приложении, особенно если вы работаете с несколькими сообщениями. См.
email.generator.BytesGeneratorдля более гибкого API для сериализации сообщений.
-
__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 возвращается, если заголовок с заданным именем отсутствует (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 с использованиемCHARSETutf-8иLANGUAGENone.Вот пример:
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 должны быть строками. По умолчанию используется
utf8charset иNoneдля language.Если replace равно
False(по умолчанию), заголовок перемещается в конец списка заголовков. Если replace равноTrue, заголовок будет обновлён на месте.Использование параметра requote с объектами
EmailMessageустарело.Обратите внимание, что к существующим значениям параметров заголовков можно получить доступ через атрибут
paramsзначения заголовка (например,msg['Content-Type'].params['charset']).Изменено в версии 3.4:
replacekeyword был добавлен.
-
-
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 и добавления нового с новым значением boundary через
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 каждой части структуры multipart-сообщения:
>>> 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.Если ни один из кандидатов не соответствует ни одному из предпочтений в 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), так и для вложений по умолчанию (Content-Disposition: inline), передав соответствующие параметры вcontent_manager.
-
clear() -
Удалите полезную нагрузку и все заголовки.
-
clear_content() -
Удалите полезную нагрузку и все заголовки !Content-, оставив все остальные заголовки нетронутыми в исходном порядке.
EmailMessageобъекты имеют следующие атрибуты экземпляров:-
preamble -
Формат MIME-документа допускает некотоый текст между пустой строкой после заголовков и первой строкой разделителя multipart. Обычно этот текст не виден в программе для чтения почты, поддерживающей MIME, потому что он находится вне стандартного MIME-бронирования. Однако при просмотре исходного текста сообщения или при просмотре сообщения в программе для чтения почты, не поддерживающей MIME, этот текст может стать видимым.
Атрибут preamble содержит этот ведущий дополнительный текст для 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/email.message.html