К настоящему моменту мы познакомились со всеми основными возможностями программы PyMailGUI; этого вполне достаточно, чтобы начать отправлять и получать простые текстовые сообщения. В оставшейся части этой демонстрации мы рассмотрим некоторые более глубинные концепции этой системы, включая синхронизацию почтового ящика, сообщения в формате HTML, интернационализацию и настройку нескольких учетных записей. Поскольку первая из этих тем перекликается с темой удаления почты, рассматривавшейся в предыдущей главе, рассмотрим ее в первую очередь.
С точки зрения конечного пользователя в операции удаления нет ничего сложного, но, как оказывается, удаление осложняется схемой POP нумерации сообщений. В главе 13 мы узнали о потенциальных ошибках синхронизации между почтовым ящиком на сервере и списком сообщений в локальном приложении, когда изучали пакет mailtools, используемый программой PyMailGUI (обсуждение приводится вокруг примера 13.24). В двух словах: в POP каждому сообщению присваивается последовательный номер, начиная с единицы. Эти номера и передаются серверу для получения и удаления сообщений. Почтовый ящик на сервере обычно блокируется на время соединения с сервером, чтобы серия операций удаления могла выполняться как единая операция — никакие другие изменения в ящике невозможны, пока соединение не будет закрыто.
Однако изменение номеров сообщений имеет определенное значение и для графического интерфейса. Нет ничего плохого, если в то время, когда выводится результат предыдущей загрузки, поступают новые письма — им будут присвоены более высокие номера по сравнению с теми, которые отображаются у клиента. Но если удалить сообщение, находящееся в середине почтового ящика, после того как оглавление будет загружено с сервера, номера всех сообщений, расположенных после удаленного, изменятся (они уменьшатся на единицу). Это означает, что некоторые сообщения могут иметь неверные номера, если удаление осуществляется во время просмотра ранее загруженной почты
Для подобных случаев в PyMailGUI используется безопасное удаление и проверка синхронизации, реализованные в mailtools. Этот пакет выполняет сопоставление заголовков сообщений для определения ошибок синхронизации локального списка и почтового ящика на сервере. Например, если другой почтовый клиент удалит сообщение, предшествующее удаляемому в PyMailGUI, mailtools обнаружит проблему, отменит операцию удаления и выведет диалог, подобный тому, что изображен на рис. 14.36.
Рис. 14.36. Операция безопасного удаления обнаружила различия с почтовым ящиком
Аналогично, загрузка оглавления почтового ящика и получение отдельных сообщений также сопровождаются запуском процедуры проверки синхронизации в mailtools. На рис. 14.37 изображен диалог, сообщающий об ошибке, обнаруженной при получении сообщения, которое было удалено с помощью другого клиента после загрузки списка сообщений с сервера. Тот же диалог отображается, когда ошибка обнаруживается во время операции загрузки списка, только в первой строке выводится текст «Load failed» (Ошибка загрузки).
В обоих случаях, когда обнаруживается ошибка синхронизации, PyMa- ilGUI автоматически выполняет повторную загрузку списка сообщений из почтового ящика на сервере сразу же после закрытия диалога. Такой подход гарантирует, что программа PyMailGUI не будет по ошибке удалять или отображать не те сообщения в тех редких случаях, когда содержимое почтового ящика на сервере будет изменяться без ее ведома. Подробнее о процедуре проверки синхронизации в пакете mailtools рассказывается в главе 13. Эти ошибки обнаруживаются, и исключения возбуждаются в пакете mailtools, но весь механизм задействуется вызовами в менеджере кэша почты в этой программе.
Рис. 14.37. Ошибка синхронизации после удаления письма с помощью другого клиента
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011