email.parser: Парсинг сообщений электронной почты
Исходный код: Lib/email/parser.py
Структуры объектов сообщений можно создать двумя способами: создать их с нуля, используя объект EmailMessage, добавить заголовки с помощью интерфейса словаря и добавить содержимое с помощью set_content() и родственных методов, или создать их, разобрав сериализованное представление сообщения электронной почты.
Пакет email предоставляет стандартный парсер, который понимает большинство структур документов электронной почты, включая MIME-документы. Вы можете передать парсеру объект типа байты, строку или файл, и парсер вернёт вам корневой объект EmailMessage структуры объекта. Для простых сообщений, не являющихся MIME, содержимое этого корневого объекта, скорее всего, будет строкой, содержащей текст сообщения. Для MIME-сообщений корневой объект вернёт True от своего метода is_multipart(), а к подчастям можно получить доступ с помощью методов манипулирования содержимым, таких как get_body(), iter_parts() и walk().
На самом деле доступны два интерфейса парсеров: Parser и инкрементальный FeedParser. Интерфейс Parser наиболее полезен, если у вас есть весь текст сообщения в памяти или если всё сообщение хранится в файле на файловой системе. FeedParser более подходит, когда вы читаете сообщение из потока, который может блокироваться в ожидании дополнительного ввода (например, при чтении сообщения электронной почты из сокета). FeedParser может обрабатывать и разбирать сообщение по частям и возвращает только корневой объект при закрытии парсера.
Обратите внимание, что парсер можно расширить в ограниченной степени, а, конечно же, вы можете реализовать свой собственный парсер с нуля. Вся логика, которая связывает встроенный парсер пакета email и класс EmailMessage, воплощена в классе policy, поэтому пользовательский парсер может создавать деревья объектов сообщений любым необходимым способом путём реализации пользовательских версий соответствующих policy методов.
API FeedParser
Класс BytesFeedParser, импортированный из модуля email.feedparser, предоставляет API, подходящий для поэтапного разбора сообщений электронной почты, что необходимо при чтении текста сообщения электронной почты из источника, который может блокироваться (например, из сокета). Класс BytesFeedParser, конечно, может использоваться для разбора сообщения электронной почты, полностью содержащегося в объекте типа байты, строке или файле, но 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 всегда должно быть указано; по умолчанию в будущей версии Python будет
email.policy.default.Новое в версии 3.2.
Изменено в версии 3.3: Добавлено ключевое слово policy.
Изменено в версии 3.6: _factory по умолчанию — политика
message_factory.-
feed(data) -
Передать парсеру дополнительные данные. data должен быть объектом типа байты, содержащим одну или несколько строк. Строки могут быть частичными, и парсер правильно соединит такие частичные строки. Строки могут иметь любые три стандартных окончания строк: возврат каретки, перевод строки или возврат каретки и перевод строки (они могут даже быть смешанными).
-
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-Encoding, равным8bit).Необязательный параметр 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().
-
parsestr(text, headersonly=False) -
Аналогично методу
parse(), за исключением того, что он принимает строковый объект вместо объекта-подобного файлу. Вызов этого метода на строке эквивалентен обертыванию text в экземплярStringIOсначала и вызовуparse().Необязательный параметр headersonly такой же, как и в методе
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, в их списке атрибута defects будет экземпляр классаMultipartInvariantViolationDefect. Подробнее см.email.errors.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/email.parser.html