Опубликован: 22.12.2005 | Доступ: свободный | Студентов: 16502 / 504 | Оценка: 4.18 / 3.71 | Длительность: 16:16:00
ISBN: 978-5-9556-0109-0
Лекция 9:

Сетевые приложения на Python

Модуль poplib

Еще один протокол - POP3 ( P ost O ffice P rotocol, почтовый протокол) - служит для приема почты из почтового ящика на сервере (протокол определен в 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 описаны ниже:

Метод Команда 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-сервер обновляет почтовый ящик пользователя в соответствии с поданными командами, а именно - удаляет помеченные для удаления сообщения.

Андрей Егоров
Андрей Егоров

def bin(n):

"""Цифры двоичного представления натурального числа """

if n == 0:

   return []

n, d = divmod(n, 2)

return bin(n) + [d]

print bin(69)

Что значит здесь return[] ? Возвращает список? Непонятно какой список? Откуда он? 

 

 

Асмик Гаряка
Асмик Гаряка

Почему при вычислении рейтинга не учитывается уровень, как описано? Для всех курсов У=1, хотя для Специалист должно быть 2.

Аделина Федорова
Аделина Федорова
Россия, 155900