Страница выбора почты из списка

stranica vybora pochty iz spiska Сервер PyMailCGI

После заполнения поля пароля в предыдущей странице и нажатия кнопки 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/cgibin/onViewPswdSubmit.py ► |DA

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

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