Модуль 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 * От: online@kaspersky.com * Кому: user@server.com * Тема: KL Online Activation
...
+OK Sayonara
Эти и другие методы экземпляров класса 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" |
Работа с POP3-сервером состоит из трех фаз: идентификации, транзакций и обновления. На этапе идентификации сразу после создания POP3-объекта разрешены только команды USER, PASS (иногда APOP и RPOP). После идентификации сервер получает информацию о пользователе и наступает этап транзакций. Здесь уместны остальные команды. Этап обновления вызывается командой QUIT, после которой POP3-сервер обновляет почтовый ящик пользователя в соответствии с поданными командами, а именно - удаляет помеченные для удаления сообщения.