email.message.Message
: Представление сообщения электронной почты с помощью API compat32
¶
Класс Message
очень похож на класс EmailMessage
, без методов, добавленных этим классом, и с немного отличающимся поведением по умолчанию некоторых других методов. Мы также документируем здесь некоторые методы, которые, хотя и поддерживаются классом EmailMessage
, не рекомендуются, если вы не имеете дело с устаревшим кодом.
В остальном философия и структура этих двух классов одинаковы.
Этот документ описывает поведение при политике по умолчанию (для Message
) Compat32
. Если вы собираетесь использовать другую политику, то вместо нее следует использовать класс EmailMessage
.
Сообщение электронной почты состоит из заголовков и груза. Заголовки должны иметь имена и значения в стиле RFC 5322, где имя поля и значение разделены двоеточием. Двоеточие не является частью ни имени поля, ни его значения. Полезная нагрузка может быть простым текстовым сообщением, или двоичным объектом, или структурированной последовательностью под-сообщений, каждое из которых имеет свой собственный набор заголовков и свою собственную полезную нагрузку. Последний тип полезной нагрузки обозначается тем, что сообщение имеет MIME-тип, такой как multipart/* или message/rfc822.
Концептуальная модель, предоставляемая объектом Message
, представляет собой упорядоченный словарь заголовков с дополнительными методами для доступа к специализированной информации из заголовков, для доступа к полезной нагрузке, для генерации сериализованной версии сообщения и для рекурсивного перехода по дереву объекта. Обратите внимание, что поддерживаются дублирующие заголовки, но для доступа к ним необходимо использовать специальные методы.
Псевдословарь Message
индексируется по именам заголовков, которые должны быть значениями ASCII. Значения словаря - это строки, которые должны содержать только символы ASCII; существует специальная обработка для ввода не ASCII, но она не всегда дает правильные результаты. Заголовки хранятся и возвращаются в форме с сохранением регистра, но имена полей сопоставляются без учета регистра. Также может быть один заголовок конверта, также известный как заголовок Unix-From или заголовок From_
. Груз* - это либо строка или байт, в случае простых объектов сообщений, либо список объектов Message
, для документов-контейнеров MIME (например, multipart/* и message/rfc822).
Вот методы класса Message
:
-
class
email.message.
Message
(policy=compat32)¶ Если указана policy (она должна быть экземпляром класса
policy
), используйте указанные в ней правила для обновления и сериализации представления сообщения. Если policy не задана, используйте политикуcompat32
, которая поддерживает обратную совместимость с версией пакета email для Python 3.2. Для получения дополнительной информации см. документациюpolicy
.Изменено в версии 3.3: Добавлен аргумент с ключевым словом policy.
-
as_string
(unixfrom=False, maxheaderlen=0, policy=None)¶ Возвращает все сообщение, сплющенное как строка. Если необязательный параметр unixfrom равен true, заголовок конверта включается в возвращаемую строку. Значение unixfrom по умолчанию равно
False
. В целях обратной совместимости maxheaderlen по умолчанию имеет значение0
, поэтому если вам нужно другое значение, вы должны явно переопределить его (значение, указанное для max_line_length в политике, будет игнорироваться этим методом). Аргумент policy может быть использован для переопределения политики по умолчанию, полученной из экземпляра сообщения. Это может быть использовано для управления некоторым форматированием, производимым методом, поскольку указанная политика будет передана вGenerator
.Сплющивание сообщения может вызвать изменения в
Message
, если необходимо заполнить значения по умолчанию для завершения преобразования в строку (например, могут быть созданы или изменены границы MIME).Обратите внимание, что этот метод предоставляется в качестве удобства и не всегда может отформатировать сообщение так, как вам нужно. Например, по умолчанию он не выполняет сортировку строк, начинающихся с
From
, которая требуется в формате unix mbox. Для большей гибкости создайте экземплярGenerator
и используйте его методflatten()
напрямую. Например:from io import StringIO from email.generator import Generator fp = StringIO() g = Generator(fp, mangle_from_=True, maxheaderlen=60) g.flatten(msg) text = fp.getvalue()
Если объект сообщения содержит двоичные данные, которые не закодированы в соответствии со стандартами RFC, несоответствующие данные будут заменены кодовыми точками unicode «неизвестный символ». (См. также
as_bytes()
иBytesGenerator
).Изменено в версии 3.4: был добавлен аргумент с ключевым словом policy.
-
__str__
()¶ Эквивалентно
as_string()
. Позволяетstr(msg)
выдать строку, содержащую отформатированное сообщение.
-
as_bytes
(unixfrom=False, policy=None)¶ Возвращает все сообщение, сплющенное как объект bytes. Если необязательное значение unixfrom равно true, заголовок конверта включается в возвращаемую строку. По умолчанию unixfrom имеет значение
False
. Аргумент policy может быть использован для переопределения политики по умолчанию, полученной от экземпляра сообщения. Это можно использовать для управления некоторым форматированием, производимым методом, поскольку указанная политика будет передана вBytesGenerator
.Сплющивание сообщения может вызвать изменения в
Message
, если необходимо заполнить значения по умолчанию для завершения преобразования в строку (например, могут быть созданы или изменены границы MIME).Обратите внимание, что этот метод предоставляется в качестве удобства и не всегда может отформатировать сообщение так, как вам нужно. Например, по умолчанию он не выполняет сортировку строк, начинающихся с
From
, которая требуется в формате unix mbox. Для большей гибкости создайте экземплярBytesGenerator
и используйте его методflatten()
напрямую. Например:from io import BytesIO from email.generator import BytesGenerator fp = BytesIO() g = BytesGenerator(fp, mangle_from_=True, maxheaderlen=60) g.flatten(msg) text = fp.getvalue()
Добавлено в версии 3.4.
-
__bytes__
()¶ Эквивалентен
as_bytes()
. Позволяетbytes(msg)
выдать объект bytes, содержащий отформатированное сообщение.Добавлено в версии 3.4.
-
is_multipart
()¶ Возвращает
True
, если полезная нагрузка сообщения представляет собой список под-объектовMessage
, иначе возвращаетFalse
. Когдаis_multipart()
возвращаетFalse
, полезная нагрузка должна быть строковым объектом (который может быть двоичным объектом, закодированным в CTE). (Обратите внимание, чтоis_multipart()
, возвращающийTrue
, не обязательно означает, что «msg.get_content_maintype() == „multipart“» вернетTrue
. Например,is_multipart
вернетTrue
, еслиMessage
имеет типmessage/rfc822
).
-
set_unixfrom
(unixfrom)¶ Установите в заголовке конверта сообщения значение unixfrom, которое должно быть строкой.
-
get_unixfrom
()¶ Возвращает заголовок конверта сообщения. Значение по умолчанию
None
, если заголовок конверта никогда не устанавливался.
-
attach
(payload)¶ Добавляет заданную платежную нагрузку к текущей полезной нагрузке, которая до вызова должна быть
None
или списком объектовMessage
. После вызова полезная нагрузка всегда будет списком объектовMessage
. Если вы хотите установить полезную нагрузку в скалярный объект (например, строку), используйтеset_payload()
вместо этого.Это унаследованный метод. В классе
EmailMessage
его функциональность заменена наset_content()
и связанные с ним методыmake
иadd
.
-
get_payload
(i=None, decode=False)¶ Возвращает текущую полезную нагрузку, которая будет списком объектов
Message
, еслиis_multipart()
-True
, или строкой, еслиis_multipart()
-False
. Если полезная нагрузка является списком и вы мутируете объект list, вы изменяете полезную нагрузку сообщения на месте.С необязательным аргументом i,
get_payload()
вернет i-й элемент полезной нагрузки, считая от нуля, еслиis_multipart()
являетсяTrue
. Если i меньше 0 или больше или равно количеству элементов в полезной нагрузке, то будет вызвана ошибкаIndexError
. Если полезная нагрузка является строкой (т.е.is_multipart()
являетсяFalse
) и задано i, то будет выданоTypeError
.Необязательный decode - это флаг, указывающий, должна ли полезная нагрузка быть декодирована или нет, в соответствии с заголовком Content-Transfer-Encoding. Если
True
и сообщение не является многокомпонентным, полезная нагрузка будет декодирована, если значение этого заголовка равноquoted-printable
илиbase64
. Если используется другая кодировка или отсутствует заголовок Content-Transfer-Encoding, полезная нагрузка возвращается как есть (не декодированная). Во всех случаях возвращаемое значение является двоичными данными. Если сообщение является многокомпонентным и флаг decode равенTrue
, то возвращаетсяNone
. Если полезная нагрузка имеет формат base64 и она не была сформирована идеально (отсутствующая прокладка, символы вне алфавита base64), то к свойству дефекта сообщения будет добавлен соответствующий дефект (InvalidBase64PaddingDefect
илиInvalidBase64CharactersDefect
, соответственно).Когда decode равен
False
(по умолчанию), тело возвращается как строка без декодирования Content-Transfer-Encoding. Однако, для Content-Transfer-Encoding, равного 8 бит, делается попытка декодировать исходные байты с помощьюcharset
, указанного в заголовке Content-Type, используя обработчик ошибокreplace
. Еслиcharset
не указан, или если указанныйcharset
не распознается почтовым пакетом, тело декодируется с использованием стандартной кодировки ASCII.Это унаследованный метод. В классе
EmailMessage
его функциональность заменена наget_content()
иiter_parts()
.
-
set_payload
(payload, charset=None)¶ Установите всю полезную нагрузку объекта сообщения в payload. Клиент несет ответственность за обеспечение инвариантов полезной нагрузки. Необязательный charset устанавливает набор символов сообщения по умолчанию; подробности см. в
set_charset()
.Это унаследованный метод. На классе
EmailMessage
его функциональность заменена наset_content()
.
-
set_charset
(charset)¶ Установите набор символов полезной нагрузки в charset, который может быть либо экземпляром
Charset
(см.email.charset
), либо строкой с именем набора символов, либоNone
. Если это строка, то она будет преобразована в экземплярCharset
. Если charset являетсяNone
, параметрcharset
будет удален из заголовка Content-Type (сообщение не будет изменено). Любой другой параметр будет генерироватьTypeError
.Если нет существующего заголовка MIME-Version, то он будет добавлен. Если нет существующего заголовка Content-Type, он будет добавлен со значением text/plain. Независимо от того, существует заголовок Content-Type или нет, его параметр
charset
будет установлен в charset.output_charset. Если charset.input_charset и charset.output_charset отличаются, полезная нагрузка будет перекодирована в output_charset. Если нет существующего заголовка Content-Transfer-Encoding, то полезная нагрузка будет перекодирована, при необходимости, с использованием указанногоCharset
, и будет добавлен заголовок с соответствующим значением. Если заголовок Content-Transfer-Encoding уже существует, считается, что полезная нагрузка уже правильно закодирована с помощью этого Content-Transfer-Encoding и не модифицируется.Это унаследованный метод. В классе
EmailMessage
его функциональность заменена параметром charset методаemail.emailmessage.EmailMessage.set_content()
.
-
get_charset
()¶ Возвращает экземпляр
Charset
, связанный с полезной нагрузкой сообщения.Это унаследованный метод. На классе
EmailMessage
он всегда возвращаетNone
.
Следующие методы реализуют интерфейс, подобный отображению, для доступа к заголовкам RFC 2822 сообщения. Обратите внимание, что существуют некоторые семантические различия между этими методами и обычным интерфейсом отображения (т.е. словарем). Например, в словаре нет дубликатов ключей, а здесь могут быть дубликаты заголовков сообщений. Кроме того, в словарях нет гарантированного порядка ключей, возвращаемых
keys()
, но в объектеMessage
заголовки всегда возвращаются в том порядке, в котором они появились в исходном сообщении или были добавлены к сообщению позже. Любой заголовок, удаленный, а затем добавленный повторно, всегда добавляется в конец списка заголовков.Эти семантические различия являются намеренными и направлены на максимальное удобство.
Обратите внимание, что во всех случаях любой заголовок конверта, присутствующий в сообщении, не включается в интерфейс отображения.
В модели, созданной из байтов, любые значения заголовков, которые (в нарушение RFC) содержат байты, отличные от ASCII, при получении через этот интерфейс будут представлены как объекты
Header
с кодировкой unknown-8bit.-
__len__
()¶ Возвращает общее количество заголовков, включая дубликаты.
-
__contains__
(name)¶ Возвращает
True
, если объект сообщения имеет поле с именем name. Соответствие осуществляется без учета регистра, и name не должно включать двоеточие. Используется для оператораin
, например:if 'message-id' in myMessage: print('Message-ID:', myMessage['message-id'])
-
__getitem__
(name)¶ Возвращает значение именованного поля заголовка. Имя не должно включать разделитель полей двоеточие. Если заголовок отсутствует, возвращается
None
;KeyError
никогда не возвращается.Обратите внимание, что если именованное поле встречается в заголовках сообщения более одного раза, то какое именно из значений этого поля будет возвращено, не определено. Используйте метод
get_all()
для получения значений всех имеющихся именованных заголовков.
-
__setitem__
(name, val)¶ Добавляет заголовок к сообщению с именем поля name и значением val. Поле добавляется в конец существующих полей сообщения.
Обратите внимание, что при этом не перезаписывается или удаляется любой существующий заголовок с тем же именем. Если вы хотите, чтобы новый заголовок был единственным в сообщении с именем поля имя, сначала удалите это поле, например:
del msg['subject'] msg['subject'] = 'Python roolz!'
-
__delitem__
(name)¶ Удалить все вхождения поля с именем name из заголовков сообщения. Исключение не возникает, если названное поле не присутствует в заголовках.
-
keys
()¶ Возвращает список всех имен полей заголовков сообщения.
-
values
()¶ Возвращает список всех значений полей сообщения.
-
items
()¶ Возвращает список из двух кортежей, содержащих все заголовки и значения полей сообщения.
-
get
(name, failobj=None)¶ Возвращает значение именованного поля заголовка. Это идентично
__getitem__()
за исключением того, что возвращается необязательное значение failobj, если именованный заголовок отсутствует (по умолчаниюNone
).
Вот несколько дополнительных полезных методов:
-
get_all
(name, failobj=None)¶ Возвращает список всех значений для поля с именем name. Если в сообщении нет таких именованных заголовков, возвращается failobj (по умолчанию
None
).
-
add_header
(_name, _value, **_params)¶ Расширенная установка заголовка. Этот метод аналогичен
__setitem__()
, за исключением того, что дополнительные параметры заголовка могут быть предоставлены в качестве аргументов ключевых слов. _name - это поле заголовка, которое нужно добавить, а _value - это основное значение для заголовка.Для каждого элемента в словаре аргументов ключевого слова _params в качестве имени параметра берется ключ, а подчеркивания преобразуются в тире (поскольку тире недопустимо в идентификаторах Python). Обычно параметр добавляется как
key="value"
, если только значение неNone
, в этом случае добавляется только ключ. Если значение содержит не-ASCII символы, оно может быть задано в виде кортежа в формате(CHARSET, LANGUAGE, VALUE)
, гдеCHARSET
- строка, называющая кодовую систему, которая будет использоваться для кодирования значения,LANGUAGE
обычно может быть заданоNone
или пустая строка (см. RFC 2231 для других возможностей), аVALUE
- строковое значение, содержащее не-ASCII кодовые точки. Если тройка кортежей не передана, а значение содержит символы, не являющиеся кодами ASCII, оно автоматически кодируется в формате RFC 2231, используяCHARSET
изutf-8
иLANGUAGE
изNone
.Вот пример:
msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')
Это добавит заголовок, который будет выглядеть следующим образом:
Content-Disposition: attachment; filename="bud.gif"
Пример с символами, отличными от ASCII:
msg.add_header('Content-Disposition', 'attachment', filename=('iso-8859-1', '', 'Fußballer.ppt'))
Который производит
Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt"
-
replace_header
(_name, _value)¶ Заменить заголовок. Заменяет первый найденный в сообщении заголовок, который соответствует _имя, сохраняя порядок заголовков и регистр имен полей. Если подходящего заголовка не найдено, выдается сообщение
KeyError
.
-
get_content_type
()¶ Возвращает тип содержимого сообщения. Возвращаемая строка приводится к нижнему регистру в виде maintype/subtype. Если в сообщении отсутствует заголовок Content-Type, то будет возвращен тип по умолчанию, заданный в
get_default_type()
. Поскольку, согласно RFC 2045, сообщения всегда имеют тип по умолчанию,get_content_type()
всегда будет возвращать значение.RFC 2045 определяет тип сообщения по умолчанию как text/plain, если только оно не находится внутри контейнера multipart/digest, в этом случае оно будет message/rfc822. Если заголовок Content-Type имеет недопустимую спецификацию типа, RFC 2045 предписывает, чтобы тип по умолчанию был text/plain.
-
get_content_maintype
()¶ Возвращает основной тип содержимого сообщения. Это maintype часть строки, возвращаемой
get_content_type()
.
-
get_content_subtype
()¶ Возвращает тип субконтента сообщения. Это subtype часть строки, возвращаемой
get_content_type()
.
-
get_default_type
()¶ Возвращает тип содержимого по умолчанию. Большинство сообщений имеют тип содержимого по умолчанию text/plain, за исключением сообщений, которые являются подчастями контейнеров multipart/digest. Такие вложенные части имеют тип содержимого по умолчанию message/rfc822.
-
set_default_type
(ctype)¶ Установите тип содержимого по умолчанию. ctype должен быть либо text/plain, либо message/rfc822, хотя это не является обязательным. Тип содержимого по умолчанию не сохраняется в заголовке Content-Type.
-
get_params
(failobj=None, header='content-type', unquote=True)¶ Возвращает параметры сообщения Content-Type в виде списка. Элементами возвращаемого списка являются 2-кортежи пар ключ/значение, разделенные по признаку
'='
. Левая часть'='
- это ключ, а правая часть - значение. Если в параметре нет знака'='
, то значением будет пустая строка, в противном случае значение будет таким, как описано вget_param()
и будет без кавычек, если опциональная unquote установленаTrue
(по умолчанию).Необязательный failobj - это объект, который возвращается, если нет заголовка Content-Type. Необязательный header - это заголовок, который нужно искать вместо Content-Type.
Это унаследованный метод. В классе
EmailMessage
его функциональность заменена свойством params отдельных объектов заголовков, возвращаемых методами доступа к заголовкам.
-
get_param
(param, failobj=None, header='content-type', unquote=True)¶ Возвращает значение параметра param заголовка Content-Type в виде строки. Если сообщение не имеет заголовка Content-Type или если такой параметр отсутствует, то возвращается failobj (по умолчанию
None
).Необязательный header, если задан, указывает заголовок сообщения, который следует использовать вместо Content-Type.
Ключи параметров всегда сравниваются без учета регистра. Возвращаемое значение может быть либо строкой, либо 3-кортежем, если параметр был закодирован RFC 2231. Когда это 3-кортеж, элементы значения имеют вид
(CHARSET, LANGUAGE, VALUE)
. Обратите внимание, что иCHARSET
, иLANGUAGE
могут бытьNone
, в этом случае следует считать, чтоVALUE
закодирован в кодировкеus-ascii
. ОбычноLANGUAGE
можно игнорировать.Если вашему приложению не важно, был ли параметр закодирован, как в RFC 2231, вы можете свернуть значение параметра, вызвав
email.utils.collapse_rfc2231_value()
, передав возвращаемое значение изget_param()
. Это вернет соответствующим образом декодированную строку Unicode, если значение является кортежем, или исходную строку без кавычек, если это не так. Например:rawparam = msg.get_param('foo') param = email.utils.collapse_rfc2231_value(rawparam)
В любом случае, значение параметра (либо возвращаемая строка, либо элемент
VALUE
в 3 кортеже) всегда остается без кавычек, если только unquote не установлено вFalse
.Это унаследованный метод. В классе
EmailMessage
его функциональность заменена свойством params отдельных объектов заголовков, возвращаемых методами доступа к заголовкам.
-
set_param
(param, value, header='Content-Type', requote=True, charset=None, language='', replace=False)¶ Установить параметр в заголовке Content-Type. Если параметр уже существует в заголовке, его значение будет заменено на value. Если заголовок Content-Type еще не определен для данного сообщения, он будет установлен в text/plain и новое значение параметра будет добавлено в соответствии с RFC 2045.
Необязательный header указывает альтернативный заголовок Content-Type, и все параметры будут заключены в кавычки, если только необязательный requote не равен
False
(по умолчаниюTrue
).Если указан необязательный charset, параметр будет закодирован в соответствии с RFC 2231. Необязательный language определяет язык RFC 2231, по умолчанию это пустая строка. И charset, и language должны быть строками.
Если replace равно
False
(по умолчанию), заголовок перемещается в конец списка заголовков. Если replace равноTrue
, заголовок будет обновлен на месте.Изменено в версии 3.4: Было добавлено ключевое слово
replace
.
-
del_param
(param, header='content-type', requote=True)¶ Полностью удалить заданный параметр из заголовка Content-Type. Заголовок будет переписан на место без параметра или его значения. Все значения будут заключены в кавычки, если только requote не равно
False
(по умолчаниюTrue
). Необязательный header задает альтернативу Content-Type.
-
set_type
(type, header='Content-Type', requote=True)¶ Устанавливает основной тип и подтип для заголовка Content-Type. type должен быть строкой в форме maintype/subtype, иначе возникает ошибка
ValueError
.Этот метод заменяет заголовок Content-Type, сохраняя все параметры на месте. Если requote равно
False
, то кавычки существующего заголовка останутся как есть, иначе параметры будут заключены в кавычки (по умолчанию).Альтернативный заголовок может быть указан в аргументе header. При установке заголовка Content-Type также добавляется заголовок MIME-Version.
Это унаследованный метод. В классе
EmailMessage
его функциональность заменена методамиmake_
иadd_
.
-
get_filename
(failobj=None)¶ Возвращает значение параметра
filename
в заголовке Content-Disposition сообщения. Если заголовок не имеет параметраfilename
, этот метод возвращается к поиску параметраname
в заголовке Content-Type. Если ни один из параметров не найден, или заголовок отсутствует, то возвращается failobj. Возвращаемая строка всегда будет без кавычек согласноemail.utils.unquote()
.
-
get_boundary
(failobj=None)¶ Возвращает значение параметра
boundary
заголовка сообщения Content-Type, или failobj, если заголовок отсутствует, или не имеет параметраboundary
. Возвращаемая строка всегда будет без кавычек согласноemail.utils.unquote()
.
-
set_boundary
(boundary)¶ Установите параметр
boundary
заголовка Content-Type в boundary.set_boundary()
при необходимости всегда будет приводить boundary. Возникает ошибкаHeaderParseError
, если объект сообщения не имеет заголовка Content-Type.Обратите внимание, что использование этого метода несколько отличается от удаления старого заголовка Content-Type и добавления нового с новой границей через
add_header()
, посколькуset_boundary()
сохраняет порядок заголовка Content-Type в списке заголовков. Однако он не сохраняет никаких строк продолжения, которые могли присутствовать в исходном заголовке Content-Type.
-
get_content_charset
(failobj=None)¶ Возвращает параметр
charset
заголовка Content-Type, приведенный к нижнему регистру. Если заголовок Content-Type отсутствует, или если этот заголовок не имеет параметраcharset
, возвращается failobj.Обратите внимание, что этот метод отличается от
get_charset()
, который возвращает экземплярCharset
для кодировки тела сообщения по умолчанию.
-
get_charsets
(failobj=None)¶ Возвращает список, содержащий имена наборов символов в сообщении. Если сообщение является multipart, то список будет содержать по одному элементу для каждого подраздела в полезной нагрузке, в противном случае это будет список длины 1.
Каждый элемент в списке будет строкой, которая является значением параметра
charset
в заголовке Content-Type для представленного подраздела. Однако, если подраздел не имеет ни заголовка Content-Type, ни параметраcharset
, ни основного MIME-типа text, то этот элемент в возвращаемом списке будет failobj.
-
get_content_disposition
()¶ Возвращает значение (без параметров) заголовка Content-Disposition сообщения, если он есть, или
None
. Возможные значения для этого метода: inline, attachment илиNone
, если сообщение следует за RFC 2183.Добавлено в версии 3.5.
-
walk
()¶ Метод
walk()
- это универсальный генератор, который можно использовать для итерации по всем частям и подчастям дерева объектов сообщений в порядке первичного обхода. Обычно вы используетеwalk()
в качестве итератора в циклеfor
; каждая итерация возвращает следующую подчасть.Вот пример, который выводит MIME-тип каждой части многокомпонентной структуры сообщения:
>>> for part in msg.walk(): ... print(part.get_content_type()) multipart/report text/plain message/delivery-status text/plain text/plain message/rfc822 text/plain
walk
перебирает подчасти любой части, гдеis_multipart()
возвращаетTrue
, даже еслиmsg.get_content_maintype() == 'multipart'
может возвращатьFalse
. Мы можем увидеть это в нашем примере, используя вспомогательную функцию отладки_structure
:>>> for part in msg.walk(): ... print(part.get_content_maintype() == 'multipart', ... part.is_multipart()) True True False False False True False False False False False True False False >>> _structure(msg) multipart/report text/plain message/delivery-status text/plain text/plain message/rfc822 text/plain
Здесь части
message
не являютсяmultiparts
, но содержат подчасти.is_multipart()
возвращаетTrue
иwalk
спускается в подчасти.
Объекты
Message
также могут содержать два атрибута экземпляра, которые могут быть использованы при генерации обычного текста MIME-сообщения.-
preamble
¶ Формат документа MIME допускает наличие некоторого текста между пустой строкой, следующей за заголовками, и первой многочастной граничной строкой. Обычно этот текст никогда не виден в программе чтения почты с поддержкой MIME, поскольку он выходит за рамки стандартной брони MIME. Однако при просмотре необработанного текста сообщения или при просмотре сообщения в программе, не поддерживающей MIME, этот текст может стать видимым.
Атрибут preamble содержит этот ведущий дополнительный текст для MIME-документов. Когда
Parser
обнаруживает некоторый текст после заголовков, но до первой граничной строки, он присваивает этот текст атрибуту preamble сообщения. КогдаGenerator
записывает обычное текстовое представление MIME-сообщения и обнаруживает, что сообщение имеет атрибут preamble, он записывает этот текст в область между заголовками и первой граничной строкой. Подробности смотрите вemail.parser
иemail.generator
.Обратите внимание, что если объект сообщения не имеет преамбулы, атрибут preamble будет
None
.
-
epilogue
¶ Атрибут epilogue действует так же, как и атрибут preamble, за исключением того, что он содержит текст, который появляется между последней границей и концом сообщения.
Вам не нужно устанавливать эпилог в пустую строку для того, чтобы
Generator
выводил новую строку в конце файла.
-
defects
¶ Атрибут defects содержит список всех проблем, обнаруженных при разборе этого сообщения. Подробное описание возможных дефектов разбора см. в
email.errors
.
-