email.parser: Парсинг сообщений электронной почты
Исходный код: Lib/email/parser.py
Структуры объектов сообщений могут быть созданы двумя способами: они могут быть созданы с нуля путём создания объекта EmailMessage, добавления заголовков с помощью интерфейса словаря и добавления содержимого с помощью set_content() и связанных методов, или они могут быть созданы путём парсинга сериализованного представления сообщения электронной почты.
Пакет email предоставляет стандартный парсер, который понимает большинство структур документов электронной почты, включая MIME-документы. Вы можете передать парсеру объект типа bytes, строку или файл, и парсер вернёт вам корневой объект EmailMessage структуры объекта. Для простых, не-MIME сообщений содержимое этого корневого объекта, вероятно, будет строкой, содержащей текст сообщения. Для MIME-сообщений корневой объект вернёт значение True из его метода is_multipart(), а к подчастям можно получить доступ через методы манипулирования содержимым, такие как get_body(), iter_parts() и walk().
На самом деле доступны два интерфейса парсеров: API Parser и инкрементальный API FeedParser. API Parser наиболее полезен, если у вас есть весь текст сообщения в памяти или если всё сообщение находится в файле на файловой системе. FeedParser более подходит, когда вы читаете сообщение из потока, который может блокироваться, ожидая дополнительного ввода (например, чтения сообщения электронной почты из сокета). FeedParser может потреблять и парсить сообщение по частям и возвращает корневой объект только при закрытии парсера.
Обратите внимание, что парсер можно расширить ограниченными способами, и, конечно, вы можете реализовать свой собственный парсер с нуля. Вся логика, которая связывает встроенный парсер пакета email и класс EmailMessage, воплощена в классе Policy, поэтому пользовательский парсер может создавать деревья объектов сообщений любым необходимым способом, реализуя пользовательские версии соответствующих Policy методов.
API FeedParser
Класс BytesFeedParser, импортированный из модуля email.feedparser, предоставляет API, подходящий для инкрементального парсинга сообщений электронной почты, что необходимо при чтении текста сообщения электронной почты из источника, который может блокироваться (например, из сокета). Класс BytesFeedParser, конечно, может использоваться для полного парсинга сообщения электронной почты, содержащегося в объекте типа bytes, строке или файле, но API BytesParser может быть более удобным для таких случаев. Семантика и результаты двух API парсеров идентичны.
API класса BytesFeedParser прост: вы создаёте экземпляр, передаёте ему набор байтов, пока не закончите передачу, затем закрываете парсер, чтобы получить корневой объект сообщения. BytesFeedParser чрезвычайно точно парсит стандартные сообщения и хорошо справляется с нестандартными, предоставляя информацию о том, как сообщение было определено как некорректное. Он заполнит атрибут defects объекта сообщения списком любых проблем, обнаруженных в сообщении. Смотрите модуль email.errors для списка ошибок, которые он может найти.
Вот API для класса BytesFeedParser:
-
class email.parser.BytesFeedParser(_factory=None, *, policy=policy.compat32) -
Создаёт экземпляр
BytesFeedParser. Необязательный параметр _factory — вызываемый объект без аргументов; если не указан, используетсяmessage_factoryиз policy. Вызывается _factory всякий раз, когда требуется новый объект сообщения.Если указан policy, используются его правила для обновления представления сообщения. Если policy не задан, используется политика
compat32, которая обеспечивает обратную совместимость с версией пакета email Python 3.2 и предоставляетMessageв качестве фабрики по умолчанию. Все остальные политики предоставляютEmailMessageв качестве значения по умолчанию для _factory. Для получения дополнительной информации о том, что ещё контролирует policy, см. документацию кpolicy.Примечание: ключевое слово policy всегда должно быть указано; значение по умолчанию будет изменено на
email.policy.defaultв будущих версиях Python.Добавлен в версии 3.2.
Изменено в версии 3.3: Добавлено ключевое слово policy.
Изменено в версии 3.6: _factory по умолчанию — политика
message_factory.-
feed(data) -
Передать парсеру дополнительные данные. data должен быть объектом типа bytes-like object, содержащим одну или несколько строк. Строки могут быть частичными, и парсер правильно склеит такие частичные строки. Строки могут иметь любые три стандартных окончания строк: возврат каретки, перевод строки или возврат каретки и перевод строки (они даже могут быть смешаны).
-
close() -
Завершить парсинг всех ранее переданных данных и вернуть корневой объект сообщения. Неопределённо, что произойдёт, если метод
feed()будет вызван после вызова этого метода.
-
-
class email.parser.FeedParser(_factory=None, *, policy=policy.compat32) -
Работает как
BytesFeedParser, за исключением того, что вход в методfeed()должен быть строкой. Это имеет ограниченную полезность, поскольку единственный способ для такого сообщения быть валидным — содержать только текст ASCII или, еслиutf8—True, не содержать бинарных вложений.Изменено в версии 3.3: Добавлено ключевое слово policy.
API парсера
Класс BytesParser, импортированный из модуля email.parser, предоставляет API, который можно использовать для разбора сообщения, когда всё содержимое сообщения доступно в объекте типа байты или файле. Модуль email.parser также предоставляет парсер Parser для разбора строк, а также парсеры только заголовков BytesHeaderParser и HeaderParser, которые можно использовать, если вас интересуют только заголовки сообщения. BytesHeaderParser и HeaderParser могут быть значительно быстрее в этих ситуациях, поскольку они не пытаются разобрать тело сообщения, вместо этого устанавливая содержимое в исходное тело.
-
class email.parser.BytesParser(_class=None, *, policy=policy.compat32) -
Создаёт экземпляр
BytesParser. Аргументы _class и policy имеют такое же значение и семантику, как аргументы _factory и policy классаBytesFeedParser.Примечание: Ключевое слово policy всегда должно быть указано; по умолчанию будет
email.policy.defaultв будущей версии Python.Изменено в версии 3.3: Удален аргумент strict, который был устаревшим в версии 2.4. Добавлен ключевой параметр policy.
Изменено в версии 3.6: Значение по умолчанию для _class — политика
message_factory.-
parse(fp, headersonly=False) -
Считывает все данные из двоичного объекта-подобного файлу fp, анализирует полученные байты и возвращает объект сообщения. fp должен поддерживать как метод
readline(), так и методread().Байты в fp должны быть отформатированы как блок заголовков в стиле RFC 5322 (или, если
utf8равноTrue, RFC 6532), в том числе строки продолжения заголовков, необязательно предваряемые заголовком конверта. Блок заголовков завершается либо концом данных, либо пустой строкой. После блока заголовков идёт тело сообщения (которое может содержать закодированные MIME-субчасти, включая субчасти с Content-Transfer-Encoding8bit).Необязательный параметр headersonly — флаг, определяющий, нужно ли остановить парсинг после чтения заголовков или нет. Значение по умолчанию —
False, что означает, что он парсит всё содержимое файла.
-
parsebytes(bytes, headersonly=False) -
Аналогичен методу
parse(), но вместо объекта типа файл принимает объект типа байты. Вызов этого метода на объекте типа байты эквивалентен обертыванию bytes в экземплярBytesIOи вызовуparse().Необязательный параметр headersonly такой же, как в методе
parse().
Добавлен в версии 3.2.
-
-
class email.parser.BytesHeaderParser(_class=None, *, policy=policy.compat32) -
Точно такой же, как
BytesParser, за исключением того, что headersonly по умолчаниюTrue.Добавлен в версии 3.3.
-
class email.parser.Parser(_class=None, *, policy=policy.compat32) -
Этот класс аналогичен
BytesParser, но обрабатывает входные данные в виде строки.Изменено в версии 3.3: Удален аргумент strict. Добавлен ключевой параметр policy.
Изменено в версии 3.6: Значение по умолчанию для _class — политика
message_factory.-
parse(fp, headersonly=False) -
Считывает все данные из текстового объекта-подобного файлу fp, анализирует полученный текст и возвращает корневой объект сообщения. fp должен поддерживать методы
readline()иread()для объектов типа файл.Кроме требования к режиму работы с текстом, этот метод работает так же, как
BytesParser.parse().
-
-
class email.parser.HeaderParser(_class=None, *, policy=policy.compat32) -
Точно такой же, как
Parser, за исключением того, что headersonly по умолчаниюTrue.
Поскольку создание структуры объекта сообщения из строки или объекта файла является такой распространённой задачей, предоставляются четыре функции для удобства. Они доступны в пространстве имён пакета email.
-
email.message_from_bytes(s, _class=None, *, policy=policy.compat32) -
Возвращает структуру объекта сообщения из объекта типа байты. Это эквивалентно
BytesParser().parsebytes(s). Необязательные параметры _class и policy интерпретируются так же, как при создании объектаBytesParser.Добавлен в версии 3.2.
Изменено в версии 3.3: Удален аргумент strict. Добавлен ключевой параметр policy.
-
email.message_from_binary_file(fp, _class=None, *, policy=policy.compat32) -
Возвращает структуру дерева объекта сообщения из открытого двоичного объекта файла. Это эквивалентно
BytesParser().parse(fp). Параметры _class и policy интерпретируются так же, как при создании объектаBytesParser.Добавлен в версии 3.2.
Изменено в версии 3.3: Удален аргумент strict. Добавлен ключевой параметр policy.
-
email.message_from_string(s, _class=None, *, policy=policy.compat32) -
Возвращает структуру объекта сообщения из строки. Это эквивалентно
Parser().parsestr(s). Параметры _class и policy интерпретируются так же, как при создании объектаParser.Изменено в версии 3.3: Удален аргумент strict. Добавлен ключевой параметр policy.
-
email.message_from_file(fp, _class=None, *, policy=policy.compat32) -
Возвращает структуру дерева объекта сообщения из открытого объекта файла. Это эквивалентно
Parser().parse(fp). _class и policy интерпретируются так же, как и в конструкторе классаParser.Изменено в версии 3.3: Убран аргумент strict. Добавлено ключевое слово policy.
Изменено в версии 3.6: _class по умолчанию имеет значение политики
message_factory.
Вот пример использования message_from_bytes() в интерактивном режиме Python:
>>> import email >>> msg = email.message_from_bytes(myBytes)
Дополнительные заметки
Ниже приведены некоторые заметки по семантике разбора:
- Большинство сообщений типа, не являющихся multipart, анализируются как один объект сообщения с текстовой полезной нагрузкой. Эти объекты вернут
Falseдляis_multipart(), аiter_parts()вернёт пустой список. - Все сообщения типа multipart анализируются как контейнерный объект сообщения со списком подчинённых объектов сообщения для их полезной нагрузки. Внешний контейнерный объект сообщения вернёт
Trueдляis_multipart(), аiter_parts()вернёт список подчастей. - Большинство сообщений с типом содержимого message/* (таких как message/delivery-status и message/rfc822) также будут анализироваться как контейнерный объект, содержащий список полезной нагрузки длиной 1. Их метод
is_multipart()вернётTrue. Единственный элемент, возвращаемыйiter_parts(), будет объектом подсообщения. - Некоторые сообщения, не соответствующие стандартам, могут не быть внутренне согласованными относительно их multipart-ности. Такие сообщения могут иметь заголовок Content-Type типа multipart, но их метод
is_multipart()может возвращатьFalse. Если такие сообщения были проанализированы с помощьюFeedParser, они будут содержать экземпляр классаMultipartInvariantViolationDefectв списке атрибутов defects. Подробности см. вemail.errors.
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/email.parser.html