Литмир - Электронная Библиотека
A
A

Листинг

from smtplib import SMTP

connect = SMTP('mx.abcde.ru')

connect.set_debuglevel(1)

connect.docmd(«ETRN rnd.abcde.ru»)

connect.quit()

Этот простенький сценарий предлагает серверу mx.abcde.ru попытаться связаться с основным почтовым сервером домена rnd.abcde.ru и переслать всю накопившуюся для него почту.

При работе с классом smtplib.SMTP могут возбуждаться различные исключения. Назначение некоторых из них приведено ниже:

Листинг

smtplib.SMTPException

Базовый класс для всех исключений модуля.

Листинг

smtplib.SMTPServerDisconnected

Сервер неожиданно прервал связь (или связь с сервером не была установлена).

Листинг

smtplib.SMTPResponseException

Базовый класс для всех исключений, которые имеют код ответа SMTP–сервера.

Листинг

smtplib.SMTPSenderRefused

Отправитель отвергнут

Листинг

smtplib.SMTPRecipientsRefused

Все получатели отвергнуты сервером.

Листинг

smtplib.SMTPDataError

Сервер ответил неизвестным кодом на данные сообщения.

Листинг

smtplib.SMTPConnectError

Ошибка установления соединения.

Листинг

smtplib.SMTPHeloError

Сервер не ответил правильно на команду HELO или отверг ее.

Модуль poplib

Еще один протокол — POP3 (Post Office Protocol, почтовый протокол) - служит для приема почты из почтового ящика на сервере (протокол определен в RFC 1725).

Для работы с почтовым сервером требуется установить с ним соединение и, подобно рассмотренному выше примеру, с помощью SMTP–команд получить требуемые сообщения. Объект–соединение POP3 можно установить посредством конструктора класса POP3 из модуля poplib:

Листинг

poplib.POP3(host[, port])

Где host — адрес POP3–сервера, port — порт на сервере (по умолчанию 110), pop_obj — объект для управления сеансом работы с POP3–сервером.

Следующий пример демонстрирует основные методы для работы с POP3–соединением:

Листинг

import poplib, email

# Учетные данные пользователя:

SERVER = «pop.server.com»

USERNAME = «user»

USERPASSWORD = «secretword»

p = poplib.POP3(SERVER)

print p.getwelcome()

# этап идентификации

print p.user(USERNAME)

print p.pass_(USERPASSWORD)

# этап транзакций

response, lst, octets = p.list()

print response

for msgnum, msgsize in [i.split() for i in lst]:

print «Сообщение %(msgnum)s имеет длину %(msgsize)s» % vars()

print «UIDL =", p.uidl(int(msgnum)).split()[2]

if int(msgsize) > 32000:

(resp, lines, octets) = p.top(msgnum, 0)

else:

(resp, lines, octets) = p.retr(msgnum)

msgtxt = "\n».join(lines)+»\n\n»

msg = email.message_from_string(msgtxt)

print "* От: %(from)s\n* Кому: %(to)s\n* Тема: %(subject)s\n» % msg

# msg содержит заголовки сообщения или все сообщение (если оно небольшое)

# этап обновления

print p.quit()

Примечание:

Разумеется, чтобы пример сработал корректно, необходимо внести реальные учетные данные.

При выполнении сценарий выведет на экран примерно следующее.

Листинг

+OK POP3 pop.server.com server ready

+OK User name accepted, password please

+OK Mailbox open, 68 messages

+OK Mailbox scan listing follows

Сообщение 1 имеет длину 4202

UIDL = 4152a47e00000004

* От: [email protected]

* Кому: [email protected]

* Тема: KL Online Activation

+OK Sayonara

Эти и другие методы экземпляров класса POP3 описаны ниже:

Метод Команда POP3 Описание

getwelcome() Получает строку s с приветствием POP3–сервера

user(name) USER name Посылает команду USER с указанием имени пользователя name. Возвращает строку с ответом сервера

pass_(pwd) PASS pwd Отправляет пароль пользователя в команде PASS. После этой команды и до выполнения команды QUIT почтовый ящик блокируется

apop(user, secret) APOP user secret Идентификация на сервере по APOP

rpop(user) RPOP user Идентификация по методу RPOP

stat() STAT Возвращает кортеж с информацией о почтовом ящике. В нем m — количество сообщений, l — размер почтового ящика в байтах

list([num]) LIST [num] Возвращает список сообщений в формате (resp, ['num octets', …]), если не указан num, и «+OK num octets», если указан. Список lst состоит из строк в формате «num octets».

retr(num) RETR num Загружает с сервера сообщение с номером num и возвращает кортеж с ответом сервера (resp, lst, octets)

dele(num) DELE num Удаляет сообщение с номером num

rset() RSET Отменяет пометки удаления сообщений

noop() NOOP Ничего не делает (поддерживает соединение)

quit() QUIT Отключение от сервера. Сервер выполняет все необходимые изменения (удаляет сообщения) и снимает блокировку почтового ящика

top(num, lines) TOP num lines Команда аналогична RETR, но загружает только заголовок и lines строк тела сообщения. Возвращает кортеж (resp, lst, octets)

uidl([num]) UIDL [num] Сокращение от «unique–id listing» (список уникальных идентификаторов сообщений). Формат результата: (resp, lst, octets), если num не указан, и «+OK num uniqid», если указан. Список lst состоит из строк вида «+OK num uniqid»

В этой таблице num обозначает номер сообщения (он не меняется на протяжении всей сессии), resp — ответ сервера, возвращается для любой команды, начинается с «+OK " для успешных операций (при неудаче возбуждается исключение poplib.proto_error). Параметр octets обозначает количество байт в принятых данных. uniqid — идентификатор сообщения, генерируемый сервером.

Работа с POP3–сервером состоит из трех фаз: идентификации, транзакций и обновления. На этапе идентификации сразу после создания POP3–объекта разрешены только команды USER, PASS (иногда APOP и RPOP). После идентификации сервер получает информацию о пользователе и наступает этап транзакций. Здесь уместны остальные команды. Этап обновления вызывается командой QUIT, после которой POP3–сервер обновляет почтовый ящик пользователя в соответствии с поданными командами, а именно — удаляет помеченные для удаления сообщения.

Модули для клиента WWW

Стандартные средства языка Python позволяют получать из программы доступ к объектам WWW как в простых случаях, так и при сложных обстоятельствах, в частности при необходимости передавать данные формы, идентификации, доступа через прокси и т.п.

Стоит отметить, что при работе с WWW используется в основном протокол HTTP, однако WWW охватывает не только HTTP, но и многие другие схемы (FTP, gopher, HTTPS и т.п.). Используемая схема обычно указана в самом начале URL.

Функции для загрузки сетевых объектов

Простой случай получения WWW–объекта по известному URL показан в следующем примере:

Листинг

import urllib

doc = urllib.urlopen(«http://python.onego.ru»).read()

print doc[:40]

Функция urllib.urlopen() создает файлоподобный объект, который читает методом read(). Другие методы этого объекта: readline(), readlines(), fileno(), close() работают как и у обычного файла, а также есть метод info(), который возвращает соответствующий полученному с сервера Message–объект. Этот объект можно использовать для получения дополнительной информации:

Листинг

>>> import urllib

>>> f = urllib.urlopen(«http://python.onego.ru»)

>>> print f.info()

Date: Sat, 25 Dec 2004 19:46:11 GMT

Server: Apache/1.3.29 (Unix) PHP/4.3.10

Content–Type: text/html; charset=windows–1251

Content–Length: 4291

>>> print f.info()['Content–Type']

text/html; charset=windows–1251

С помощью функции urllib.urlopen() можно делать и более сложные вещи, например, передавать web–серверу данные формы. Как известно, данные заполненной web–формы могут быть переданы на web–сервер с использованием метода GET или метода POST. Метод GET связан с кодированием всех передаваемых параметров после знака "?» в URL, а при методе POST данные передаются в теле HTTP–запроса. Оба варианта передачи представлены ниже:

40
{"b":"429288","o":1}