Работа с клиентом командной строки pymail

rabota s klientom komandnoj stroki pymail Сценарии на стороне клиента

Запустим сценарий 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

To =>pp4e@learning-python.com

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

To =>PP4E@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

To =>PP4E@learning-python.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

To =>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

To? PP4E@learning-python.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

To =>pp4e@learning-python.com

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

To =>PP4E@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

To =>PP4E@learning-python.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

To =>PP4E@learning-python.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

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий