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 имеет значение
False, заголовок конверта включается в возвращаемую строку. По умолчанию unixfrom имеет значение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, несоответствующие требованиям данные будут заменены кодовыми точками Юникода «неизвестный символ». (См. также
as_bytes()иBytesGenerator.)Изменено в версии 3.4: добавлен именованный аргумент policy.
-
__str__() -
Эквивалентен
as_string(). Позволяетstr(msg)сформировать строку с отформатированным сообщением.
-
as_bytes(unixfrom=False, policy=None) -
Возвращает всё сообщение в виде объекта bytes. Если необязательный аргумент 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, полезная нагрузка должна быть объектом string (который может содержать двоичную полезную нагрузку, закодированную с помощью 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), в свойство дефектов сообщения будет добавлен соответствующий дефект (InvalidBase64PaddingDefectилиInvalidBase64CharactersDefectсоответственно).Если decode имеет значение
False(по умолчанию), тело возвращается в виде строки без декодирования Content-Transfer-Encoding. Однако для значения 8bit заголовка Content-Transfer-Encoding предпринимается попытка декодировать исходные байты с использованием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, параметр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 уже существует, предполагается, что полезная нагрузка уже правильно закодирована с его помощью, и она не изменяется.Это устаревший метод. В классе
EmailMessageего функциональность заменена параметром charset методаemail.emailmessage.EmailMessage.set_content().
-
get_charset() -
Возвращает экземпляр
Charset, связанный с полезной нагрузкой сообщения.Это устаревший метод. В классе
EmailMessageон всегда возвращаетNone.
Следующие методы реализуют интерфейс, подобный отображению, для доступа к заголовкам RFC 2822 сообщения. Обратите внимание: эти методы семантически отличаются от обычного интерфейса отображения (то есть словаря). Например, в словаре не бывает повторяющихся ключей, тогда как здесь заголовки сообщения могут повторяться. Кроме того, словари не гарантируют порядок ключей, возвращаемых методом
keys(), но в объектеMessageзаголовки всегда возвращаются в том порядке, в котором они встречались в исходном сообщении или были добавлены позднее. Любой удалённый, а затем повторно добавленный заголовок всегда помещается в конец списка заголовков.Эти семантические различия предусмотрены намеренно и ориентированы на максимальное удобство.
Обратите внимание: заголовки конверта, если они присутствуют в сообщении, не включаются в интерфейс отображения.
В модели, созданной из байтов, значения заголовков, содержащие не-ASCII байты (вопреки требованиям RFC), при получении через этот интерфейс будут представлены объектами
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() -
Возвращает список пар из двух элементов, содержащих все поля заголовков сообщения и их значения.
-
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 сообщения в виде списка. Элементы возвращаемого списка — это пары «ключ/значение», разделённые знаком
'='. Левая часть'='является ключом, а правая — значением. Если в параметре нет знака'=', значением будет пустая строка; в противном случае значение описано в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. В случае кортежа элементы значения имеют вид
(CHARSET, LANGUAGE, VALUE). Обратите внимание: иCHARSET, иLANGUAGEмогут иметь значениеNone; в этом случае следует считать, чтоVALUEзакодировано в кодировкеus-ascii. ОбычноLANGUAGEможно игнорировать.Если приложению не важно, был ли параметр закодирован согласно RFC 2231, значение параметра можно привести к обычному виду, вызвав
email.utils.collapse_rfc2231_value()и передав ему возвращаемое значениеget_param(). Если значение представляет собой кортеж, метод вернёт подходящую строку Юникода после декодирования; в противном случае он вернёт исходную строку без кавычек. Например: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-документа допускает наличие текста между пустой строкой после заголовков и первой строкой-границей составной части. Обычно этот текст не виден в почтовых программах, поддерживающих 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/email.compat32-message.html