Запустим сценарий pymail, чтобы с его помощью прочесть и удалить письма на нашем почтовом сервере и отправить новые сообщения. Сценарий pymail может выполняться на любом компьютере с Python и сокетами, загружать почту с любого почтового сервера с интерфейсом POP, на котором у вас имеется учетная запись, и отправлять почту через сервер SMTP, указанный в модуле mailconfig, который мы написали ранее (пример 13.17).
Ниже приводится сеанс работы со сценарием на моем ноутбуке в Windows. На других компьютерах он работает идентичным образом, благодаря переносимости Python и его стандартной библиотеки.
Во-первых, мы запускаем сценарий, вводим пароль POP (напомню, что для серверов SMTP пароль обычно не требуется) и ждем, когда pymail выведет индекс списка сообщений почтового ящика — данная версия сценария загружает полный текст всех сообщений при запуске:
C:\…\PP4E\Internet\Email> pymail.py
Password for pop.secureserver.net?
[Pymail email client]
Connecting…
b’+OK <8927.1273263898@p3pop01-10.prod.phx3.gdg>’
(b’+OK ‘, [b’1 1860′, b’2 1408′, b’3 1049′, b’4 1009′, b’5 1038′, b’6 957′], 47)
There are 6 mail messages in 7321 bytes
Retrieving…
1: 1861 bytes
From =>lutz@rmi.net
Date =>Wed, 5 May 2010 11:29:36 -0400 (EDT)
Subject =>I’m a Lumberjack, and I’m Okay
2: 1409 bytes
From =>lutz@learning-python.com
Date =>Wed, 05 May 2010 08:33:47 -0700
Subject =>testing
3: 1050 bytes
From =>Eric.the.Half.a.Bee@yahoo.com
Date =>Thu, 06 May 2010 14:11:07 -0000
Subject =>A B C D E F G
4: 1010 bytes
From =>PP4E@learning-python.com
Date =>Thu, 06 May 2010 14:16:31 -0000
Subject =>testing smtpmail
5: 1039 bytes
From =>Eric.the.Half.a.Bee@aol.com
To =>nobody.in.particular@marketing.com
Date =>Thu, 06 May 2010 14:32:32 -0000
Subject =>a b c d e f g
[Press Enter key]
6: 958 bytes
From =>PP4E@learning-python.com
To =>maillist
Date =>Thu, 06 May 2010 10:58:40 -0400
Subject =>test interactive smtplib
[Pymail] Action? (i, l, d, s, m, q, ?) l 6
testing 1 2 3
[Pymail] Action? (i, l, d, s, m, q, ?) l 3
Fiddle de dum, Fiddle de dee, Eric the half a bee.
[Pymail] Action? (i, l, d, s, m, q, ?)
Как только pymail загрузит электронную почту в список Python на локальном компьютере, можно вводить буквы команд для ее обработки. Команда l выводит содержимое сообщения с указанным номером. В примере выше с ее помощью были выведены два сообщения, которые мы отправили в предыдущем разделе с помощью сценария smtpmail.
Сценарий pymail позволяет также получать подсказку по командам, удалять сообщения (фактическое удаление происходит на сервере при выходе из программы) и сохранять сообщения в локальном текстовом файле, имя которого указано в модуле mailconfig, который мы видели выше:
[Pymail] Action? (i, l, d, s, m, q, ?) ?
Available commands:
i — index display
l n? — list all messages (or just message n)
d n? — mark all messages for deletion (or just message n)
s n? — save all messages to a file (or just message n)
m — compose and send a new mail message
q — quit pymail
? — display this help text
[Pymail] Action? (i, l, d, s, m, q, ?) s 4
[Pymail] Action? (i, l, d, s, m, q, ?) d 4
Теперь выберем команду m, чтобы составить новое почтовое сообщение — pymail предложит ввести части письма, сконструирует полный текст сообщения с помощью модуля email и отправит его с помощью smtplib. Допускается указывать несколько адресов получателей, разделяя их запятыми и использовать краткую форму записи адреса «адрес» или полную «имя <адрес>». Так как отправка писем осуществляется по протоколу SMTP, в заголовке «From» можно использовать произвольные адреса; но обычно не следует этого делать (если, конечно, вы не пытаетесь получить интересные примеры для книги).
[Pymail] Action? (i, l, d, s, m, q, ?) m
From? Cardinal@hotmail.com
Subj? Among our weapons are these
Type message text, end with line="."
Nobody Expects the Spanish Inquisition! .
[Pymail] Action? (i, l, d, s, m, q, ?) q
To be deleted: [4]
Delete?y
Connecting…
b’+OK <16872.1273264370@p3pop01-17.prod.phx3.secureserver.net>’
Deleting messages from server…
Bye.
Как уже говорилось, удаление в действительности происходит только при выходе. При завершении pymail командой q сценарий сообщает, какие сообщения помещены в очередь на удаление, и просит подтвердить запрос. При подтверждении pymail снова соединяется с почтовым сервером и производит вызовы POP для удаления отобранных почтовых сообщений. Из-за того, что операция удаления изменяет порядковые номера входящих сообщений в почтовом ящике на сервере, откладывание фактического удаления до момента выхода из сценария упрощает обработку уже загруженных сообщений (мы улучшим реализацию этой операции в клиенте PyMailGUI в следующей главе).
Так как сценарий pymail загружает почту с сервера в локальный список Python только один раз при начальном запуске, необходимо заново запустить его, чтобы снова получить почту с сервера, если нужно посмотреть результат отправки почты и произведенных удалений. В следующем примере новое письмо показывается под номером 6, а первоначальное письмо, имевшее номер 4, отсутствует:
C:\…\PP4E\Internet\Email> pymail.py
Password for pop.secureserver.net?
[Pymail email client]
Connecting…
b’+OK <11563.1273264637@p3pop01-26.prod.phx3.secureserver.net>’
(b’+OK ‘, [b’1 1860′, b’2 1408′, b’3 1049′, b’4 1038′, b’5 957′, b’6 1037′], 47)
There are 6 mail messages in 7349 bytes
Retrieving…
1: 1861 bytes
From =>lutz@rmi.net
Date =>Wed, 5 May 2010 11:29:36 -0400 (EDT)
Subject =>I’m a Lumberjack, and I’m Okay
2: 1409 bytes
From =>lutz@learning-python.com
Date =>Wed, 05 May 2010 08:33:47 -0700
Subject =>testing
3: 1050 bytes
From =>Eric.the.Half.a.Bee@yahoo.com
Date =>Thu, 06 May 2010 14:11:07 -0000
Subject =>A B C D E F G
4: 1039 bytes
From =>Eric.the.Half.a.Bee@aol.com
To =>nobody.in.particular@marketing.com
Date =>Thu, 06 May 2010 14:32:32 -0000 Subject =>a b c d e f g
5: 958 bytes
From =>PP4E@learning-python.com
To =>maillist
Date =>Thu, 06 May 2010 10:58:40 -0400
Subject =>test interactive smtplib
[Press Enter key]
6: 1038 bytes
From =>Cardinal@hotmail.com
Date =>Fri, 07 May 2010 20:32:38 -0000
Subject =>Among our weapons are these
[Pymail] Action? (i, l, d, s, m, q, ?) l 6
Nobody Expects the Spanish Inquisition!
[Pymail] Action? (i, l, d, s, m, q, ?) q Bye.
Хотя это и не показано в данном примере сеанса, тем не менее, существует возможность отправлять письма сразу нескольким адресатам и включать в заголовок с адресом пары имя/адрес. Это возможно благодаря тому, что для разбиения списков адресов и их анализа сценарий использует утилиты из пакета email, описанные выше, которые корректно распознают запятые и как разделители, и как символы внутри имени. Следующие последовательности операций, например, использующие главным образом полные адреса, отправят сообщения двум и трем адресатам соответственно:
[Pymail] Action? (i, l, d, s, m, q, ?) m From? "moi 1" <pp4e@learning-python.com> To? "pp 4e" <pp4e@learning-python.com>, "lu,tz" <lutz@learning-python.com>
[Pymail] Action? (i, l, d, s, m, q, ?) m
From? The Book <pp4e@learning-python.com>
To? "pp 4e" <pp4e@learning-python.com>, "lu,tz" <lutz@learning-python.com>, lutz@rmi.net
Наконец, если вы запускали этот сценарий, вы также обнаружите, что он сохранил на вашем компьютере один файл, содержащий письмо, которое мы попросили сохранить в предыдущем сеансе; файл просто содержит необработанный текст сохраненных сообщений со строками- разделителями. Этот файл могут читать как человек, так и машина — в принципе, можно загрузить сохраненную в этом файле почту в список Python в другом сценарии, применив метод string.split к тексту файла и указав строку-разделитель. Как показано в этой книге, файл сохраняется с именем C:\temp\savemail.txt, но вы можете выбрать любое другое имя, указав его в модуле mailconfig.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011