email.message: Представляет собой сообщение электронной почты

Исходный код: Lib/email/message.py


Добавлено в версии 3.6: [1]

Центральным классом в пакете email является класс EmailMessage, импортированный из модуля email.message. Это базовый класс для объектной модели email. EmailMessage предоставляет основные функциональные возможности для настройки и запроса полей заголовка, для доступа к текстам сообщений, а также для создания или изменения структурированных сообщений.

Сообщение электронной почты состоит из заголовков и полезной нагрузки (которая также называется содержимым). Заголовками являются имена полей и значения в стиле RFC 5322 или RFC 6532, где имя поля и значение разделены двоеточием. Двоеточие не является частью ни имени поля, ни значения поля. Полезной нагрузкой может быть простое текстовое сообщение, или двоичный объект, или структурированная последовательность вложенных сообщений, каждое из которых имеет свой собственный набор заголовков и свою полезную нагрузку. Последний тип полезной нагрузки обозначается сообщением, имеющим MIME-тип, такой как multipart/* или message/rfc822.

Концептуальная модель, предоставляемая объектом EmailMessage, представляет собой упорядоченный словарь заголовков в сочетании с полезной нагрузкой, которая представляет RFC 5322 тело сообщения, которое может быть списком вложенных объектов.``EmailMessage`` В дополнение к обычным словарным методам для доступа к именам и значениям заголовков существуют методы для доступа к специализированной информации из заголовков (например, к типу содержимого MIME), для работы с полезной нагрузкой, для генерации сериализованной версии сообщения и для рекурсивного обхода дерева объектов.

Интерфейс, подобный словарю EmailMessage, индексируется по именам заголовков, которые должны быть значениями в формате ASCII. Значения словаря представляют собой строки с некоторыми дополнительными методами. Заголовки сохраняются и возвращаются в форме с сохранением регистра, но имена полей сопоставляются без учета регистра. Ключи упорядочены, но, в отличие от реального dict, могут быть дубликаты. Для работы с заголовками, содержащими повторяющиеся ключи, предусмотрены дополнительные методы.

Полезная нагрузка * представляет собой объект string или bytes, в случае простых объектов message, или список объектов EmailMessage для документов-контейнеров MIME, таких как multipart/* и message/rfc822 объекты message.

class email.message.EmailMessage(policy=default)

Если указана политика, используйте указанные в ней правила для обновления и сериализации представления сообщения. Если параметр policy не задан, используйте политику default, которая соответствует правилам запроса предложений по электронной почте, за исключением окончаний строк (вместо предписанного RFC \r\n используется стандарт Python \n окончания строк).. Для получения дополнительной информации обратитесь к документации policy.

as_string(unixfrom=False, maxheaderlen=None, policy=None)

Возвращает все сообщение в сжатом виде в виде строки. Если значение параметра unixfrom равно true, заголовок конверта включается в возвращаемую строку. Значение unixfrom по умолчанию равно False. Для обеспечения обратной совместимости с базовым Message используется класс maxheaderlen, но по умолчанию используется значение None, что означает, что по умолчанию длина строки регулируется max_line_length политики. Аргумент policy может использоваться для переопределения политики по умолчанию, полученной из экземпляра сообщения. Это может быть использовано для управления некоторым форматированием, создаваемым методом, поскольку указанная политика будет передана в Generator.

Сглаживание сообщения может вызвать изменения в EmailMessage, если для завершения преобразования в строку необходимо ввести значения по умолчанию (например, могут быть сгенерированы или изменены границы MIME).

Обратите внимание, что этот метод предоставляется для удобства и может оказаться не самым полезным способом сериализации сообщений в вашем приложении, особенно если вы имеете дело с несколькими сообщениями. Более гибкий API для сериализации сообщений приведен в разделе email.generator.Generator. Обратите также внимание, что этот метод ограничен созданием сообщений, упорядоченных как «7-разрядные чистые», когда utf8 равно False, что используется по умолчанию.

Изменено в версии 3.6: поведение по умолчанию, когда maxheaderlen не указано, было изменено с значения по умолчанию 0 на значение по умолчанию max_line_length из политики.

__str__()

Эквивалентно as_string(policy=self.policy.clone(utf8=True)). Позволяет str(msg) создать строку, содержащую сериализованное сообщение в удобочитаемом формате.

Изменено в версии 3.4: метод был изменен на использование utf8=True, что позволило создать представление сообщения, подобное RFC 6531, вместо того, чтобы быть прямым псевдонимом для as_string().

as_bytes(unixfrom=False, policy=None)

Возвращает все сообщение в сжатом виде в виде объекта bytes. Если параметр unixfrom имеет значение true, заголовок конверта включается в возвращаемую строку. unixfrom по умолчанию имеет значение False. Аргумент policy может использоваться для переопределения политики по умолчанию, полученной из экземпляра сообщения. Это может быть использовано для управления некоторым форматированием, создаваемым методом, поскольку указанная политика будет передана в BytesGenerator.

Сглаживание сообщения может вызвать изменения в EmailMessage, если для завершения преобразования в строку необходимо ввести значения по умолчанию (например, могут быть сгенерированы или изменены границы MIME).

Обратите внимание, что этот метод предоставляется для удобства и может оказаться не самым полезным способом сериализации сообщений в вашем приложении, особенно если вы имеете дело с несколькими сообщениями. Более гибкий API для сериализации сообщений приведен в разделе email.generator.BytesGenerator.

__bytes__()

Эквивалентно as_bytes(). Позволяет bytes(msg) создать объект bytes, содержащий сериализованное сообщение.

is_multipart()

Возвращает True, если полезной нагрузкой сообщения является список вложенных объектов EmailMessage, в противном случае возвращает False. Когда is_multipart() возвращает False, полезной нагрузкой должен быть строковый объект (который может быть двоичной полезной нагрузкой в кодировке CTE). Обратите внимание, что is_multipart(), возвращающий True, не обязательно означает, что «msg.get_content_main type() == „multipart“» вернет True. Например, is_multipart вернет True, если EmailMessage имеет тип message/rfc822.

set_unixfrom(unixfrom)

Задайте для заголовка конверта сообщения значение unixfrom, которое должно быть строкой. (Краткое описание этого заголовка смотрите в mboxMessage).

get_unixfrom()

Возвращает заголовок конверта сообщения. По умолчанию используется значение None, если заголовок конверта никогда не задавался.

Следующие методы реализуют интерфейс, подобный отображению, для доступа к заголовкам сообщений. Обратите внимание, что между этими методами и обычным интерфейсом отображения (т.е. словарем) есть некоторые семантические различия. Например, в словаре нет повторяющихся ключей, но здесь могут быть повторяющиеся заголовки сообщений. Кроме того, в словарях нет гарантированного порядка для ключей, возвращаемых keys(), но в объекте EmailMessage заголовки всегда возвращаются в том порядке, в котором они появились в исходном сообщении или в котором они были добавлены в сообщение позже. Любой заголовок, удаленный, а затем повторно добавленный, всегда добавляется в конец списка заголовков.

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

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

__len__()

Возвращает общее количество заголовков, включая дубликаты.

__contains__(name)

Возвращает True, если в объекте message есть поле с именем name. Сопоставление выполняется без учета регистра, и name не включает двоеточие в конце. Используется для оператора in. Например:

if 'message-id' in myMessage:
   print('Message-ID:', myMessage['message-id'])
__getitem__(name)

Возвращает значение именованного поля заголовка. name не содержит двоеточия, разделяющего поля. Если заголовок отсутствует, возвращается None; значение KeyError никогда не задается.

Обратите внимание, что если именованное поле появляется в заголовках сообщения более одного раза, не определено, какое именно из значений этого поля будет возвращено. Используйте метод get_all(), чтобы получить значения всех существующих заголовков с именем name.

При использовании стандартных политик (отличных от compat32) возвращаемое значение является экземпляром подкласса email.headerregistry.BaseHeader.

__setitem__(name, val)

Добавьте заголовок к сообщению с именем поля name и значением val. Поле добавляется в конец существующих заголовков сообщения.

Обратите внимание, что это не приводит к замене или удалению любого существующего заголовка с таким же именем. Если вы хотите убедиться, что новый заголовок является единственным, который присутствует в сообщении с именем поля, сначала удалите это поле, например:

del msg['subject']
msg['subject'] = 'Python roolz!'

Если policy определяет уникальность определенных заголовков (как это делают стандартные политики), этот метод может вызвать ValueError при попытке присвоить значение такому заголовку, когда он уже существует. Такое поведение является преднамеренным в целях обеспечения согласованности, но не зависит от него, поскольку в будущем мы можем сделать так, чтобы такие назначения автоматически удаляли существующий заголовок.

__delitem__(name)

Удалите все упоминания поля с именем name из заголовков сообщения. Исключение не возникает, если именованное поле отсутствует в заголовках.

keys()

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

values()

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

items()

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

get(name, failobj=None)

Возвращает значение поля именованного заголовка. Это значение идентично __getitem__(), за исключением того, что необязательный failobj возвращается, если именованный заголовок отсутствует (failobj по умолчанию имеет значение None).

Вот несколько дополнительных полезных методов, связанных с заголовком:

get_all(name, failobj=None)

Возвращает список всех значений для поля с именем name. Если в сообщении нет таких именованных заголовков, возвращается failobj (по умолчанию None).

add_header(_name, _value, **_params)

Расширенная настройка заголовка. Этот метод аналогичен __setitem__(), за исключением того, что в качестве аргументов ключевого слова могут быть предоставлены дополнительные параметры заголовка. _name - это поле заголовка для добавления, а _value - это основное значение для заголовка.

Для каждого элемента в словаре аргументов ключевого слова _params в качестве имени параметра берется ключ, а символы подчеркивания преобразуются в тире (поскольку тире недопустимы в идентификаторах Python). Обычно параметр добавляется как key="value", если только его значение не равно None, и в этом случае будет добавлен только ключ.

Если значение содержит символы, отличные от ASCII, то кодировкой и языком можно явно управлять, указав значение в виде кортежа из трех элементов в формате (CHARSET, LANGUAGE, VALUE), где CHARSET - это строка с именем кодировки, которая будет использоваться для кодирования значения, LANGUAGE обычно может быть задано как None или как пустая строка (другие варианты смотрите в RFC 2231), а VALUE - это строковое значение, содержащее кодовые точки, отличные от ASCII. Если кортеж из трех элементов не передан и значение содержит символы, отличные от ASCII, оно автоматически кодируется в формате RFC 2231 с использованием CHARSET из utf-8 и LANGUAGE из None.

Вот пример:

msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')

Это добавит заголовок, который будет выглядеть следующим образом

Content-Disposition: attachment; filename="bud.gif"

Пример расширенного интерфейса с символами, отличными от ASCII:

msg.add_header('Content-Disposition', 'attachment',
               filename=('iso-8859-1', '', 'Fußballer.ppt'))
replace_header(_name, _value)

Замените заголовок. Замените первый заголовок, найденный в сообщении, который соответствует _name, сохранив порядок заголовков и регистр имен полей исходного заголовка. Если соответствующий заголовок не найден, введите KeyError.

get_content_type()

Возвращает тип содержимого сообщения, приведенный к нижнему регистру формы maintype/subtype. Если в сообщении нет заголовка Content-Type, верните значение, возвращаемое с помощью get_default_type(). Если заголовок Content-Type неверен, верните text/plain.

(Согласно RFC 2045, сообщения всегда имеют тип по умолчанию, get_content_type() всегда будет возвращать значение. RFC 2045 определяет тип сообщения по умолчанию как text/plain, если только оно не отображается внутри контейнера multipart/digest, в этом случае это будет message/rfc822. Если заголовок Content-Type содержит недопустимую спецификацию типа, RFC 2045 требует, чтобы типом по умолчанию был text/plain.)

get_content_maintype()

Возвращает основной тип содержимого сообщения. Это maintype часть строки, возвращаемая get_content_type().

get_content_subtype()

Возвращает тип вложенного содержимого сообщения. Это subtype часть строки, возвращаемая get_content_type().

get_default_type()

Возвращает тип содержимого по умолчанию. Большинство сообщений имеют тип содержимого по умолчанию text/plain, за исключением сообщений, которые являются подразделами контейнеров multipart/digest. Такие подразделы имеют тип содержимого по умолчанию message/rfc822.

set_default_type(ctype)

Установите тип контента по умолчанию. ctype должен быть либо text/plain, либо message/rfc822, хотя это не обязательно. Тип содержимого по умолчанию не сохраняется в заголовке Content-Type, поэтому он влияет на возвращаемое значение методов get_content_type только в том случае, если в сообщении отсутствует заголовок Content-Type.

set_param(param, value, header='Content-Type', requote=True, charset=None, language='', replace=False)

Задайте параметр в заголовке Content-Type. Если параметр уже существует в заголовке, замените его значение на value. Если значение header равно Content-Type (по умолчанию), а заголовок еще не существует в сообщении, добавьте его, установите для него значение text/plain и добавьте новое значение параметра. Необязательный заголовок указывает альтернативный заголовок Content-Type.

Если значение содержит символы, отличные от ASCII, кодировка и язык могут быть явно указаны с помощью необязательных параметров charset и language. Необязательный language указывает язык RFC 2231, по умолчанию используется пустая строка. Как кодировка, так и язык должны быть строками. По умолчанию для языка используются utf8 кодировка и None.

Если значение replace равно False (по умолчанию), заголовок перемещается в конец списка заголовков. Если значение replace равно True, заголовок будет обновлен на месте.

Использование параметра requote с объектами EmailMessage не рекомендуется.

Обратите внимание, что к существующим значениям параметров заголовков можно получить доступ через атрибут params значения заголовка (например, msg['Content-Type'].params['charset']).

Изменено в версии 3.4: replace добавлено ключевое слово.

del_param(param, header='content-type', requote=True)

Полностью удалите данный параметр из заголовка Content-Type. Заголовок будет переписан без параметра или его значения. Необязательный заголовок указывает альтернативу Content-Type.

Использование параметра requote с объектами EmailMessage не рекомендуется.

get_filename(failobj=None)

Возвращает значение параметра filename в заголовке Content-Disposition сообщения. Если заголовок не содержит параметра filename, этот метод возвращается к поиску параметра name в заголовке Content-Type. Если ни один из них не найден или заголовок отсутствует, то возвращается failobj. Возвращаемая строка всегда будет без кавычек в соответствии с email.utils.unquote().

get_boundary(failobj=None)

Возвращает значение параметра boundary заголовка Content-Type сообщения или failobj, если либо заголовок отсутствует, либо у него нет параметра boundary. Возвращаемая строка всегда будет без кавычек в соответствии с email.utils.unquote().

set_boundary(boundary)

Установите для параметра boundary заголовка Content-Type значение boundary. set_boundary() при необходимости всегда будет указывать boundary в кавычках. HeaderParseError вызывается, если объект сообщения не имеет заголовка Content-Type.

Обратите внимание, что использование этого метода немного отличается от удаления старого заголовка Content-Type и добавления нового с новой границей через add_header(), поскольку set_boundary() сохраняет порядок заголовка Content-Type в список заголовков.

get_content_charset(failobj=None)

Возвращает параметр charset заголовка Content-Type, преобразованный в нижний регистр. Если нет заголовка Content-Type или если у этого заголовка нет параметра charset, возвращается failobj.

get_charsets(failobj=None)

Возвращает список, содержащий названия наборов символов в сообщении. Если сообщение содержит multipart, то список будет содержать по одному элементу для каждой части полезной нагрузки, в противном случае это будет список длиной 1.

Каждый элемент в списке будет представлять собой строку, которая является значением параметра charset в заголовке Content-Type для представленного подраздела. Если подраздел не имеет заголовка Content-Type, параметра charset или не имеет основного MIME-типа text, то этим элементом в возвращаемом списке будет failobj.

is_attachment()

Возвращает True, если есть заголовок Content-Disposition и его значение (без учета регистра) равно attachment, False в противном случае.

Изменено в версии 3.4.2: is_attachment теперь является методом, а не свойством, для обеспечения согласованности с is_multipart().

get_content_disposition()

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

Добавлено в версии 3.5.

Следующие методы относятся к запросам и манипулированию содержимым (полезной нагрузкой) сообщения.

walk()

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

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

>>> for part in msg.walk():
...     print(part.get_content_type())
multipart/report
text/plain
message/delivery-status
text/plain
text/plain
message/rfc822
text/plain

walk выполняет итерацию по подразделам любой части, где is_multipart() возвращает True, хотя msg.get_content_maintype() == 'multipart' может возвращать False. Мы можем увидеть это в нашем примере, используя вспомогательную функцию отладки _structure:

>>> from email.iterators import _structure
>>> for part in msg.walk():
...     print(part.get_content_maintype() == 'multipart',
...           part.is_multipart())
True True
False False
False True
False False
False False
False True
False False
>>> _structure(msg)
multipart/report
    text/plain
    message/delivery-status
        text/plain
        text/plain
    message/rfc822
        text/plain

Здесь message частями не являются multiparts, но они содержат подразделы. is_multipart() возвращает True, а walk переходит в подразделы.

get_body(preferencelist=('related', 'html', 'plain'))

Верните часть MIME, которая лучше всего подходит на роль «тела» сообщения.

preferencelist должен представлять собой последовательность строк из набора related, html, и plain и указывает порядок предпочтения для типа содержимого возвращаемой части.

Начните поиск возможных совпадений с объектом, для которого вызывается метод get_body.

Если related не включен в список предпочтений, рассмотрите корневую часть (или подраздел корневой части) любого связанного файла в качестве кандидата, если (под) часть соответствует предпочтению.

При обнаружении multipart/related проверьте параметр start и, если найдена деталь с совпадением Content-ID, учитывайте только ее при поиске возможных совпадений. В противном случае рассмотрим только первую (по умолчанию корневую) часть multipart/related.

Если сторона имеет заголовок Content-Disposition, считайте эту часть подходящим совпадением только в том случае, если значение заголовка равно inline.

Если ни один из кандидатов не соответствует ни одному из параметров в preferencelist, верните None.

Примечания: (1) Для большинства приложений единственными комбинациями списка предпочтений, которые действительно имеют смысл, являются ('plain',), ('html', 'plain'), и значение по умолчанию ('related', 'html', 'plain'). (2) Поскольку сопоставление начинается с объекта, для которого вызывается get_body, вызов get_body для multipart/related вернет сам объект, если только preferencelist не имеет значения по умолчанию. (3) Сообщения (или части сообщений), в которых не указан Content-Type или заголовок которых Content-Type недопустим, будут обрабатываться так, как если бы они имели тип text/plain, что иногда может привести к появлению get_body чтобы вернуть неожиданные результаты.

iter_attachments()

Возвращает итератор по всем непосредственным подразделам сообщения, которые не являются потенциальными частями «тела». То есть, пропустите первое вхождение каждого из text/plain, text/html, multipart/related, или multipart/alternative (если только они явно не помечены как вложения с помощью Content-Disposition: attachment), и верните все оставшиеся части. При применении непосредственно к multipart/related возвращает итератор по всем связанным частям, кроме корневой части (т.е. части, на которую указывает параметр start, или первой части, если параметр start отсутствует или параметр start не соответствует параметру Content-ID ни в одной из частей). При применении непосредственно к multipart/alternative или не к multipart возвращает пустой итератор.

iter_parts()

Возвращает итератор для всех непосредственных частей сообщения, которые будут пустыми для значения, отличного от multipart. (Смотрите также walk().)

get_content(*args, content_manager=None, **kw)

Вызовите get_content() метод content_manager, передав self в качестве объекта message и передав любые другие аргументы или ключевые слова в качестве дополнительных аргументов. Если content_manager не указан, используйте content_manager, указанный текущим policy.

set_content(*args, content_manager=None, **kw)

Вызовите set_content() метод content_manager, передав self в качестве объекта message и передав любые другие аргументы или ключевые слова в качестве дополнительных аргументов. Если content_manager не указан, используйте content_manager, указанный текущим policy.

Преобразуйте сообщение, отличное от multipart, в сообщение multipart/related, переместив все существующие заголовки Content- и полезную нагрузку в (новую) первую часть multipart. Если указано значение boundary, используйте его в качестве строки границы в multipart, в противном случае оставьте границу автоматически создаваемой, когда это необходимо (например, при сериализации сообщения).

make_alternative(boundary=None)

Преобразуйте не multipart или multipart/related в multipart/alternative, переместив все существующие Content- заголовки и полезную нагрузку в (новую) первую часть multipart. Если указано значение boundary, используйте его в качестве строки границы в multipart, в противном случае оставьте границу автоматически создаваемой, когда это необходимо (например, при сериализации сообщения).

make_mixed(boundary=None)

Преобразуйте не multipart, не multipart/related или не multipart-alternative в multipart/mixed, переместив все существующие Content- заголовки и полезную нагрузку в (новую) первую часть из числа multipart. Если указано значение boundary, используйте его в качестве строки границы в multipart, в противном случае оставьте границу автоматически создаваемой, когда это необходимо (например, при сериализации сообщения).

Если сообщение является multipart/related, создайте новый объект message, передайте все аргументы его методу set_content(), а attach() - методу multipart. Если сообщение не является multipart, вызовите make_related() и затем действуйте, как описано выше. Если сообщение имеет любой другой тип multipart, вызовите TypeError. Если content_manager не указан, используйте content_manager, указанный текущим policy. Если добавляемая часть не имеет заголовка Content-Disposition, добавьте заголовок со значением inline.

add_alternative(*args, content_manager=None, **kw)

Если сообщение является multipart/alternative, создайте новый объект message, передайте все аргументы его методу set_content(), а attach() - методу multipart. Если сообщение отличается от multipart или multipart/related, вызовите make_alternative() и затем действуйте, как описано выше. Если сообщение имеет любой другой тип multipart, создайте TypeError. Если content_manager не указан, используйте content_manager, указанный текущим policy.

add_attachment(*args, content_manager=None, **kw)

Если сообщение является multipart/mixed, создайте новый объект message, передайте все аргументы его методу set_content(), а attach() - методу multipart. Если сообщение не-multipart, multipart/related, или multipart/alternative, вызовите make_mixed() и затем действуйте, как описано выше. Если content_manager не указан, используйте content_manager, указанный текущим policy. Если добавляемая часть не имеет заголовка Content-Disposition, добавьте заголовок со значением attachment. Этот метод можно использовать как для явных вложений (Content-Disposition: attachment), так и для вложений inline (Content-Disposition: inline), передав соответствующие параметры в content_manager.

clear()

Удалите полезную нагрузку и все заголовки.

clear_content()

Удалите полезную нагрузку и все заголовки !Content-, оставив все остальные заголовки нетронутыми и в их первоначальном порядке.

EmailMessage объекты имеют следующие атрибуты экземпляра:

preamble

Формат MIME-документа допускает наличие некоторого количества текста между пустой строкой, следующей за заголовками, и первой разделительной строкой, состоящей из нескольких частей. Обычно этот текст никогда не отображается в программе чтения почты с поддержкой MIME, поскольку он выходит за рамки стандартной защиты MIME. Однако при просмотре необработанного текста сообщения или при просмотре сообщения в программе чтения, не поддерживающей MIME, этот текст может стать видимым.

Атрибут preamble содержит этот начальный дополнительный текст для MIME-документов. Когда Parser обнаруживает некоторый текст после заголовков, но перед первой строкой границы, он присваивает этот текст атрибуту preamble сообщения. Когда Generator записывает обычное текстовое представление MIME-сообщения и обнаруживает, что у сообщения есть атрибут preamble, он записывает этот текст в область между заголовками и первой границей. Более подробную информацию смотрите в разделах email.parser и email.generator.

Обратите внимание, что если объект message не имеет преамбулы, атрибутом preamble будет None.

epilogue

Атрибут epilogue действует так же, как и атрибут preamble, за исключением того, что он содержит текст, который появляется между последней границей и концом сообщения. Как и в случае с preamble, если нет текста послесловия, этот атрибут будет равен None.

defects

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

class email.message.MIMEPart(policy=default)

Этот класс представляет собой часть MIME-сообщения. Он идентичен EmailMessage, за исключением того, что заголовки MIME-Version не добавляются при вызове set_content(), поскольку подразделам не нужны собственные заголовки MIME-Version.

Сноски

Вернуться на верх