Пакет email, используемый сценарием pymail из предыдущего раздела, является обширной коллекцией инструментов — фактически даже слишком обширной, чтобы запомнить все, что в ней имеется. Для начала, наличие некоторого шаблонного программного кода, реализующего типичные случаи использования пакета, может помочь освободить вас от вникания во все его особенности, — изолируя операции использования модуля, такой программный код может также упростить переход к изменениям в пакете email, возможным в будущем. Чтобы упростить взаимодействие с пакетом для нужд более сложных клиентов электронной почты и для дальнейшей демонстрации использования инструментов электронной почты, имеющихся в стандартной библиотеке, я создал собственные вспомогательные модули, которые будут представлены в этом разделе, — пакет mailtools.
mailtools — это пакет модулей Python: каталог, содержащий модули, по одному на класс инструментов, и модуль инициализации, который автоматически выполняется при первой попытке импортировать пакет. Данный пакет модулей по сути является всего лишь оберткой вокруг пакета email, а также вокруг модулей poplib и smtplib из стандартной библиотеки. Они строят некоторые достаточно обоснованные предположения о том, как должен использоваться пакет email, и позволяют нам забыть о некоторых сложностях использования инструментов стандартной библиотеки.
Проще говоря, пакет mailtools предоставляет три класса — для получения, отправки и анализа почтовых сообщений. Эти классы могут использоваться как су пер клас сы с целью подмешивания их методов в более специализированные прикладные классы или как са мо стоя тельные или встро ен ные объекты, экспортирующие свои методы для непосредственного использования. Далее мы увидим, как используются эти классы в обоих качествах.
Примеры использования инструментов этого пакета приводятся в модуле selftest.py, который играет роль сценария самотестирования пакета. При запуске он отправляет письмо с вашего адреса вам же, в которое вложен сам файл selftest.py. Кроме того, он извлекает и выводит некоторые заголовки сообщений, а также проанализированное и необработанное содержимое. Эти интерфейсы, с добавлением некоторой магии для создания пользовательского интерфейса, приведут нас к полнофункциональным почтовым клиентам и веб-сайтам далее в этой главе. Предварительно следует отметить две конструктивные особенности. Во-первых, реализация этого пакета ничего не знает о пользовательском интерфейсе, с которым она будет использоваться (консоль, графический интерфейс, веб-интерфейс или какой-то другой), и не делает никаких предположений об использовании в многопоточной среде выполнения — это просто комплект инструментов. Как мы увидим далее, все решения по использованию пакета должны приниматься его клиентами. Сосредоточившись исключительно на обработке электронной почты, мы также способствуем упрощению программного кода программ, использующих его.
Во-вторых, каждый из основных модулей в пакете иллюстрирует приемы решения проблем поддержки Юникода, с которыми приходится сталкиваться программному коду для Python 3.X, в частности при использовании пакета email в Python 3.1:
• От пра ви тель должен заботиться о кодировках текста основного сообщения, о вложении входных файлов, о сохранении почты в выходных файлах и о заголовках сообщения.
• Получатель должен определять кодировку полного текста сообщения при извлечении его с сервера.
• Механизм анализа должен заботиться о кодировках текстового содержимого анализируемых сообщений, а также о кодировках заголовков.
Кроме того, отправитель должен предоставить реализацию обходных решений проблем создания двоичных и текстовых частей в почтовых сообщениях, описанных выше в этой главе. Поскольку в целом это очень важные проблемы использования Юникода и они не имеют такого универсального решения, как хотелось бы, из-за ограничений текущей версии пакета email, я буду тщательно разъяснять каждый сделанный выбор.
В следующих нескольких разделах приводится исходный программный код модулей из пакета mailtools. Все вместе его файлы содержат примерно 1050 строк кода, включая пустые строки и комментарии. Мы не будем рассматривать все детали реализации пакета, поэтому ищите дополнительные подробности в листингах и загляните в модуль самотестирования, где приводятся примеры использования пакета. Кроме того, дополнительную информацию и примеры вы найдете в трех клиентах, использующих этот пакет, — в измененной версии pymail2.py, которая следует сразу же за листингами, в клиенте PyMailGUI из главы 14 и в реализации сервера PyMailCGI из главы 16. Совместно используя этот пакет, все три системы получают в наследство все его инструменты, а также любые расширения в будущем.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011