После заполнения поля пароля в предыдущей странице и нажатия кнопки Submit (Отправить) пароль передается сценарию, представленному в примере 16.7.
Пример 16.7. PP4E\Internet\Web\PyMailCgi\cgi-bin\onViewPswdSubmit.py
#!/usr/bin/python
############################################################################ Вызывается при отправке пароля POP из окна ввода: создает страницу со списком входящей почты;
в 2.0+ загружаются только заголовки писем, позднее, по запросу, загружается полный текст только одного выбранного сообщения; однако нам по-прежнему необходимо загружать все заголовки всякий раз, когда создается страница с оглавлением: для реализации кэширования сообщений на стороне сервера может потребоваться использовать базу данных на стороне сервера (?) и ключ сеанса или использовать какие-то другие механизмы;
3.0: выполняет декодирование заголовков перед отображением списка, однако принтер и броузер должны уметь обрабатывать их;
############################################################################
import cgi
import loadmail, commonhtml
from externs import mailtools
from secret import encode # модуль шифрования, определяемый пользователем MaxHdr = 35 # максимальная длина заголовков в списке
# с предыдущей страницы поступает только пароль, остальное обычно в модуле formdata = cgi.FieldStorage()
mailuser, mailpswd, mailsite = commonhtml.getstandardpopfields(formdata) parser = mailtools.MailParser()
try:
newmails = loadmail.loadmailhdrs(mailsite, mailuser, mailpswd) mailnum = 1
maillist = [] # или использ. enumerate()
for mail in newmails: # список заголовков
msginfo = [] hdrs = parser.parseHeaders(mail) # email.message.Message
addrhdrs = (‘From’, ‘To’, ‘Cc’, ‘Bcc’) # декодировать только имена for key in (‘Subject’, ‘From’, ‘Date’):
rawhdr = hdrs.get(key, ‘?’) if key not in addrhdrs:
dechdr = parser.decodeHeader(rawhdr) # 3.0: декодир.
# для отображения
else: # закодиров. при отправке
dechdr = parser.decodeAddrHeader(rawhdr) # только имена
msginfo.append(dechdr[:MaxHdr])
msginfo = ‘ | ‘.join(msginfo)
maillist.append((msginfo, commonhtml.urlroot + ‘onViewListLink.py’, {‘mnum’: mailnum,
‘user’: mailuser, # параметры
‘pswd’: encode(mailpswd), # передаются ‘site’: mailsite})) # в URL,
# а не в полях mailnum += 1
commonhtml.listpage(maillist, ‘mail selection list’) except:
commonhtml.errorpage(‘Error loading mail index’)
Основным назначением этого сценария является создание страницы со списком сообщений в почтовом ящике пользователя с использованием пароля, введенного на предыдущей странице (или переданного в адресе URL). Как обычно, благодаря инкапсуляции большинство деталей скрыто в других файлах:
loadmail.loadmailhdrs
Повторно использует пакет mailtools из главы 13 для загрузки сообщений по протоколу POP. Для вывода списка требуется счетчик сообщений и почтовые заголовки. В этой версии, чтобы сэкономить время, сценарий загружает только текст заголовков, а не сообщения целиком (обеспечивается командой TOP интерфейса POP, которую поддерживают большинство серверов, — если это не так, смотрите модуль mailconfig, который позволяет отключить эту возможность).
commonhtml.listpage
Генерирует HTML для вывода переданного ему списка кортежей (текст, agpec_URL, словарь_параеетрвв) в виде списка гиперссылок на странице ответа. Значения параметров отображаются в конце URL в странице ответа.
Создаваемый здесь список maillist используется при построении тела следующей страницы — списка для выбора сообщений электронной почты. Каждая гиперссылка в списке включает адрес URL, содержащий достаточно информации, чтобы следующий сценарий мог загрузить и вывести конкретное сообщение. Как мы узнали в предыдущей главе, это простейший прием сохранения информации о состоянии для передачи между страницами и сценариями.
Если все в порядке, этот сценарий сгенерирует разметку HTML страницы со списком для выбора почтовых сообщений, изображенную на рис. 16.8. Если вы, как и я, получаете много почты, то, чтобы увидеть конец списка, может понадобиться прокрутить страницу вниз. Благодаря модулю commonhtml эта страница получает оформление, общее для всех страниц PyMailCGI.
Если сценарий не сможет получить доступ к вашей учетной записи почты (например, из-за ввода неправильного пароля), то обработчик в инструкции try создаст стандартную страницу с сообщением об ошибке.
На рис. 16.9 показана такая страница, сообщающая о возникшем исключении Python и его деталях после перехвата действительной исключительной ситуации. Как обычно, информация об исключении извлекается с помощью функции sys.exc_info, а для получения трассировочной информации используется модуль Python traceback.
/ J PyMailCGI: mail sele… \.Ф_.
<- C ft ☆ http://localhost:8000/cgi-bin/onViewPswdSubmit.py
PyMailCGI mail selection list
Mew |
I’m a Lumberjack, and I’m Okay | lutz@rmi.net Wed. 5 May 2010 11:29:36 -0400 (EDT |
View |
А В C D E F G | Eric.the.Half.a.Bee@yahoo.com | Thu, 06 May 2010 14:11:07 -0000 |
Mew |
a b c d e f g | Eric.the.Half.a.Bee@aol.com | Thu, 06 May 2010 14:32:32 -0000 |
View |
test interactive smtplib | PP4E@leaming-python.com | Thu, 06 May 2010 10:58:40 -0400 |
Mew |
Among our weapons are these | Cardinal@hotmail.com | Fri, 07 May 2010 20:32:38 -0000 |
Mew |
testpymail2 send | lutz@rmi.net | Sat, 08 May 2010 19:44:25 -0000 |
Mew |
testing mailtools package | PP4E@learning-python.com | Thu, 13 May 2010 20:43:37 -0000 |
View |
Re: Conhe^a mais uma novidade LC2! | PP4E@leaming-python.com Tue, 01 Jun 2010 23:54:08 -0000 |
View |
testing pymailgui send | lutz@leaming-python.com Thu, 03 Jun 2010 21:05:57 -0000 |
Mew |
Live Organ Transplants! | PP4E@leaming-python.com | Fri, 04 Jun 2010 00:44:32 -0000 |
Mew |
Re: Live Organ Transplants! PP4E@leaming-python.com Fri, 04 Jun 2010 02:05:30 -0000 |
View |
Fwd: Live Organ Transplants! PP4E@leaming-python.com Fri, 04 Jun 2010 02:26:35 -0000 |
Mew |
Already got one… | PP4E@leaming-python.com | Fri, 04 Jun 2010 06:30:26 -0000 |
Mew |
test reply all | PP4E@leaming-python.com | Sat, 12 Jun 2010 15:47:01 -0000 |
Mew |
source code line count sheets, june PP4E@leaming-python.com Sun, 13 Jun 2010 18:25:22 -0000 |
View |
hello from PyMailCGI | PP4E@leaming-python.com | Sat, 19 Jim 2010 21:09:00 -0000 |
Back to root page
Рис. 16.8. Страница PyMailCGI списка выбора сообщений, начало
/^PyMailCGLErrarpa^x
<■ ->| C ft ☆ http://localhost:8000/cgi—bin/onViewPswdSubmit.py ► |D’ A’
PyMailCGI Error
Error Description
Error loading mail index
Python Exception
<class ,socket.gaierror’>
Exception details
[Ermo 11004] getaddrinfo failed
Exception traceback
File "C:\Users\markXStuff\BooksX4E\PP4EXdevXExamplesXP₽4EXInternetXWebXPyMailCgiXcc newtnails = loadmail.loadmailhdrs(mailsite, mailuser, mailpswd)
File "C:\Users\mark\Stuff\Books\4E\PP4E\dev\Examples\PP4E\Internet\Web\PyMailCgi\cc hdrs, sizes, full = fetcher.downloadAllHeaders(} # get list of hdr text
File ".-\..X..X..\PP4E\Internet\Email\mailtools\mailFetcher.py", line 126, in down] server = self.connect() # mbox now locked until quit
File ".-\..X..X..\PP4E\Internet\Email\mailtools\mailFetcher.py", line 34, in connec server — poplib.POP3(self.popServer)
Рис. 16.9. Страница PyMailCGI с сообщением об ошибке регистрации
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011