Обработка без подключения к Интернету, сохранение и открытие

obrabotka bez podkljucheniya k internetu sohranenie i otkrytie Почтовый клиент PyMailGUI Python

Мы видели, как получать электронные письма с сервера и просматривать их, но программу PyMailGUI можно также использовать вообще без подключения к Интернету. Чтобы сохранить почту в локальном файле для последующей работы с ней, выберите нужные сообщения в любом окне со списком и щелкните на кнопке Save (Сохранить) — выбрать для сохранения в виде единого множества можно любое количество сообщений. После щелчка появляется стандартный диалог выбора файла, как показано на рис. 14.12, после закрытия которого почта сохраняется в выбранном текстовом файле.

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

Рис. 14.12. Диалог сохранения выбранной почты

 

Пока в параллельном потоке выполняется загрузка почты из файла, в заголовке соответствующего окна отображается текст «Loading…», как индикатор состояния. Остальной графический интерфейс во время загрузки остается активным (вы можете загружать почту с сервера, удалять ее, просматривать сообщения в других файлах, писать новые сообщения и так далее). По окончании загрузки заголовок окна будет отображать имя открытого файла. После заполнения в окне появится оглавление содержимого файла, как показано на рис. 14.13 (в этом окне были выбраны три сообщения для обработки).

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

Рис. 14.13. Окно со списком сообщений, сохраненных в файле, где выбрано несколько сообщений

 

Например, кнопка View (Просмотреть) откроет выбранное сообщение в обычном окне просмотра, идентичном тому, что изображено на рис. 14.5, но само сообщение будет извлечено из локального файла. Аналогично кнопка Delete (Удалить) удалит сообщение из файла, а не с сервера. Удаление сообщений из файлов также выполняется в потоке, чтобы избежать блокирования графического интерфейса, — во время выполнения операции в заголовке окна отображается текст «Deleting…», как индикатор выполнения операции. Для индикации состояния операции загрузки почты с сервера и удаления ее на сервере используется диалоговое окно, потому что ожидание может оказаться более длительным и имеется возможность отобразить информацию о ходе выполнения операции (см. рис. 14.8).

Технически операция сохранения всегда дописывает необработанный полный текст сообщения в конец выбранного файла; файл открывается в режиме ‘a’ — добавления текста в конец, то есть если файл еще не существует, создается новый файл или выполняется запись в конец существующего файла. Кроме того, операции Save (Сохранить) и Open (Открыть) запоминают последний выбранный каталог — при последующем вызове навигация будет начинаться с выбранного ранее каталога.

Почту можно также сохранить из окна со списком содержимого файла, сохраненного ранее, — для перемещения почты из файла в файл используйте кнопки Save (Сохранить) и Delete (Удалить). Кроме того, операция сохранения в файл, окно с содержимым которого уже было открыто, вызывает автоматическое обновление содержимого этого окна в графическом интерфейсе. То же относится и к файлу, куда автоматически сохраняются отправленные сообщения, который описывается в следующем разделе.

Отправка почты и вложений

После загрузки электронной почты с сервера или из сохраненного ранее файла сообщения можно обрабатывать с помощью кнопок, расположенных внизу окна со списком. Также в любой момент можно отправить новое сообщение, даже до загрузки почты или открытия файла. При нажатии кнопки Write (Написать) в любом окне со списком создается окно, в котором можно составить новое письмо, как показано на рис. 14.14.

Рис. 14.14. Окно PyMailGUI для составления сообщения

 

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

При использовании в таком качестве компонент текстового редактора PyEdit не имеет меню File (Файл), но имеет кнопку Save (Сохранить), что удобно для сохранения черновиков текста сообщения в файл. Позднее вы сможете выделить и вставить эту временную копию в текст нового письма, если потребуется написать текст с самого начала. К тексту сообщения, сохраняемому таким способом, применяются правила поддержки Юникода, реализованные в редакторе PyEdit (он может запросить у вас имя кодировки, как описывается в главе 11).

В операциях создания сообщений PyMailGUI автоматически заполняет строку «From» и вставляет строку подписи (последние две строки на рисунке) согласно настройкам в модуле mailconfig. Вы можете заменить их любым текстом в графическом интерфейсе, но значения по умолчанию автоматически берутся из mailconfig. При отправке сообщения форматирование строки с датой и временем выполняется функцией из модуля email.utils, вызываемой из пакета mailtools, представленного в главе 13.

Здесь также появляется новый набор кнопок в левом верхнем углу: щелчок на кнопке Cancel (Отмена) закроет окно, если пользователь подтвердит эту операцию, а кнопка Send (Отправить) выполнит отправку почты — при ее нажатии текст, введенный в тело этого окна, пересылается после удаления дубликатов по адресам, указанным в заголовках «To», «Cc» и «Bcc», с помощью модуля Python smtplib. PyMailGUI добавляет содержимое полей заголовков в качестве строк почтовых заголовков в отправляемом письме (исключение: письмо будет отправлено по адресам в заголовке «Bcc», но сам заголовок создаваться не будет).

Для отправки письма по нескольким адресам следует перечислить их, разделяя запятой в полях заголовков, при этом можно использовать полную форму адреса в виде «имя» <адрес>. В данном письме я указал в заголовке «To» свой собственный почтовый адрес, чтобы в иллюстративных целях отправить письмо самому себе. Новая версия PyMailGUI также предварительно заполняет заголовок «Bcc» собственным адресом отправителя, если это разрешено настройками в mailconfig — в результате этого копия письма будет отправлена самому отправителю (помимо того, что это письмо будет сохранено в файл отправленных сообщений), но его можно удалить при необходимости.

Новая кнопка Attach (Вложить) открывает диалог выбора файла вложения, как показано на рис. 14.15. Кнопка Parts (Части) открывает диалог, в котором отображается список файлов, уже вложенных в сообщение, как показано на рис. 14.16. При отправке сообщения текст в окне редактирования отправляется как основной текст сообщения, а все присоединенные части отправляются как вложения, корректно закодированные в соответствии с их типами.

Рис. 14.15. Диалог выбора файла вложения, открываемый кнопкой Attach (Вложить)

 

 

Рис. 14.16. Диалог со списком вложений, выводимый кнопкой Parts (Части)

Как мы видели, модуль smtplib в конечном итоге пересылает байты серверу через сокет. Это может оказаться длительной операцией, поэтому PyMailGUI передает ее выполнение дочернему потоку. Во время работы потока отправки на экране отображается немодальное окно, при этом графический интерфейс остается активным — события перерисовки и перемещения обрабатываются в главном потоке программы, в то время как поток отправки взаимодействует с сервером SMTP, и пользователь может выполнять другие операции, включая просмотр и отправку других сообщений.

Если по какой-либо причине Python не сможет отправить письмо по одному из указанных адресов получателей, будет выведено окно с сообщением об ошибке, а затем окно составления письма, чтобы дать вам возможность повторить попытку или сохранить письмо и вернуться к нему позднее. Если окно ошибки не было выведено, значит, все сработало правильно и ваше письмо появится в почтовых ящиках получателей на их почтовых серверах. Так как приведенное выше сообщение я послал себе самому, оно появится в моем ящике и будет загружено при следующем нажатии кнопки Load (Загрузить) в главном окне, как показано на рис. 14.17.

Рис. 14.17. Главное окно PyMailGUI после загрузки отправленной почты

 

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

Для просмотра отправленных сообщений без подключения к Интернету используйте кнопку Open (Открыть), а кнопку Delete (Удалить) — для очистки файла с отправленными сообщениями, если он станет слишком большим (можно также сохранить письма из этого файла в других файлах, рассортировав их по некоторым критериям).

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

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

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