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. Значения словаря - это строки с некоторыми дополнительными методами. Заголовки хранятся и возвращаются в форме с сохранением регистра, но имена полей сопоставляются без учета регистра. В отличие от настоящего словаря, ключи упорядочены и могут быть дублированы. Для работы с заголовками, содержащими дубликаты ключей, предусмотрены дополнительные методы.
Нагрузка payload представляет собой либо строку, либо объект байтов, в случае простых объектов сообщений, или список объектов 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 может быть использован для переопределения политики по умолчанию, полученной от экземпляра сообщения. Это может быть использовано для управления некоторым форматированием, производимым методом, поскольку указанная политика будет передана в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 может быть использован для переопределения политики по умолчанию, полученной от экземпляра сообщения. Это можно использовать для управления некоторым форматированием, производимым методом, поскольку указанная политика будет передана в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
, если заголовок конверта никогда не устанавливался.
Следующие методы реализуют интерфейс типа mapping для доступа к заголовкам сообщения. Обратите внимание, что существуют некоторые семантические различия между этими методами и обычным интерфейсом отображения (т.е. словарем). Например, в словаре нет дубликатов ключей, а здесь могут быть дубликаты заголовков сообщений. Кроме того, в словарях нет гарантированного порядка ключей, возвращаемых
keys()
, но в объектеEmailMessage
заголовки всегда возвращаются в том порядке, в котором они появились в исходном сообщении, или в котором они были добавлены к сообщению позже. Любой заголовок, удаленный, а затем добавленный заново, всегда добавляется в конец списка заголовков.Эти семантические различия являются намеренными и направлены в сторону удобства в наиболее распространенных случаях использования.
Обратите внимание, что во всех случаях любой заголовок конверта, присутствующий в сообщении, не включается в интерфейс отображения.
-
__len__
()¶ Возвращает общее количество заголовков, включая дубликаты.
-
__contains__
(name)¶ Возвращает
True
, если объект сообщения имеет поле с именем name. Поиск осуществляется без учета регистра, и name не включает двоеточие. Используется для оператораin
. Например:if 'message-id' in myMessage: print('Message-ID:', myMessage['message-id'])
-
__getitem__
(name)¶ Возвращает значение именованного поля заголовка. Имя не включает разделитель полей двоеточие. Если заголовок отсутствует, возвращается
None
;KeyError
никогда не возвращается.Обратите внимание, что если именованное поле встречается в заголовках сообщения более одного раза, то какое именно из значений этого поля будет возвращено, не определено. Используйте метод
get_all()
для получения значений всех имеющихся заголовков с именем name.При использовании стандартных (не``compat32``) политик возвращаемое значение является экземпляром подкласса
email.headerregistry.BaseHeader
.
-
__setitem__
(name, val)¶ Добавляет заголовок к сообщению с именем поля name и значением val. Поле добавляется в конец существующих заголовков сообщения.
Обратите внимание, что при этом не перезаписывается или удаляется любой существующий заголовок с тем же именем. Если вы хотите, чтобы новый заголовок был единственным в сообщении с именем поля имя, сначала удалите это поле, например:
del msg['subject'] msg['subject'] = 'Python roolz!'
Если
policy
определяет определенные заголовки как уникальные (как это делают стандартные политики), этот метод может вызвать ошибкуValueError
при попытке присвоить значение такому заголовку, когда он уже существует. Такое поведение намеренно для обеспечения последовательности, но не стоит на него полагаться, так как в будущем мы можем решить сделать так, чтобы такие присваивания приводили к автоматическому удалению существующего заголовка.
-
__delitem__
(name)¶ Удалить все вхождения поля с именем name из заголовков сообщения. Исключение не возникает, если названное поле не присутствует в заголовках.
-
keys
()¶ Возвращает список всех имен полей заголовков сообщения.
-
values
()¶ Возвращает список всех значений полей сообщения.
-
items
()¶ Возвращает список из двух кортежей, содержащих все заголовки и значения полей сообщения.
-
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, используя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)¶ Заменить заголовок. Заменяет первый найденный в сообщении заголовок, который соответствует _имя, сохраняя порядок заголовков и регистр имен полей исходного заголовка. Если подходящего заголовка не найдено, выдает сообщение
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 должны быть строками. По умолчанию используется
utf8
charset иNone
для language.Если 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. Возникает ошибкаHeaderParseError
, если объект сообщения не имеет заголовка Content-Type.Обратите внимание, что использование этого метода несколько отличается от удаления старого заголовка 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, используйте его в качестве строки границы в многочастном сообщении, иначе оставьте границу для автоматического создания, когда она потребуется (например, при сериализации сообщения).
-
make_alternative
(boundary=None)¶ Преобразовать не``multipart`` или
multipart/related
вmultipart/alternative
, перемещая все существующие заголовки Content- и полезную нагрузку в (новую) первую частьmultipart
. Если указано boundary, используйте его в качестве строки границы в многочастной структуре, в противном случае оставьте границу для автоматического создания, когда она потребуется (например, при сериализации сообщения).
-
make_mixed
(boundary=None)¶ Преобразовать не``multipart``,
multipart/related
илиmultipart-alternative
вmultipart/mixed
, перемещая все существующие заголовки Content- и полезную нагрузку в (новую) первую частьmultipart
. Если указано boundary, используйте его в качестве строки границы в многочастной структуре, в противном случае оставьте границу для автоматического создания, когда она потребуется (например, при сериализации сообщения).
Если сообщение является
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 допускает наличие некоторого текста между пустой строкой, следующей за заголовками, и первой многочастной граничной строкой. Обычно этот текст никогда не виден в программе чтения почты с поддержкой 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
, за исключением того, что при вызове MIME-Version не добавляются заголовкиset_content()
, поскольку подчасти не нуждаются в собственных заголовках MIME-Version.
Сноски
- 1
Первоначально был добавлен в 3.4 как provisional module. Документация для унаследованного класса сообщений перемещена в email.message.Message: Представление сообщения электронной почты с помощью API compat32.