Страница просмотра сообщений

stranica prosmotra soobshhenij Сервер PyMailCGI

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

Пример 16.8. PP4E\Internet\Web\PyMailCgi\cgi-bin\onViewListLink.py

#!/usr/bin/python

############################################################################ Вызывается щелчком мыши на ссылке, указывающей на сообщение в главном списке: создает страницу просмотра;

конструктор cgi.FieldStorage преобразует экранированные последовательности в ссылках с помощью urllib.parse (%xx и ‘+’, замещающие пробелы, уже преобразованы обратно); в 2.0+ здесь загружается только одно сообщение, а не весь список; в 2.0+ мы также отыскиваем основную текстовую часть сообщения, вместо того чтобы вслепую отображать полный текст (со всеми вложениями), и генерируем ссылки на файлы вложений, сохраненные на сервере; сохранение файлов вложений возможно только для 1 пользователя и 1 сообщения; большая часть улучшений в 2.0 обусловлена использованием пакета mailtools;

3.0: перед анализом с помощью пакета email пакет mailtools декодирует байты полного текста сообщения;

3.0: для отображения пакет mailtools декодирует основной текст, commonhtml декодирует заголовки сообщения;

############################################################################

import cgi

import commonhtml, secret

from externs import mailtools

#commonhtml.dumpstatepage(0)

def saveAttachments(message, parser, savedir=’partsdownload’)

сохраняет части полученного сообщения в файлы на

сервере для дальнейшего просмотра в веб-броузере пользователя import os

if not os.path.exists(savedir): # CWD CGIсценария на сервере

os.mkdir(savedir) # будет открываться в броузере

for filename in os.listdir(savedir): # удалить прежние файлы: временные!

dirpath = os.path.join(savedir, filename)

os.remove(dirpath)

typesAndNames = parser.saveParts(savedir, message)

filenames = [fname for (ctype, fname) in typesAndNames]

for filename in filenames:

os.chmod(filename, 0o666) # некоторые серверы требуют права

# на чтение/запись

return filenames

form = cgi.FieldStorage()

user, pswd, site = commonhtml.getstandardpopfields(form)

pswd = secret.decode(pswd)

try:

msgnum = form[‘mnum’].value # из URLссылки

parser = mailtools.MailParser()

fetcher = mailtools.SilentMailFetcher(site, user, pswd)

fulltext = fetcher.downloadMessage(int(msgnum)) # не используйте eval!

message = parser.parseMessage(fulltext) # Message в пакете email

parts = saveAttachments(message, parser) # для URLссылок

mtype, content = parser.findMainText(message) # первая текстовая часть commonhtml.viewpage(msgnum, message, content, form, parts) # зашифр.

# пароль

except:

commonhtml.errorpage(‘Error loading message’)

И снова большая часть работы здесь выполняется в модуле commonhtml, который приведен ниже в этом разделе (пример 16.14). Этот сценарий вводит дополнительную логику для расшифровывания переданного пароля (с помощью настраиваемого модуля шифрования secret) и извлечения заголовков и текста выбранного сообщения с помощью пакета mailtools из главы 13. В конечном счете сценарий загружает полный текст выбранного сообщения, анализирует его и декодирует с помощью пакета mailtools, использующего стандартный модуль poplib и пакет email. И хотя при повторной попытке просмотреть сообщение его снова придется загрузить, тем не менее, начиная с версии 2.0, PyMailCGI больше не загружает все сообщения целиком, чтобы получить выбранное.

Еще одна новая, появившаяся в версии 2.0 функция saveAttachments используется в этом сценарии для выделения частей полученного сообщения и сохранения их в каталоге на веб-сервере. Как уже говорилось выше в этой главе, после этого в страницу просмотра добавляются ссылки с адресами URL, указывающими на сохраненные в файлах части. Ваш веб-броузер сможет открывать их исходя из их имен и содержимого. Все операции по извлечению, декодированию и именованию унаследованы из пакета mailtools. Файлы вложений хранятся временно — они будут удалены при выборе следующего сообщения. Кроме того, в данной реализации все файлы сохраняются в единственном каталоге, и по этой причине система может использоваться только одним пользователем.

Если сообщение было успешно загружено и проанализировано, в результате будет создана страница, изображенная на рис. 16.12, позволяющая просматривать текст сообщения, но не редактировать его. Функция commonhtml.viewpage генерирует параметр HTML «read-only» («только для чтения») для всех текстовых элементов на этой странице. При внимательном рассмотрении можно заметить, что это то сообщение, которое было отправлено из страницы на рис. 16.3 и которое видно в конце списка на рис. 16.8.

Рис. 16.12. Страница PyMailCGI просмотра сообщения

 

В нижней части страницы просмотра имеется раскрывающийся список выбора операции — если нужно что-то сделать с письмом, выберите в этом списке требуемое действие (Reply (Ответить), Forward (Переслать) или Delete (Удалить)) и щелкните на кнопке Next (Далее), чтобы перейти к следующей странице. Если вы собираетесь только просматривать сообщения, щелкните внизу на ссылке Back to root page (Назад на главную страницу) или на кнопке Назад (Back) броузера, чтобы вернуться на главную страницу со списком.

Как уже говорилось, на рис. 16.12 отображается сообщение, отправленное нами ранее в этой главе, которое мы решили просмотреть после получения. Обратите внимание на ссылки «Parts:» — щелчок на любой из них открывает адрес URL, указывающий на временный файл, находящийся на сервере, в соответствии с правилами, действующими в броузере для данного типа файлов. Например, щелчок на файле с расширением «.txt» вероятнее всего приведет к открытию этого файла в броузере или в текстовом редакторе. В других сообщениях щелчок на файле с расширением «.jpg» может привести к его открытию в программе просмотра графических изображений, на файле с расширением «.pdf» может запустить программу Adobe Reader и так далее. На рис. 16.13 показан результат щелчка на файле вложения с расширением «.py» в странице на рис. 16.12, отображенной в броузере Chrome.

Рис. 16.13. Результат попытки просмотра файла вложения

 

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

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

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