Язык программирования Python
Шрифт:
connect.sendmail(fromaddr, toaddr, message % vars)
connect.quit
Следует заметить, что toaddr в сообщении (в поле To) и при отправке могут не совпадать. Дело в том, что получатель и отправитель в ходе SMTP–сессии передается командами SMTP–протокола. При запуске указанного выше примера на экране появится отладочная информация (ведь уровень отладки задан равным 1):
Листинг
send: 'ehlo rnd.onego.ru\r\n'
reply: '250–mail.onego.ru Hello as3–042.dialup.onego.ru [195.161.147.4], pleased to meet you\r\n'
send: 'mail FROM:<student@mail.ru> size=270\r\n'
reply: '250 2.1.0 <student@mail.ru>… Sender ok\r\n'
send: 'rcpt TO:<rnd@onego.ru>\r\n'
reply: '250 2.1.5 <rnd@onego.ru>… Recipient ok\r\n'
send: 'data\r\n'
reply: '354 Enter mail, end with ".» on a line by itself\r\n'
send: 'From: Student <student@mail.ru>\r\n … '
reply: '250 2.0.0 iBPFgQ7q028433 Message accepted for delivery\r\n'
send: 'quit\r\n'
reply: '221 2.0.0 mail.onego.ru closing connection\r\n'
Из
В ходе одной SMTP–сессии можно отправить сразу несколько писем подряд, если не вызывать quit.
В принципе, команды SMTP можно подавать и отдельно: для этого у объекта–соединения есть методы (helo, ehlo, expn, help, mail, rcpt, vrfy, send, noop, data), соответствующие одноименным командам SMTP–протокола.
Можно задать и произвольную команду SMTP–серверу с помощью метода docmd. В следующем примере показан простейший сценарий, который могут использовать те, кто время от времени принимает почту на свой сервер по протоколу SMTP от почтового сервера, на котором хранится очередь сообщений для некоторого домена:
Листинг
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
* От: 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