email.message.Message: Представление электронного письма с помощью API compat32
Класс Message очень похож на класс EmailMessage, но не содержит добавленных в него методов, а поведение по умолчанию некоторых других методов немного отличается. Здесь также описаны некоторые методы, которые поддерживаются классом EmailMessage, но не рекомендуются к использованию, если только вы не работаете с устаревшим кодом.
В остальном философия и структура этих двух классов одинаковы.
В этом документе описано поведение при использовании политики Compat32, применяемой по умолчанию для Message. Если вы собираетесь использовать другую политику, вместо этого следует использовать класс 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 можно использовать для переопределения политики по умолчанию, полученной из экземпляра сообщения. Это позволяет управлять некоторыми аспектами форматирования, выполняемого методом, поскольку указанная 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 можно использовать для переопределения политики по умолчанию, полученной из экземпляра сообщения. Это позволяет управлять некоторыми аспектами форматирования, выполняемого методом, поскольку указанная 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) -
Добавляет указанный объект payload к текущей полезной нагрузке, которая до вызова метода должна быть
Noneили списком объектовMessage. После вызова полезная нагрузка всегда будет списком объектовMessage. Чтобы задать полезную нагрузку скалярным объектом (например, строкой), используйте вместо этогоset_payload().Это устаревший метод. В классе
EmailMessageего функциональность заменена методамиset_content(), а также связанными с ним методамиmakeиadd.
-
get_payload(i=None, decode=False) -
Возвращает текущую полезную нагрузку: список объектов
Message, еслиis_multipart()равноTrue, или строку, еслиis_multipart()равноFalse. Если полезная нагрузка является списком и вы изменяете объект списка, полезная нагрузка сообщения изменяется на месте.При наличии необязательного аргумента 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), в свойство defects сообщения будет добавлен соответствующий дефект (InvalidBase64PaddingDefectилиInvalidBase64CharactersDefectсоответственно).Если decode равно
False(значение по умолчанию), тело возвращается в виде строки без декодирования Content-Transfer-Encoding. Однако для Content-Transfer-Encoding со значением 8bit предпринимается попытка декодировать исходные байты с помощьюcharset, указанной в заголовке Content-Type, используя обработчик ошибокreplace. Еслиcharsetне указана или указаннаяcharsetне распознаётся пакетом email, тело декодируется с использованием кодировки 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, из заголовка Content-Type будет удалён параметрcharset(в остальном сообщение не изменится). Любое другое значение приведёт к исключению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 уже существует, предполагается, что полезная нагрузка уже правильно закодирована с его помощью, и она не изменяется.Это устаревший метод. В классе
EmailMessageего функциональность заменена параметром charset методаemail.message.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) -
Возвращает значение указанного поля заголовка. name не должно содержать двоеточие-разделитель поля. Если заголовок отсутствует, возвращается
None; исключениеKeyErrorникогда не вызывается.Обратите внимание: если указанное поле встречается в заголовках сообщения более одного раза, не определено, какое именно из этих значений будет возвращено. Чтобы получить значения всех существующих заголовков с указанным именем, используйте метод
get_all().
-
__setitem__(name, val) -
Добавляет в сообщение заголовок с именем поля name и значением val. Поле добавляется в конец списка существующих полей сообщения.
Обратите внимание: этот метод не перезаписывает и не удаляет существующие заголовки с тем же именем. Чтобы гарантировать, что в сообщении останется только один заголовок с именем поля name, сначала удалите поле, например:
del msg['subject'] msg['subject'] = 'Python roolz!'
-
__delitem__(name) -
Удаляет из заголовков сообщения все вхождения поля с именем name. Если указанного поля в заголовках нет, исключение не вызывается.
-
keys() -
Возвращает список имён всех полей заголовков сообщения.
-
values() -
Возвращает список значений всех полей сообщения.
-
items() -
Возвращает список 2-кортежей, содержащих все поля заголовков сообщения и их значения.
-
get(name, failobj=None) -
Возвращает значение указанного поля заголовка. Этот метод идентичен
__getitem__(), за исключением того, что возвращает необязательный аргумент failobj, если заголовок отсутствует (по умолчаниюNone).
Ниже приведены некоторые другие полезные методы:
-
get_all(name, failobj=None) -
Возвращает список всех значений поля с именем name. Если в сообщении нет заголовков с таким именем, возвращается failobj (по умолчанию
None).
-
add_header(_name, _value, **_params) -
Расширенная установка заголовка. Этот метод похож на
__setitem__(), но позволяет передавать дополнительные параметры заголовка в виде именованных аргументов. _name — это добавляемое поле заголовка, а _value — его основное значение.Для каждого элемента словаря именованных аргументов _params ключ считается именем параметра, при этом символы подчёркивания заменяются дефисами (поскольку дефисы недопустимы в идентификаторах Python). Обычно параметр добавляется как
key="value", если только его значение не равноNone; в этом случае добавляется только ключ. Если значение содержит символы, отличные от ASCII, его можно указать в виде кортежа из трёх элементов формата(CHARSET, LANGUAGE, VALUE), гдеCHARSET— строка с названием кодировки для значения,LANGUAGEобычно можно задать равнымNoneили пустой строке (другие варианты см. в RFC 2231), аVALUE— строковое значение, содержащее кодовые точки, отличные от ASCII. Если кортеж из трёх элементов не передан, а значение содержит символы, отличные от ASCII, оно автоматически кодируется в формате RFC 2231 с использованиемCHARSET, равногоutf-8, иLANGUAGE, равногоNone.Пример:
msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')В результате будет добавлен заголовок следующего вида:
Content-Disposition: attachment; filename="bud.gif"
Пример с символами, отличными от ASCII:
msg.add_header('Content-Disposition', 'attachment', filename=('iso-8859-1', '', 'Fußballer.ppt'))В результате получится:
Content-Disposition: attachment; filename*="iso-8859-1''Fu%DFballer.ppt"
-
replace_header(_name, _value) -
Заменяет заголовок. Заменяет первый найденный в сообщении заголовок, соответствующий _name, сохраняя порядок заголовков и регистр имени поля. Если подходящий заголовок не найден, вызывается исключение
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)В любом случае значение параметра (возвращённая строка или элемент
VALUE3-кортежа) снимается с кавычек, если только для 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 в кавычки, если это необходимо. Если у объекта сообщения нет заголовка Content-Type, вызывается исключениеHeaderParseError.Обратите внимание: использование этого метода немного отличается от удаления старого заголовка 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-документа допускает наличие текста между пустой строкой после заголовков и первой строкой границы multipart. Обычно этот текст не отображается в почтовой программе с поддержкой MIME, поскольку находится за пределами стандартного MIME-оформления. Однако при просмотре исходного текста сообщения или в программе чтения без поддержки MIME этот текст может быть виден.
Атрибут preamble содержит этот начальный текст вне MIME-оформления в MIME-документах. Когда
Parserобнаруживает текст после заголовков, но перед первой строкой границы, он присваивает этот текст атрибуту preamble сообщения. КогдаGeneratorзаписывает текстовое представление MIME-сообщения и обнаруживает у сообщения атрибут preamble, он помещает этот текст между заголовками и первой строкой границы. Подробнее см. в разделахemail.parserиemail.generator.Обратите внимание: если у объекта сообщения нет преамбулы, атрибут preamble будет равен
None.
-
epilogue -
Атрибут epilogue работает так же, как атрибут preamble, но содержит текст между последней строкой границы и концом сообщения.
Чтобы
Generatorдобавил перевод строки в конец файла, не нужно устанавливать для эпилога пустую строку.
-
defects -
Атрибут defects содержит список всех проблем, обнаруженных при разборе этого сообщения. Подробное описание возможных ошибок разбора см. в разделе
email.errors.
-
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/library/email.compat32-message.html