Содержание страницы
18.1. email – Пакет для работы с электронной почтой и MIME¶email – An email and MIME handling package
Новое в версии 2.2.
Пакет email – это библиотека для управления сообщениями электронной почты, включая MIME и другие документы сообщений на основе RFC 2822. Он включает большую часть функциональности нескольких более старых стандартных модулей, таких как rfc822, mimetools, multifile, и других нестандартных пакетов, например mimecntl. Он специально не предназначен для отправки сообщений электронной почты на SMTP (RFC 2821), NNTP или другие серверы; это функции таких модулей, как smtplib и nntplib. Пакет email стремится быть максимально совместимым с RFC, поддерживая, помимо RFC 2822, такие связанные с MIME RFC, как RFC 2045, RFC 2046, RFC 2047, и RFC 2231.
Основная отличительная особенность пакета email заключается в том, что он разделяет
анализ и создание сообщений электронной почты и внутреннее объектной модели
представление электронной почты. Приложения, использующие пакет email, работают
в основном с объектами; можно добавлять подобъекты в сообщения, удалять подобъекты
из сообщений, полностью перестраивать содержимое и т.д. Существуют отдельные
анализатор и генератор, которые выполняют преобразование из плоского текста
в объектную модель, а затем обратно в плоский текст. Также есть удобные
подклассы для некоторых распространенных типов MIME-объектов и несколько
вспомогательных утилит, помогающих в таких типовых задачах, как извлечение
и анализ значений полей сообщений, создание совместимых с RFC дат и т.д.
В следующих разделах описывается функциональность пакета email.
Порядок изложения соответствует типовой последовательности действий в приложениях:
сообщение электронной почты читается как плоский текст из файла или другого источника,
текст анализируется для создания объектной структуры сообщения, эта структура
изменяется, и, наконец, дерево объектов преобразуется обратно в плоский текст.
Вполне возможно создать объектную структуру с нуля – т.е. полностью с самого начала. После этого можно выполнить те же шаги, что описаны выше.
Также включены подробные спецификации всех классов и модулей,
предоставляемых пакетом email, классов исключений, которые могут встретиться
при использовании пакета email, некоторые вспомогательные утилиты и несколько
примеров. Для пользователей старого пакета mimelib или предыдущих версий
пакета email приведен раздел о различиях и переносе.
Содержание документации пакета email:
- 18.1.1.
email.message: Представление сообщения электронной почтыemail.message: Representing an email message - 18.1.2.
email.parser: Разбор сообщений электронной почтыemail.parser: Parsing email messages - 18.1.3.
email.generator: Генерация MIME-документовemail.generator: Generating MIME documents - 18.1.4.
email.mime: Создание объектов email и MIME с нуляemail.mime: Creating email and MIME objects from scratch - 18.1.5.
email.header: Интернационализированные заголовкиemail.header: Internationalized headers - 18.1.6.
email.charset: Представление наборов символовemail.charset: Representing character sets - 18.1.7.
email.encoders: Кодировщикиemail.encoders: Encoders - 18.1.8.
email.errors: Классы исключений и дефектовemail.errors: Exception and Defect classes - 18.1.9.
email.utils: Прочие утилитыemail.utils: Miscellaneous utilities - 18.1.10.
email.iterators: Итераторыemail.iterators: Iterators - 18.1.11.
email: Примерыemail: Examples
18.1.12. История пакета¶Package History
Эта таблица описывает историю выпусков пакета email, соответствующую версии Python, с которой был выпущен пакет. Для целей данного документа: когда вы видите примечание об изменении или добавлении версий, оно относится к версии Python, в которой было сделано изменение, не к версии пакета email. Эта таблица также описывает совместимость с Python каждой версии пакета.
Версия email |
Распространяется с |
Совместима с |
|---|---|---|
|
Python 2.2.0 – Python 2.2.1 |
больше не поддерживается |
|
Python 2.2.2+ и Python 2.3 |
Python 2.1 – 2.5 |
|
Python 2.4 |
Python 2.3–2.5 |
|
Python 2.5 |
Python 2.3–2.5 |
Вот основные различия между 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, учтите, что вemailверсии 2 экземплярыMessageтеперь имеют частные переменные _charset и _default_type.Несколько методов класса
Messageбыли объявлены устаревшими или их сигнатуры изменились. Также было добавлено много новых методов. Подробнее см. документацию классаMessage. Изменения должны быть полностью обратно совместимы.Структура объекта изменилась в случае типов содержимого message/rfc822. В версии 1
emailтакой тип представлялся скалярной полезной нагрузкой, т.е. у сообщения-контейнераis_multipart()возвращало false,get_payload()был не списком, а единственным экземпляромMessage.Эта структура была несовместима с остальной частью пакета, поэтому представление объекта для типов содержимого message/rfc822 было изменено. В версии 2
emailконтейнер возвращает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().
18.1.13. Отличия от mimelib¶Differences from 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.
Сноски