Spec-Zone.ru › Python 3.6

email.message.Message: Представление электронного сообщения с использованием API compat32

Класс Message очень похож на класс EmailMessage, без методов, добавленных этим классом, и с немного отличающимся по умолчанию поведением некоторых других методов. Мы также документируем здесь некоторые методы, которые, хотя и поддерживаются классом EmailMessage, не рекомендуются, если вы не работаете с устаревшим кодом.

Философия и структура этих двух классов в остальном одинаковы.

В данном документе описывается поведение по умолчанию (для Message) политики Compat32. Если вы собираетесь использовать другую политику, вам следует использовать класс EmailMessage вместо него.

Электронное сообщение состоит из заголовков и данных. Заголовки должны быть именами и значениями в стиле RFC 5233, где имя поля и значение разделены двоеточием. Двоеточие не является частью ни имени поля, ни значения поля. Данные могут быть простым текстовым сообщением, двоичным объектом или структурированной последовательностью подсообщений, каждое из которых имеет свой набор заголовков и свои данные. Последний тип данных указывается типом 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. Будет поднята ошибка IndexError, если i меньше 0 или больше или равно количеству элементов в полезной нагрузке. Если полезная нагрузка является строкой (т.е. 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, параметр 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 заголовки всегда возвращаются в порядке их появления в исходном сообщении или добавлены в сообщение позже. Любой удалённый и затем повторно добавленный заголовок всегда добавляется в конец списка заголовков.

Эти семантические различия преднамеренные и ориентированы на максимальное удобство.

Обратите внимание, что во всех случаях любой заголовок конверта, присутствующий в сообщении, не включён в интерфейс отображения.

В модели, сгенерированной из байтов, любые значения заголовков, которые (вопреки 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()

Возвращает список пар кортежей, содержащих все заголовки и значения полей сообщения.

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. Когда это кортеж из 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 keyword был добавлен.

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 и добавления нового с новым boundary через 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, или не является типа text основного MIME-типа, то этот элемент в возвращаемом списке будет failobj.

get_content_disposition()

Возвращает значение заголовка сообщения Content-Disposition (без параметров) в нижнем регистре, если он есть, или None. Возможные значения для этого метода — inline, attachment или None, если сообщение соответствует RFC 2183.

Новое в версии 3.5.

walk()

Метод walk() — это универсальный генератор, который можно использовать для итерации по всем частям и подчастям дерева объекта сообщения в порядке обхода в глубину. Как правило, вы используете walk() в качестве итератора в цикле for; на каждой итерации возвращается следующая подчасть.

Вот пример, который выводит MIME-тип каждой части структуры multipart-сообщения:

>>> 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, за исключением того, что он содержит текст, который появляется между последним разделителем и концом сообщения.

Вам не нужно устанавливать epilogue в пустую строку, чтобы Generator печатал перенос строки в конце файла.

defects

Атрибут defects содержит список всех проблем, обнаруженных при разборе этого сообщения. См. email.errors для подробного описания возможных дефектов разбора.

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.6/library/email.compat32-message.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API