email — Пакет обработки электронных писем и MIME
Исходный код: Lib/email/__init__.py
Пакет email представляет собой библиотеку для управления электронными письмами, включая MIME и другие документы сообщений на основе RFC 2822. Он не предназначен для отправки электронных писем по SMTP (RFC 2821), NNTP или другим серверам; эти функции предоставляются модулями, такими как smtplib и nntplib. Пакет email стремится к максимальной соответствию RFC, поддерживая, помимо RFC 2822, такие RFC, связанные с MIME, как RFC 2045, RFC 2046, RFC 2047 и RFC 2231.
Основной отличительной чертой пакета email является разделение парсинга и генерации электронных писем от внутреннего представления модели объектов электронного письма. Приложения, использующие пакет email, в основном работают с объектами; вы можете добавлять подобъекты к сообщениям, удалять подобъекты из сообщений, полностью перестраивать содержимое и т. д. Существует отдельный парсер и отдельный генератор, обрабатывающие преобразование из простого текста в модель объекта и обратно. Также доступны удобные подклассы для некоторых распространённых типов MIME-объектов и несколько вспомогательных утилит, которые помогают при выполнении таких задач, как извлечение и парсинг значений полей сообщений, создание RFC-совместимых дат и т. д.
В следующих разделах описывается функциональность пакета email. Порядок следования соответствует обычному порядку в приложениях: электронное письмо читается как простой текст из файла или другого источника, текст парсится для получения структуры объекта электронного письма, эта структура обрабатывается, и, наконец, дерево объекта преобразуется обратно в простой текст.
Совершенно возможно создать структуру объекта с нуля — то есть полностью с нуля. Затем можно выполнить аналогичный порядок действий, как описано выше.
Также включены подробные описания всех классов и модулей, предоставляемых пакетом email, классов исключений, которые могут возникнуть при использовании пакета email, некоторых вспомогательных утилит и нескольких примеров. Для пользователей более старого пакета mimelib или предыдущих версий пакета email предоставлен раздел о различиях и переносе.
Содержание документации пакета email:
- 19.1.1.
email.message: Представление электронного письма -
19.1.2.
email.parser: Парсинг электронных писем - 19.1.3.
email.generator: Генерация MIME-документов - 19.1.4.
email.policy: Объекты политик - 19.1.5.
email.headerregistry: Пользовательские объекты заголовков -
19.1.6.
email.contentmanager: Управление содержимым MIME - 19.1.7.
email.mime: Создание электронных писем и MIME-объектов с нуля - 19.1.8.
email.header: Локализованные заголовки - 19.1.9.
email.charset: Представление кодировок символов - 19.1.10.
email.encoders: Кодировщики - 19.1.11.
email.errors: Классы исключений и дефектов - 19.1.12.
email.utils: Разные вспомогательные утилиты - 19.1.13.
email.iterators: Итераторы -
19.1.14.
email: Примеры
15. История пакета
В этой таблице представлена история выпусков пакета email, соответствующая версии Python, с которой он был выпущен. Для целей этого документа, при упоминании изменений или добавленных версий, речь идет о версии Python, а не версии пакета email. Эта таблица также описывает совместимость каждой версии пакета с Python.
| Версия email | Выпущено с | Совместимость |
|---|---|---|
1.x | Python 2.2.0–2.2.1 | больше не поддерживается |
2.5 | Python 2.2.2+ и Python 2.3 | Python 2.1–2.5 |
3.0 | Python 2.4 и Python 2.5 | Python 2.3–2.6 |
4.0 | Python 2.5–2.7 | Python 2.3–2.7 |
5.0 | Python 3.0 и Python 3.1 | Python 3.0–3.2 |
5.1 | Python 3.2 | Python 3.2 |
После версии 5.1 (Python 3.2) пакет email больше не имеет версии, отдельной от версии Python. (Подробные сведения об изменениях см. в документах Что нового в Python для соответствующих версий Python.)
Вот основные различия между версией email 5.1 и 5.0:
- Теперь снова можно парсить сообщения, содержащие не-ASCII байты, и воспроизводить такие сообщения, если данные, содержащие не-ASCII байты, не были изменены.
- Новые функции
message_from_bytes()иmessage_from_binary_file(), а также новые классыBytesFeedParserиBytesParserпозволяют парсить данные двоичных сообщений в объекты модели. - При вводе байтов в модель,
get_payload()по умолчанию декодирует тело сообщения, у которого Content-Transfer-Encoding равен8bit, используя кодировку символов, указанную в заголовках MIME, и возвращает полученную строку. - При вводе байтов в модель,
Generatorбудет преобразовывать тела сообщений, у которых Content-Transfer-Encoding равен 8bit, в 7bit Content-Transfer-Encoding. - Новый класс
BytesGeneratorгенерирует байты в качестве выходных данных, сохраняя любые неизменённые данные не-ASCII, которые присутствовали в входных данных, использованных для построения модели, включая тела сообщений с Content-Transfer-Encoding равным 8bit.
Ниже приведены основные отличия между email версией 5.0 и версией 4:
- Все операции выполняются со строками Unicode. Входные текстовые данные должны быть строками, текстовые выходные данные — строками. Выходные данные ограничены набором ASCII-символов и могут быть закодированы в ASCII для передачи. Входные данные также ограничены ASCII; это признанное ограничение email 5.0, что означает, что он может использоваться только для разбора электронных писем, которые являются 7bit-чистыми.
Ниже приведены основные отличия между email версией 4 и версией 3:
- Все модули были переименованы в соответствии со стандартами PEP 8. Например, модуль версии 3
email.Messageбыл переименован вemail.messageв версии 4. -
Был добавлен новый подпакет
email.mime, и все модули версии 3email.MIME*были переименованы и размещены в подпакетеemail.mime. Например, модуль версии 3email.MIMETextбыл переименован вemail.mime.text.Обратите внимание, что имена версии 3 будут продолжать работать до Python 2.6.
- Был добавлен модуль
email.mime.application, который содержит классMIMEApplication. - Методы, которые были устаревшими в версии 3, были удалены. К ним относятся
Generator.__call__(),Message.get_type(),Message.get_main_type(),Message.get_subtype(). - Были добавлены исправления для поддержки RFC 2231, которые могут изменить некоторые типы возвращаемых значений для
Message.get_paramи аналогичных функций. В некоторых случаях значения, которые раньше возвращали кортеж из 3 элементов, теперь возвращают простые строки (конкретно, если все расширенные сегменты параметров были не закодированы, не ожидается обозначения языка и кодировки, поэтому тип возвращаемого значения теперь является простой строкой). Кроме того, декодирование с помощью %-символа раньше выполнялось как для закодированных, так и для незакодированных сегментов; теперь это декодирование выполняется только для закодированных сегментов.
Ниже приведены основные отличия между email версией 3 и версией 2:
- Был представлен класс
FeedParser, и классParserбыл реализован на основеFeedParser. Таким образом, весь процесс парсинга является нестрогим, и парсер постарается никогда не генерировать исключение. Проблемы, обнаруженные во время парсинга сообщений, хранятся в атрибуте defect сообщения. - Все аспекты API, которые в версии 2 вызывали
DeprecationWarning, были удалены. К ним относятся аргумент _encoder конструкторуMIMEText, методMessage.add_payload(), функцияUtils.dump_address_pair(), и функцииUtils.decode()иUtils.encode(). - Были добавлены новые
DeprecationWarningдля:Generator.__call__(),Message.get_type(),Message.get_main_type(),Message.get_subtype(), и аргумента strict классаParser. Ожидается, что они будут удалены в будущих версиях. - Поддержка версий Python, более ранних чем 2.3, была удалена.
Ниже приведены отличия между email версией 2 и версией 1:
- Были добавлены модули
email.Headerиemail.Charset. - Изменился формат сохранения в формате pickle для экземпляров
Message. Поскольку он никогда (и по-прежнему не) был формально определён, это не считается нарушением обратной совместимости. Однако, если ваше приложение сохраняет и восстанавливает экземплярыMessage, имейте в виду, что в версииemail2, экземплярыMessageтеперь имеют закрытые переменные _charset и _default_type. - Некоторые методы в классе
Messageбыли устаревшими или изменены их сигнатуры. Кроме того, было добавлено много новых методов. Подробности см. в документации для классаMessage. Изменения должны быть полностью обратной совместимы. -
Структура объекта изменилась в случае с типами контента message/rfc822. В версии
email1 такой тип представлялся скалярной полезной нагрузкой, т.е. сообщение-контейнер возвращалis_multipart()со значением false,get_payload()не был объектом списка, а единственным экземпляромMessage.Эта структура не соответствовала остальной части пакета, поэтому представление объекта для типов контента message/rfc822 было изменено. В версии
email2 контейнер действительно возвращаетTrueизis_multipart(), аget_payload()возвращает список, содержащий один элементMessage.Обратите внимание, что это один из случаев, когда полная обратная совместимость не была сохранена. Однако, если вы уже тестируете возвращаемый тип
get_payload(), всё должно быть в порядке. Вам просто нужно убедиться, что ваш код не выполняетset_payload()с экземпляромMessageдля контейнера с типом контента message/rfc822. - Аргумент strict конструктора
Parserбыл добавлен, а методыparse()иparsestr()получили аргумент headersonly. Флаг strict также был добавлен к функциямemail.message_from_file()иemail.message_from_string(). -
Generator.__call__()устарело; используйтеGenerator.flattenвместо этого. КлассGeneratorтакже получил методclone(). - Класс
DecodedGeneratorбыл добавлен в модульemail.generator. - Были добавлены промежуточные базовые классы
MIMENonMultipartиMIMEMultipart, которые были включены в иерархию классов для большинства других производных классов, связанных с MIME. - Аргумент _encoder конструктора
MIMETextустарел. Кодирование теперь происходит неявно на основе аргумента _charset. - Следующие функции в модуле
email.Utilsустарели:dump_address_pairs(),decode(), иencode(). Были добавлены следующие функции в модуль:make_msgid(),decode_rfc2231(),encode_rfc2231(), иdecode_params(). - Была добавлена непубличная функция
email.Iterators._structure().
16. Отличия от mimelib
Пакет email изначально был разработан как отдельная библиотека под названием mimelib. Были внесены изменения, чтобы имена методов были более согласованными, а некоторые методы или модули были добавлены или удалены. Семантика некоторых методов также изменилась. В основном, любая функциональность, доступная в mimelib, по-прежнему доступна в пакете email, хотя и зачастую другим способом. Обратная совместимость между пакетом mimelib и пакетом email не являлась приоритетом.
Ниже приводится краткое описание различий между пакетами mimelib и email, а также рекомендации по переносу ваших приложений.
Конечно, наиболее заметное различие между этими двумя пакетами заключается в том, что имя пакета было изменено на email. Кроме того, в пакете верхнего уровня есть следующие различия:
-
messageFromString()был переименован вmessage_from_string(). -
messageFromFile()был переименован вmessage_from_file().
Класс Message имеет следующие различия:
- Метод
asString()был переименован вas_string(). - Метод
ismultipart()был переименован вis_multipart(). - Метод
get_payload()получил необязательный аргумент decode. - Метод
getall()был переименован вget_all(). - Метод
addheader()был переименован вadd_header(). - Метод
gettype()был переименован вget_type(). - Метод
getmaintype()был переименован вget_main_type(). - Метод
getsubtype()был переименован вget_subtype(). - Метод
getparams()был переименован вget_params(). Также, в то время какgetparams()возвращал список строк,get_params()возвращает список пар кортежей, эффективно представляя пары ключ/значение параметров, разделенные знаком'='. - Метод
getparam()был переименован вget_param(). - Метод
getcharsets()был переименован вget_charsets(). - Метод
getfilename()был переименован вget_filename(). - Метод
getboundary()был переименован вget_boundary(). - Метод
setboundary()был переименован вset_boundary(). - Метод
getdecodedpayload()был удалён. Для получения аналогичной функциональности передайте значение 1 флагу decode методаget_payload(). - Метод
getpayloadastext()был удалён. Аналогичная функциональность поддерживается классомDecodedGeneratorв модулеemail.generator. - Метод
getbodyastext()был удалён. Вы можете получить аналогичную функциональность, создав итератор с помощьюtyped_subpart_iterator()в модулеemail.iterators.
Класс Parser не имеет различий в своём общедоступном интерфейсе. Он обладает дополнительными возможностями распознавания сообщений типа message/delivery-status, которые он представляет как экземпляр Message, содержащий отдельные Message подчасти для каждого блока заголовков в уведомлении о статусе доставки [1].
Класс Generator не имеет различий в своём общедоступном интерфейсе. В модуле email.generator есть новый класс, называемый DecodedGenerator, который предоставляет большую часть функциональности, ранее доступной в методе Message.getpayloadastext().
Следующие модули и классы были изменены:
- Аргументы конструктора класса
MIMEBase_major и _minor были изменены на _maintype и _subtype соответственно. - Класс/модуль
Imageбыл переименован вMIMEImage. Аргумент _minor был переименован в _subtype. - Класс/модуль
Textбыл переименован вMIMEText. Аргумент _minor был переименован в _subtype. -
Класс/модуль
MessageRFC822был переименован вMIMEMessage. Обратите внимание, что более ранняя версияmimelibназывала этот класс/модульRFC822, но это вызывало конфликт с модулем стандартной библиотеки Pythonrfc822на некоторых файловых системах, не учитывающих регистр.Также, класс
MIMEMessageтеперь представляет любой тип MIME сообщения с основным типом message. Он принимает необязательный аргумент _subtype, который используется для задания MIME подтипа. _subtype по умолчанию равен rfc822.
Модуль mimelib предоставил некоторые утилитарные функции в своих модулях address и date. Все эти функции были перемещены в модуль email.utils.
Класс/модуль MsgReader был удалён. Его функциональность наиболее полно поддерживается функцией body_line_iterator() в модуле email.iterators.
Примечания
| [1] | Уведомления о статусе доставки (DSN) определены в RFC 1894. |
© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/email.html