Spec-Zone.ru › Python 3.13

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. Значения словаря — это строки с дополнительными методами. Заголовки сохраняются и возвращаются с исходным регистром, но при сопоставлении имён полей регистр не учитывается. Ключи упорядочены, однако, в отличие от настоящего словаря, могут повторяться. Для работы с заголовками, имеющими повторяющиеся ключи, предусмотрены дополнительные методы.

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

class email.message.EmailMessage(policy=default)

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

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

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

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

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

Изменено в версии 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 можно использовать, чтобы переопределить политику по умолчанию, полученную из экземпляра сообщения. Это позволяет управлять некоторыми аспектами форматирования, выполняемого методом, поскольку указанная 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_maintype() == ‘multipart’» вернёт True. Например, is_multipart вернёт True, если EmailMessage имеет тип message/rfc822.

set_unixfrom(unixfrom)

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

get_unixfrom()

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

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

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

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

__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(), чтобы получить значения всех существующих заголовков с именем name.

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

__setitem__(name, val)

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

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

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

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

__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'))
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, после чего добавляется новое значение параметра. Необязательный параметр header задаёт альтернативный заголовок вместо Content-Type.

Если значение содержит символы, отличные от ASCII, набор символов и язык можно явно указать с помощью необязательных параметров charset и language. Необязательный параметр language задаёт язык RFC 2231; по умолчанию используется пустая строка. Значения обоих параметров — charset и language — должны быть строками. По умолчанию для charset используется utf8, а для language — 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. Заголовок перезаписывается на месте без параметра и его значения. Необязательный параметр header задаёт альтернативный заголовок вместо 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 в кавычки, если это необходимо. Если объект сообщения не содержит заголовка Content-Type, возбуждается исключение HeaderParseError.

Обратите внимание: этот метод немного отличается от удаления старого заголовка 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. Возможные значения этого метода — 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:

>>> 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 не входит в preferencelist, корневая часть (или подчасть корневой части) любого встреченного связанного объекта рассматривается как кандидат, если эта часть соответствует одному из предпочтений.

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

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

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

Примечания: (1) Для большинства приложений имеют смысл только следующие сочетания preferencelist: ('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 в качестве объекта сообщения и передавая все остальные аргументы и именованные аргументы как дополнительные аргументы. Если content_manager не указан, используется content_manager, заданный текущим объектом policy.

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

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

make_related(boundary=None)

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

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

Если сообщение имеет тип multipart/related, создаёт новый объект сообщения, передаёт все аргументы его методу 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, создаёт новый объект сообщения, передаёт все аргументы его методу 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, создаёт новый объект сообщения, передаёт все аргументы его методу 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-документа допускает наличие текста между пустой строкой после заголовков и первой строкой-разделителем multipart. Обычно этот текст не виден в почтовых программах, поддерживающих MIME, поскольку он находится за пределами стандартной MIME-области. Однако при просмотре исходного текста сообщения или при просмотре сообщения в программе, не поддерживающей MIME, этот текст может стать видимым.

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

Если у объекта сообщения нет преамбулы, атрибут preamble будет иметь значение None.

epilogue

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

defects

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

class email.message.MIMEPart(policy=default)

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

Сноски

[1]

Впервые добавлен в версии 3.4 как предварительный модуль. Документация по устаревшему классу сообщений перенесена в раздел email.message.Message: представление сообщения электронной почты с помощью API compat32.

© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/email.message.html

Spec-Zone.ru

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