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. Значения словаря представляют собой строки с некоторыми дополнительными методами. Заголовки сохраняются и возвращаются в форме с сохранением регистра, но имена полей сопоставляются без учета регистра. Ключи упорядочены, но, в отличие от реального dict, могут быть дубликаты. Для работы с заголовками, содержащими повторяющиеся ключи, предусмотрены дополнительные методы.
Полезная нагрузка * представляет собой объект string или bytes, в случае простых объектов message, или список объектов EmailMessage
для документов-контейнеров MIME, таких как multipart/* и message/rfc822 объекты message.
- class email.message.EmailMessage(policy=default)¶
Если указана политика, используйте указанные в ней правила для обновления и сериализации представления сообщения. Если параметр policy не задан, используйте политику
default
, которая соответствует правилам запроса предложений по электронной почте, за исключением окончаний строк (вместо предписанного 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).Обратите внимание, что этот метод предоставляется для удобства и может оказаться не самым полезным способом сериализации сообщений в вашем приложении, особенно если вы имеете дело с несколькими сообщениями. Более гибкий API для сериализации сообщений приведен в разделе
email.generator.Generator
. Обратите также внимание, что этот метод ограничен созданием сообщений, упорядоченных как «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).Обратите внимание, что этот метод предоставляется для удобства и может оказаться не самым полезным способом сериализации сообщений в вашем приложении, особенно если вы имеете дело с несколькими сообщениями. Более гибкий 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_main type() == „multipart“» вернетTrue
. Например,is_multipart
вернетTrue
, еслиEmailMessage
имеет типmessage/rfc822
.
- set_unixfrom(unixfrom)¶
Задайте для заголовка конверта сообщения значение unixfrom, которое должно быть строкой. (Краткое описание этого заголовка смотрите в
mboxMessage
).
- get_unixfrom()¶
Возвращает заголовок конверта сообщения. По умолчанию используется значение
None
, если заголовок конверта никогда не задавался.
Следующие методы реализуют интерфейс, подобный отображению, для доступа к заголовкам сообщений. Обратите внимание, что между этими методами и обычным интерфейсом отображения (т.е. словарем) есть некоторые семантические различия. Например, в словаре нет повторяющихся ключей, но здесь могут быть повторяющиеся заголовки сообщений. Кроме того, в словарях нет гарантированного порядка для ключей, возвращаемых
keys()
, но в объектеEmailMessage
заголовки всегда возвращаются в том порядке, в котором они появились в исходном сообщении или в котором они были добавлены в сообщение позже. Любой заголовок, удаленный, а затем повторно добавленный, всегда добавляется в конец списка заголовков.Эти семантические различия являются намеренными и направлены на удобство в наиболее распространенных случаях использования.
Обратите внимание, что во всех случаях любой заголовок конверта, присутствующий в сообщении, не включается в интерфейс сопоставления.
- __len__()¶
Возвращает общее количество заголовков, включая дубликаты.
- __contains__(name)¶
Возвращает
True
, если в объекте message есть поле с именем 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. Поле добавляется в конец существующих заголовков сообщения.
Обратите внимание, что это не приводит к замене или удалению любого существующего заголовка с таким же именем. Если вы хотите убедиться, что новый заголовок является единственным, который присутствует в сообщении с именем поля, сначала удалите это поле, например:
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 с использованием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 и добавьте новое значение параметра. Необязательный заголовок указывает альтернативный заголовок Content-Type.Если значение содержит символы, отличные от ASCII, кодировка и язык могут быть явно указаны с помощью необязательных параметров charset и language. Необязательный language указывает язык RFC 2231, по умолчанию используется пустая строка. Как кодировка, так и язык должны быть строками. По умолчанию для языка используются
utf8
кодировка и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. Заголовок будет переписан без параметра или его значения. Необязательный заголовок указывает альтернативу 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
. Возможными значениями для этого метода являются встроенный, вложенный или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
не включен в список предпочтений, рассмотрите корневую часть (или подраздел корневой части) любого связанного файла в качестве кандидата, если (под) часть соответствует предпочтению.При обнаружении
multipart/related
проверьте параметрstart
и, если найдена деталь с совпадением Content-ID, учитывайте только ее при поиске возможных совпадений. В противном случае рассмотрим только первую (по умолчанию корневую) частьmultipart/related
.Если сторона имеет заголовок Content-Disposition, считайте эту часть подходящим совпадением только в том случае, если значение заголовка равно
inline
.Если ни один из кандидатов не соответствует ни одному из параметров в preferencelist, верните
None
.Примечания: (1) Для большинства приложений единственными комбинациями списка предпочтений, которые действительно имеют смысл, являются
('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 в качестве объекта message и передав любые другие аргументы или ключевые слова в качестве дополнительных аргументов. Если content_manager не указан, используйтеcontent_manager
, указанный текущимpolicy
.
- set_content(*args, content_manager=None, **kw)¶
Вызовите
set_content()
метод content_manager, передав self в качестве объекта message и передав любые другие аргументы или ключевые слова в качестве дополнительных аргументов. Если 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
, создайте новый объект message, передайте все аргументы его методу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
, создайте новый объект message, передайте все аргументы его методу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
, создайте новый объект message, передайте все аргументы его методу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
.Обратите внимание, что если объект message не имеет преамбулы, атрибутом 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.
Сноски