Просмотр электронных писем и вложений

prosmotr elektronnyh pisem i vlozhenij Почтовый клиент PyMailGUI Python

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

Рис. 14.18. Окно PyMailGUI просмотра входящего сообщения

 

С помощью модуля Python email из исходного текста почтового сообщения выделяются заголовки — их текст помещается в поля, справа в верхней части окна. Основной текст сообщения выделяется из его тела и вставляется в новый объект TextEditor, находящийся в нижней части окна. Для извлечения основного текста сообщения PyMailGUI использует эвристические алгоритмы — она не стремится вслепую вывести

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

Любые другие части сообщения с вложениями открываются и отображаются с помощью кнопок быстрого доступа, находящихся в середине окна. Вложения также перечисляются в диалоге, вызываемом кнопкой Parts (Части), и могут сохраняться и открываться все сразу кнопкой Split (Разбить). На рис. 14.19 изображено диалоговое окно со списком вложений, вызываемое кнопкой Parts (Части), а на рис. 14.20 изображено диалоговое окно выбора каталога для сохранения вложений, вызываемое кнопкой Split (Разбить).

Рис. 14.19. Щелчок на кнопке Parts (Части) выводит диалог со списком всех частей сообщения

 

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

Например, на рис. 14.21 показаны два изображения, вложенные в письмо, которое было отправлено на мой ноутбук с Windows, и открытые в стандартной программе просмотра изображений на этой платформе. На других платформах изображения могут открываться в веб-броузере. Щелкните на кнопках быстрого доступа с именами файлов изображений на них, расположенных ниже полей с заголовками, как показано на рис. 14.18, чтобы немедленно просмотреть их, или выполните операцию Split (Разбить), чтобы открыть все части сразу.

Рис. 14.20. Окно диалога выбора каталога для сохранения вложений, вызываемого кнопкой Split (Разбить)

 

 

Рис. 14.21. PyMailGUI открывает части с изображениями в программе просмотра или в броузере

К этому моменту фотографии во вложениях, изображенные на рис. 14.21, совершили полный круг: они были преобразованы в формат MIME, вложены в письмо и отправлены, получены, проанализированы и преобразованы из формата MIME. Попутно они прошли через множество компьютеров — с компьютера клиента на сервер SMTP, затем на сервер POP и опять на компьютер клиента, покрыв произвольное расстояние.

С точки зрения взаимодействия с пользователем: перед отправкой почты мы вложили изображения в письмо с рис. 14.14, использовав диалог с рис. 14.15. Для доступа к ним позднее мы выбрали письмо для просмотра, как на рис. 14.17, и щелкнули на соответствующих кнопках быстрого доступа с рис. 14.18. Программа PyMailGUI преобразовала фотографии в формат Base64, вставила их в текст письма и позднее извлекла и преобразовала в оригинальные фотографии. Благодаря инструментам для работы с электронной почтой в языке Python и нашему программному коду, опирающемуся на них, все работает именно так, как ожидалось.

Обратите внимание: как показано на рис. 14.18 и 14.19, основной текст сообщения также считается одной из частей письма — при ее выборе открывается окно PyEdit, изображенное на рис. 14.22, где этот текст можно обработать и сохранить (основной текст сообщения можно также сохранить, щелкнув на кнопке Save (Сохранить) в окне просмотра сообщения). Основная часть включается в письмо, потому что не все письма имеют текстовую часть. Для сообщений, основная часть которых представлена разметкой HTML, программа PyMailGUI отображает простой текст, извлеченный из текста HTML в своем собственном окне, и открывает веб-броузер для просмотра письма в формате HTML. Подробнее о почтовых сообщениях в формате HTML мы поговорим ниже.

Рис. 14.22. Основная текстовая часть, открытая в PyEdit

Помимо изображений и простого текста PyMailGUI также открывает вложения в формате HTML и XML в веб-броузере и использует реестр Windows для открытия документов, типы которых хорошо известны Windows. Например, файлы .doc и .docx, .xls и .xlsx, и .pdf обычно открываются в Word, Excel и Adobe Reader соответственно. На рис. 14.23 изображен ответ на нажатие кнопки быстрого доступа к файлу lp4e-pref.html на рис. 14.18 на моем ноутбуке с Windows. Если вы внимательно рассмотрите этот снимок или сами выполните эту операцию, то сможете заметить, что вложение в формате HTML отображается одновременно и в веб-броузере, и в окне PyEdit — последнее можно запретить в mailconfig, но по умолчанию эта особенность включена, чтобы дать представление о преобразовании формата HTML.

W O’Reilly Media Template for Microsoft Word — Windows Internet Explorer

74 PyEdit 2.1 — utf-8 email part File Edit Search Tools Help

 

Favorites O’Reilly Media Template tor Micros…

Preface

 

 

This book provides an introduction to the Pjtbon programming language Python is a popular open source programming language used for both standalone programs and scripting applications in a wide variety of domasis It is free, portable, powerful. and remarkably easy and fun to use Programmers from every corner of the software industry have found Python" s focus on developer productivity and software quahry to be a strategic advantage in projects both large and small

Whether you ar new Io jnovj.tnBtaig or a jaofe*.Monti dr-, rk^irt this Ixxik’. goal n to lang you <]tmkly up to ‘.]>ee<l <wi the fundamentals of the core Python language After reading this book, you wfl know enough about Python to apply it in

Ry deMpyi, this Ixxik r. a tutorial that focuses on the cure Pylh/m kingiuige itself, such, it’s intended to serve as the first m a two-volume set

Loaming Py thon, this book, teaches Python itself

Programming Py thon . among others, shows what you can do with Python after you’ve learned it

подпись: ■4125%At Computer | Protected Mode: Off

Рис. 14.23. Вложение в формате HTML, открытое в веб-броузере

Кнопки быстрого доступа в середине окна просмотра на рис. 14.18 предоставляют более непосредственный доступ к вложениям, чем кнопка Split (Разбить), — они не требуют выбирать каталог для сохранения и позволяют открывать только те вложения, которые требуется просмотреть. Однако кнопка Split (Разбить) позволяет открыть сразу все части за один шаг, выбрать каталог для сохранения и поддерживает произвольное количество частей. Файлы, которые не могут быть открыты автоматически из-за того, что их тип неизвестен операционной системе, можно исследовать в каталоге сохранения после щелчка на кнопке Split (Разбить) или на кнопке быстрого доступа (путь к каталогу указывается в диалоге, который открывается при попытке обратиться к файлу вложения неизвестного типа).

Если количество частей больше заданного максимального числа, полоса кнопок быстрого доступа завершается кнопкой с меткой «», щелчок на которой просто запускает операцию Split (Разбить) для сохранения и открытия непоместившихся частей. Одно из таких писем представлено на рис. 14.24 — его можно найти в каталоге SavedMail, в файле version30-4E, если вы захотите просмотреть его. Это достаточно сложное письмо, содержащее 11 частей различного типа.

Рис. 14.24. Окно просмотра сообщения, содержащего множество частей

 

Как и многое в PyMailGUI, максимальное количество кнопок быстрого доступа к частям сообщения в окне просмотра можно настроить в модуле mailconfig.py с пользовательскими настройками. При создании снимка на рис. 14.24 этот параметр был равен восьми. На рис. 14.25 показано, как выглядит то же самое письмо после того, как параметру, определяющему максимальное число кнопок быстрого доступа, было присвоено число пять. Этому параметру можно присвоить число больше восьми, но в некоторый момент надписи на кнопках могут стать нечитаемыми (используйте кнопку Split (Разбить) вместо этого).

Как пример реакции на вложения разных типов, на рис. 14.26 и 14.27 показано, что произошло при выборе кнопок с надписями sousa.au и chapter25.pdf на рис. 14.24 и 14.18 на моем ноутбуке с Windows. Результат может отличаться для разных компьютеров — аудиофайл открывается в проигрывателе Windows Media Player, в то время как файлы MP3 открываются в проигрывателе iTunes, а некоторые платформы могут открывать такие файлы непосредственно в веб-броузере.

Рис. 14.25. Окно просмотра после того, как максимальное количество кнопок частей было уменьшено

 

 

Рис. 14.26. Вложенный аудиофайл, открытый программой PyMailGUI

 

Помимо окна просмотра с красивым форматированием PyMailGUI позволяет увидеть необработанный текст почтового сообщения. Двойной щелчок в главном окне на строке сообщения открывает простой неформатированный текст сообщения (при этом полный текст сообщения загружается в отдельном потоке выполнения, если он не был загружен и помещен в кэш ранее). Исходный текст сообщения, которое я послал сам себе на рис. 14.18, показан на рис. 14.28 — в этом издании исходный текст сообщения отображается в отдельном окне редактора PyEdit (прежний инструмент просмотра текста в окне с прокруткой по-прежнему доступен, но PyEdit предоставляет дополнительные инструменты, такие как поиск, сохранение и так далее).

Рис. 14.27. Вложенный файл PDF, открытый программой PyMailGUI

 

 

Рис. 14.28. Окно PyMailGUI (PyEdit) с исходным текстом

Такое отображение исходного текста может оказаться полезным для просмотра специальных заголовков, не отображаемых в окне форматированного просмотра. Например, необязательный заголовок «X-Mailer» в исходном тексте идентифицирует программу, отправившую сообщение. PyMailGUI автоматически добавляет этот заголовок в сообщения, наряду со стандартными заголовками, такими как «From» и «To». Другие заголовки добавляются в процессе передачи сообщения: заголовки «Received» указывают имена компьютеров, через которые прошло сообщение на пути к нашему почтовому серверу, а заголовок «Content-Type» добавляется и анализируется пакетом Python email в ответ на требование программы PyMailGUI

В действительности исходный текст представляет все, что относится к почтовому сообщению, — это то, что передается с компьютера на компьютер, когда письмо отправлено. Красиво отформатированное отображение в окнах просмотра графического интерфейса получается в результате анализа и декодирования компонентов исходного текста сообщения с помощью стандартных средств Python и помещения их в соответствующие поля на экране. Обратите, например, внимание на файл изображения в формате Base64 в конце сообщения на рис. 14.28 — это вложение было создано при отправке, передано через Интернет и преобразовано в оригинальное двоичное представление при извлечении. Огромный объем работы, значительная часть которой выполняется автоматически, благодаря программному коду и библиотекам.

Ответ на сообщения, пересылка и особенности адресации

PyMailGUI позволяет не только читать почту и создавать новые письма, но также пересылать входящую почту и отвечать на письма, отправленные другими. Обе эти операции являются обычными операциями составления сообщения, но включают оригинальный текст и предварительно заполняют заголовки. Чтобы ответить на электронное письмо, выделите его в списке главного окна и щелкните на кнопке Reply (Ответить). Если я отвечу на письмо, которое только что послал самому себе (отдает нарциссизмом, но служит целям демонстрации), появится окно составления письма, изображенное на рис. 14.29.

Формат этого окна идентичен тому, который мы видели для операции Write (Написать), за исключением того, что некоторые части автоматически заполняются программой PyMailGUI. Фактически единственное, что я руками добавил в этом окне, — это первая строка в текстовом редакторе, все остальное было автоматически заполнено программой Py- MailGUI:

     Строка «From» устанавливается в соответствии с вашим почтовым адресом в модуле mailconfig.

     Строка «To» инициализируется адресом «From» исходного сообщения (мы ведь отвечаем тому, кто послал сообщение).

Рис. 14.29. Окно PyMailGUI составления письма

 

     В строку «Subject» записывается тема исходного сообщения, в начало которой добавляется последовательность «Re:» — стандартный формат продолжения строки темы (если только она была указана, при этом в любом регистре символов).

     Необязательная строка «Bcc», если разрешено в mailconfig, также заполняется адресом отправителя, так как этот способ часто используется для получения копии (новое в этой версии).

     В тело сообщения помещаются строка подписи из mailconfig, а также текст оригинального сообщения. Текст оригинального сообщения цитируется с помощью символов >, и перед ним помещается несколько строк заголовка исходного сообщения, чтобы дать представление о контексте.

     В данном примере не показана еще одна новинка в этой версии — заголовок «Cc» ответа также заполняется списком получателей оригинального письма, составляемым из содержимого заголовков «To» и «Cc» оригинального сообщения, из которого удаляются дубликаты и ваш адрес. Иными словами, операция «ответить» в действительности является по умолчанию операцией «ответить всем» — ответ посылается отправителю, а всем остальным получателям оригинального сообщения отправляются копии. Поскольку последнее не всегда желательно, настройки в mailconfig можно изменить так, что при ответе будет заполняться только заголовок «To» с адресом отправителя. При необходимости можно также просто очищать предварительно заполненный заголовок «Cc», но если эта особенность запрещена, вам может потребоваться добавлять адреса в заголовок «Cc» вручную. Как действует предварительное заполнение заголовка «Cc», мы увидим ниже.

К счастью, все это реализуется значительно проще, чем может показаться. С помощью стандартного пакета Python email извлекаются все строки заголовков исходного сообщения, а все действия по добавлению в тело исходного сообщения символов цитирования > выполняет строковый метод replace. Я просто ввожу с клавиатуры все, что хочу сообщить в ответ (первый абзац в текстовой области письма), и нажимаю кнопку Send (Отправить), чтобы снова отправить ответное сообщение в почтовый ящик на моем почтовом сервере. Физически отправка ответа происходит точно так же, как отправка нового сообщения, — почта направляется на сервер SMTP в дочернем потоке отправки почты, при этом на экране до окончания выполнения операции отображается информационное окно.

Пересылка сообщения аналогична ответу: выделите сообщение в главном окне, нажмите кнопку Fwd (Переслать) и заполните поля и область текста появившегося окна составления сообщения. На рис. 14.30 изображено окно, создаваемое для пересылки письма, полученного ранее, после редактирования.

Как и при создании ответа, заголовок «From» заполняется адресом отправителя из mailconfig, первоначальный текст в теле сообщения автоматически цитируется, заголовок «Bcc» заполняется тем же адресом, что и заголовок «From», а в строку темы копируется тема исходного сообщения с добавлением в начало последовательности «Fwd:». При желании все эти строки можно изменить вручную перед отправкой. Однако строку «To» я должен заполнить вручную, поскольку это не прямой ответ — письмо не обязательно возвращается первоначальному отправителю. Далее, заголовок «Cc» не заполняется адресами получателей оригинального сообщения, как это делается при создании ответа, потому что пересылка письма не является продолжением дискуссии в группе.

Обратите внимание, что я пересылаю письмо в три разных адреса (два адреса в заголовке «To» и один вручную введен в заголовок «Bcc»). Кроме того, я использовал полный формат адресов «имя <адрес>». Адреса получателей в заголовках «To», «Cc» и «Bcc» разделяются запятой («,») и программа PyMailGUI благополучно распознает адреса в полной форме записи, где бы они ни встретились, включая настройки в модуле mailconfig. Запятая, которую можно увидеть в первом адресе в заголовке «To» на рис. 14.30, не вызывает конфликтов с запятой, разделяющей адреса получателей, потому что строки с адресами в этой версии подвергаются полному анализу. Кнопка Send (Отправить) в этом окне отправляет пересылаемое письмо по всем адресам, перечисленным в упомянутых заголовках, после удаления из них дубликатов, чтобы избежать отправки нескольких копий одному и тому же получателю.

Рис. 14.30. Окно PyMailGUI для пересылки письма

 

Теперь я написал новое письмо, ответил на него и переслал его. Ответ и пересылаемое письмо также были отправлены на мой почтовый адрес. Если снова нажать кнопку Load (Загрузить), ответ и пересланное письмо должны показаться в списке главного окна. На рис. 14.31 они показаны как сообщения с номерами 15 и 16 (порядок их следования может зависеть от особенностей синхронизации вашего сервера, кроме того, я растянул окно по горизонтали, чтобы сделать видимым заголовок «To» в последнем из них).

Имейте в виду, что PyMailGUI выполняется на локальном компьютере, но сообщения, которые вы видите в главном окне, фактически находятся в почтовом ящике на сервере. Каждый раз, когда мы нажимаем кнопку Load (Загрузить), программа PyMailGUI загружает с сервера на ваш компьютер заголовки вновь поступивших сообщений, но не удаляет их с сервера. Три сообщения, которые мы только что написали (с 14 по 16), появятся и в любой другой почтовой программе, которой вы воспользуетесь со своей учетной записью (например, в Outlook или в системе электронной почты с веб-интерфейсом). Программа PyMailGUI не удаляет сообщения при загрузке, а просто записывает их в память вашего компьютера для обработки. Если теперь выделить сообщение 16 и нажать кнопку View (Просмотреть), можно увидеть сообщение, которое мы переслали, как показано на рис. 14.32.

Рис. 14.31. Список писем в PyMailGUI после отправок и загрузки

 

 

Рис. 14.32. Окно PyMailGUI просмотра пересланного сообщения

Это сообщение ушло с моего компьютера на удаленный почтовый сервер и было загружено с него в список Python, из которого и показано. Фактически оно поступило на три различные учетные записи электронной почты, имеющиеся у меня (две другие появятся ниже в этом разделе — см. рис. 14.45). Третий получатель не виден на рис. 14.32, потому что его адрес находился в заголовке «Bcc» (скрытая копия) — он примет сообщение, но его адрес не включается в строку заголовка сообщения.

На рис. 14.33 показано, как выглядит необработанный текст пересланного сообщения. Чтобы вывести это окно, нужно выполнить двойной щелчок по записи в главном окне. Форматированное отображение с рис. 14.32 — это просто результат извлечения элементов из текста, приведенного в окне с необработанным текстом.

Рис. 14.33. Окно PyMailGUI просмотра исходного текста пересланного сообщения

 

И последнее замечание, касающееся ответов и пересылки: как уже упоминалось, в этой версии предусматривается отправка ответов всем получателям оригинального письма, исходя из предположения, что ответ означает продолжение дискуссии в группе. Для иллюстрации в верхней части рис. 14.34 показано оригинальное сообщение, ниже и левее — пересылаемое сообщение, а ниже и правее — ответ. При создании ответа заголовок «Cc» автоматически заполняется адресами получателей оригинального сообщения, из которых удаляются дубликаты, и устанавливается новый адрес отправителя. Заголовок «Bcc» (здесь он разрешен) также в обоих случаях заполняется адресом отправителя. Это лишь начальные установки полей заголовков, которые можно редактировать и очищать перед отправкой. Кроме того, предварительное заполнение заголовка «Cc» в ответах можно полностью запретить в файле с настройками. Однако в этом случае вам может потребоваться вручную копировать и вставлять адреса в этот заголовок при ведении обсуждения в группе. Откройте файл с почтой, сохраненной в этой версии программы, поэкспериментируйте с этой особенностью программы и затем посмотрите предлагаемые усовершенствования, которые приводятся далее в этой главе.

Рис. 14.34. Операция «ответить всем» заполняет заголовок «Cc»

 

Удаление сообщений

К настоящему времени мы осветили все, кроме кнопки Delete (Удалить) и флажка All (Все) в главном окне. Флажок All (Все) просто управляет выбором всех сообщений (операции, выполняемые при нажатии кнопок View (Просмотреть), Delete (Удалить), Reply (Ответить), Fwd (Переслать) и Save (Сохранить) применяются ко всем выделенным на этот момент сообщениям). Программа PyMailGUI позволяет также удалять сообщения с сервера, после чего они больше не будут появляться в списке при обращении к почтовому ящику.

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

Подобно операциям просмотра, сохранения и другим операция удаления может применяться к одному или более сообщениям. Удаление производится немедленно и подобно другим операциям передачи почты выполняется в неблокирующем потоке, но только после подтверждения в диалоге, изображенном на рис. 14.35. В процессе выполнения операции удаления на экран выводится диалог, отображающий ход выполнения операции, подобный тем, что изображены на рис. 14.8 и 14.9.

Рис. 14.35. PyMailGUI запрашивает подтверждение операции удаления

 

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

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

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

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

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