Демонстрация PyMailGUI

demonstraciya pymailgui Почтовый клиент PyMailGUI Python

Программа PyMailGUI имеет многооконный интерфейс. Он включает следующее:

     Главное окно со списком сообщений, открываемое при запуске программы, — для обработки почты на сервере.

     Одно или более окон с оглавлением содержимого в файлах с сохраненными сообщениями — для обработки почты без подключения к Интернету.

     Одно или более окон для просмотра и редактирования содержимого почтовых сообщений.

     Окна PyEdit для отображения необработанного текста почтовых сообщений, текстовых вложений и исходного программного кода системы.

     Неблокирующие диалоги с информацией о ходе выполнения операции.

     Различные диалоги, предназначенные для открытия частей сообщения, вывода справки и другие.

С технической точки зрения PyMailGUI выполняется как множество параллельных потоков, которые могут действовать одновременно: по одному для каждой операции передачи почты между программой и сервером и по одному для каждой операции загрузки, сохранения или удаления сообщений в файлах. Программа PyMailGUI поддерживает сохранение почты в файлах, автоматически сохраняет отправленные сообщения, обеспечивает возможность настройки шрифтов и цветов, позволяет просматривать и добавлять вложения, извлекает основной текст сообщения, преобразует содержимое в формате HTML в простой текст и обеспечивает множество других возможностей.

Чтобы легче было понять этот практический пример, рассмотрим вначале операции, которые выполняет программа PyMailGUI, — взаимодействие с пользователем и функции обработки почты — и только потом обратимся к программному коду Python, реализующему их. При чтении этого материала не стесняйтесь заглядывать в листинги, которые следуют за снимками экранов, но обязательно прочтите также этот раздел, где я объясняю некоторые тонкости конструкции PyMailGUI. После этого раздела вы можете самостоятельно изучать листинги с программным кодом; это дает лучшее и более полное объяснение, чем написанное на естественном языке.

Запуск

Итак, пришло время испытать систему в действии. Я буду демонстрировать работу программы на моем ноутбуке с Windows 7. На других платформах (включая другие версии Windows) интерфейс программы будет выглядеть несколько иначе благодаря поддержке инструментами графического интерфейса внешнего вида, свойственного конкретной платформе, но основная функциональность при этом останется прежней.

PyMailGUI — это программа Python/tkinter, запускаемая выполнением файла сценария верхнего уровня PyMailGUI.py. Как и другие программы на языке Python, PyMailGUI можно запускать из командной строки, щелчком на значке с именем его файла в окне менеджера файлов или нажатием кнопки в панелях запуска PyDemos или PyGadgets. Независимо от способа запуска сначала PyMailGUI выводит окно, изображенное на рис. 14.1 и полученное после щелчка на кнопке Load (Загрузить), чтобы загрузить заголовки с почтового сервера моего интернет-провайдера. Обратите внимание на ярлык окна с изображением символов «PY»: это результат работы инструментов поддержки протоколов оконного интерфейса, которые мы написали ранее в этой книге. Обратите также внимание на строки с заголовками, содержащие символы, не входящие в диапазон ASCII, — я буду рассказывать об особенностях поддержки реализации позднее.

Рис. 14.1. Главное окно PyMailGUI со списком сообщений на сервере

Это главное окно PyMailGUI — отсюда начинаются все операции. Оно нам предоставляет:

     Кнопку справки (полоса вверху).

     Область для списка полученных почтовых сообщений (средняя часть), на которой можно щелкнуть мышью.

     Нижнюю панель с кнопками для обработки сообщений, выделенных в области списка.

Обычно пользователь загружает свою почту, выбирает щелчком сообщение в области списка и нажимает одну из нижних кнопок для его обработки. При запуске программы не выводится никаких сообщений — их необходимо загрузить, щелкнув на кнопке Load (Загрузить), после чего отображается простой диалог ввода пароля, затем диалог с информацией о ходе выполнения операции, где ведется обратный отсчет заголовков сообщений, которые осталось загрузить, и затем список заполняется сообщениями, готовыми для выбора.

Окно программы PyMailGUI с оглавлением, изображенное на рис. 14.1, отображает информацию из заголовков в колонках фиксированной ширины и может распахиваться до максимального размера. Почтовые сообщения с вложениями отмечаются символом «*» в колонке с порядковыми номерами, а шрифты и цвета в этом и других окнах PyMailGUI можно настроить в модуле mailconfig. На черно-белых изображениях в этой книге не видно, но большинство окон со списками сообщений, которые мы увидим, имеют красный фон, окна просмотра содержимого — светло-голубой, окна PyEdit — бежевый, вместо привычного бирюзового, а окно справки — синевато-стальной цвет. Большинство из них вы можете изменить по своему вкусу, а внешний вид окон PyEdit можно изменить в самом графическом интерфейсе (образец определения цвета смотрите в примере 8.11 и альтернативные примеры настроек — далее).

Окна со списками сообщений позволяют выбирать одновременно несколько сообщений — операция, выбранная в панели инструментов внизу окна, применяется ко всем выбранным письмам. Например, чтобы просмотреть содержимое нескольких писем, выберите их в списке и щелкните на кнопке View (Просмотреть) — программа загрузит (при необходимости) их с сервера и отобразит каждое из них в отдельном окне просмотра. Используйте флажок All (Все) в правом нижнем углу, чтобы выбрать все сообщения в списке. Чтобы выбрать не все, а только несколько сообщений, щелкайте мышью, удерживая клавишу Ctrl или Shift (стандартная операция выбора нескольких элементов из списка, используемая в Windows, — попробуйте сами).

Однако прежде чем двинуться дальше, нажмем на изображенную на рис. 14.1 полосу над списком вверху окна и посмотрим имеющуюся справку. На рис. 14.2 изображено окно текстовой справки, которое при этом появляется, — одной из двух имеющихся разновидностей справки.

PJ PyMailGUI 3.0 — Help h=H|-&

PyMailGUI, version 3.0

May. 2010 (2.1 January, 2006)

Programming Python. 4th Edition Mark Lutz, for O’Reilly Media. Inc.

PyMailGUI is a multiwindow interface for processing email, both online and offline. Its main interfaces include one list window for the mail server, zero or more list windows for mail save files, and multiple view windows for composing or viewing emails selected in a list window. On startup, the main (server) list window appears first but no mail server connection is attempted until a Load or message send request. All PyMailGUI windows may be resized, which is especially useful in list windows to see additional columns.

Note: To use PyMailGUI to read and write email of your own, you must change the POP and SMTP server names and login details in the file mailconfig.py, located in PyMailGUI’s source-code directory. See section 11 for details.

Contents:

0) VERSION ENHANCEMENTS

1)   LIST WINDOW ACTIONS

2)   VIEW WINDOW ACTIONS

3)   OFFLINE PROCESSING

4)   VIEWING TEXT AND ATTACHMENTS

5)   SENDING TEXT AND ATTACHMENTS__

Source Cancel

Рис. 14.2. Всплывающее окно справки PyMailGUI

Основную часть этого окна составляют блок текста в текстовом виджете с прокруткой, а также две кнопки внизу. Весь текст справки представлен в программе, как одна строка в тройных кавычках. Как мы увидим чуть ниже, имеется также возможность открыть этот же текст в формате HTML в веб-броузере, но для многих вполне достаточно и простого текста. Кнопка Cancel (Отмена) закрывает это немодальное (то есть неблокирующее) окно. Следует отметить, что кнопка Source (Исходные тексты) открывает окна с текстовым редактором PyEdit для просмотра всех файлов с исходным программным кодом PyMailGUI. На рис. 14.3 показан один из таких файлов (их довольно много, но этот выбран наугад,
а не для демонстрации разработки). Не всякая программа покажет вам свои исходные тексты, но PyMailGUI следует лейтмотиву открытого программного обеспечения Python.

Рис. 14.3. Окно просмотра исходного программного кода PyMailGUI

 

Впервые в этом издании справка может также отображаться в формате HTML в окне веб-броузера, вместо или в дополнение к текстовой справке, которую мы только что видели. Выбор отображения справки в текстовом формате, в формате HTML или в обоих форматах одновременно определяется настройками в модуле mailconfig. Справка в формате HTML отображается с помощью модуля Python webbrowser, который открывает файл HTML в броузере на локальном компьютере, и в настоящее время не имеет кнопки открытия файлов с исходными текстами, присутствующей в окне с текстовой версией (еще одна из причин, почему может потребоваться инструмент просмотра текста). Справка в формате HTML изображена на рис. 14.4.

Когда сообщение для просмотра выбирается в главном окне и затем выполняется щелчок на кнопке View (Просмотреть), PyMailGUI загружает полный текст сообщения (если оно еще не было загружено в этом сеансе) и выводит окно просмотра сообщения, как показано на рис. 14.5, где изображено содержимое одного из сообщений в моем почтовом ящике.


Рис. 14.4. Отображение справки PyMailGUI в формате HTML (новое в версии 3.0)

Окна просмотра создаются в ответ на операции в главном окне со списком и имеют следующую организацию:

     В верхней части находятся кнопки операций (Parts (Части) выводит список частей сообщения, Split (Разделить) сохраняет части сообщения в указанный каталог и открывает их и Cancel (Отмена) закрывает это немодальное окно), а также раздел для отображения заголовков сообщения («From», «To» и так далее).

     В середине находится панель с кнопками быстрого доступа для открытия частей сообщения, включая вложения. В случае щелчка на этих кнопках PyMailGUI открывает части сообщения в соответствии с их типами. Изображения могут открываться в веб-броузере или в программе просмотра изображений, текстовые части — в Py- Edit, HTML — в веб-броузере, документы Windows — согласно записям в реестре Windows и так далее.

     Основу этого окна (всю нижнюю его часть) занимает повторно используемый объект класса TextEditor, который был написан для программы PyEdit в главе 11, — PyMailGUI просто вставляет экземпляр TextEditor в каждое окно для просмотра и создания нового сообщения, бесплатно получая компонент полнофункционального текстового редактора. В действительности многое в окне, изображенном на рис. 14.5, реализовано с помощью TextEditor, а не PyMailGUI.

Такое повторное использование класса редактора PyEdit означает, что мы можем использовать все его инструменты для работы с текстом почтового сообщения — копирование и вставку, поиск и переход по номеру строки, сохранение копии текста в файл и другие. Например, кнопка Save (Сохранить) редактора PyEdit в левом нижнем углу на рис. 14.5 может использоваться для сохранения основного текста сообщения (как мы увидим далее, подобную же возможность предоставляет самая левая кнопка в середине окна, соответствующая первой части сообщения, и также имеется возможность сохранить письмо целиком в окне со списком). Чтобы сделать факт повторного использования еще более очевидным, выберите в текстовой части окна пункта Info (Информация) в меню Tools (Инструменты), и вы получите стандартное окно объекта TextEditor редактора PyEdit со статистикой файла, как показано на рис. 14.6, — в точности то же всплывающее окно, что и в автономном текстовом редакторе PyEdit и в программе просмотра изображений PyView из главы 11.

Фактически, это уже третий пример повторного использования класса TextEditor в данной книге: PyEdit, PyView и теперь PyMaiGUI предоставляют пользователям один и тот же интерфейс редактирования текста, поскольку все они используют один и тот же объект TextEditor. Программа PyMailGUI использует его для решения разных задач — она прикрепляет экземпляры этого класса к окнам просмотра и создания сообщений, запускает экземпляры в независимых окнах для просмотра текстовых частей и необработанного текста сообщений, а также для отображения исходных текстов на языке Python (последний случай мы видели на рис. 14.3, выше). Для просмотра компонентов сообщений PyMailGUI настраивает шрифт и цвет PyEdit в соответствии с его собственным модулем настроек — при открытии редактора в отдельных окнах применяются настройки из локального модуля textConfig .

Рис. 14.6. Диалог со статистической информацией компонента PyEdit, используемого в PyMailGUI

 

Для отображения электронного письма PyMailGUI вставляет его текст в прикрепленный объект TextEditor; при составлении нового письма PyMailGUI предоставляет объект TextEditor и потом извлекает из него текст для передачи через Сеть. Помимо очевидной простоты при таком повторном использовании программного кода упрощается распространение усовершенствований и исправлений — все изменения в объекте TextEditor автоматически наследуются программами PyMailGUI, PyView и PyEdit.

Версия PyMailGUI в третьем издании, например, начала поддерживать операции отмены (undo) и возврата (redo) ввода просто потому, что эта особенность была реализована в PyEdit. А в этом четвертом издании все программы, импортирующие редактор PyEdit, наследуют его новый диалог Grep поиска в файлах, а также новую поддержку просмотра и редактирования текста Юникода в произвольной кодировке, что особенно полезно при работе с текстовыми частями электронных писем произвольного происхождения (подробнее история развития PyEdit описывается в главе 11).

Загрузка почты

Теперь вернемся к главному окну PyMailGUI со списком и щелкнем по кнопке Load (Загрузить), чтобы получить входящую почту по протоколу POP. Функция загрузки в программе PyMailGUI получает параметры учетной записи из модуля mailconfig, содержимое которого будет представлено ниже в этой главе, поэтому проверьте, чтобы в этом файле были отражены параметры вашей электронной почты (то есть имена серверов и имена пользователей), если, конечно, вы хотите читать свою почту с помощью PyMailGUI. Если только вам не удастся угадать пароль к учетной записи для этой книги, предустановленные настройки у вас работать не будут.

О пароле учетной записи следует сказать дополнительно. Программа PyMailGUI может получать его из двух мест:

Локальный файл

Если поместить имя локального файла, содержащего пароль, в модуль mailconfig, PyMailGUI при необходимости загрузит пароль из этого файла.

Диалог

Если в модуле mailconfig не указывать имя файла с паролем (или PyMailGUI не сможет по каким-то причинам получить пароль из этого файла), PyMailGUI запросит пароль, когда он потребуется.

На рис. 14.7 изображен диалог для ввода пароля, который выводится, если пароль не был сохранен в локальном файле. Обратите внимание: при вводе символы пароля не отображаются — параметр show=’*’ поля Entry в этом окне указывает библиотеке tkinter, что вводимые символы должны отображаться как звездочки (этот параметр аналогичен по духу модулю ввода с консоли getpass, с которым мы встречались в предыдущей главе, и параметру HTML type=password, с которым мы встретимся позже). Введенный пароль находится только в памяти вашего компьютера — PyMailGUI никуда не записывает его для постоянного хранения.

Обратите также внимание, что при использовании параметра с именем локального файла, где хранится пароль, требуется, чтобы пароль хранился в файле на локальном компьютере клиента в незашифрованном виде. Это удобно (не нужно каждый раз заново вводить пароль для получения почты), но не очень хорошо, если на компьютере могут работать несколько пользователей. Оставьте этот параметр в mailconfig пустым, если предпочитаете всегда вводить пароль в диалоговом окне.

Рис. 14.7. Окно для ввода пароля PyMailGUI

Получив тем или иным способом настройки почты и пароль, PyMailGUI постарается загрузить заголовки всех входящих сообщений с сервера POP. Последующие операции загрузки будут загружать только вновь прибывшую почту. Для поддержки до неприличия больших почтовых ящиков (таких как у меня), программа теперь пропускает загрузку заголовков сообщений, кроме самых свежих, количество которых ограничивается настройками в модуле mailconfig — пропущенные заголовки в списке отображаются с текстом «—mail skipped—» в поле темы — подробности смотрите выше, в обзоре изменений в версии 3.0.

Для экономии времени PyMailGUI извлекает с сервера только заголовки сообщений, заполняя ими список в главном окне. Полный текст сообщений извлекается, только когда они выбираются для просмотра или для обработки и только если полный текст не был загружен ранее в течение текущего сеанса. PyMailGUI повторно использует инструменты загрузки почты из модуля mailtools, представленного в главе 13, который в свою очередь использует для получения почты стандартный модуль Python poplib.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий