Ниже приводится сеанс работы сценария popmail из примера 13.18, во время которого выводятся два сообщения из моего почтового ящика на сервере pop.secureserver.net — доменное имя почтового сервера моего провайдера, где располагается сайт с доменным именем learning-python. com, указанное в модуле mailconfig. Чтобы сократить размер вывода, я опустил или обрезал несколько строк заголовков сообщений, не относящихся к делу, включая типичные заголовки Received:, которые описывают хронологию передачи электронной почты. Запустите этот сценарий у себя, чтобы увидеть все многочисленные подробности, входящие в состав сообщения электронной почты:
C:\…\PP4E\Internet\Email> popmail.py
Password for pop.secureserver.net?
Connecting…
b’+OK <1314.1273085900@p3pop01-02.prod.phx3.gdg>’
There are 2 mail messages in 3268 bytes (b’+OK ‘, [b’1 1860′, b’2 1408′], 16)
[Press Enter key]
Received: (qmail 7690 invoked from network); 5 May 2010 15:29:43 -0000
X-IronPort-Anti-Spam-Result: AskCAG4r4UvRVllAlGdsb2JhbACDF44FjCkVAQEBAQkLC
AkRAx+
Received: from 72.236.109.185 by webmail.earthlink.net with HTTP; Wed, 5 May 201
Message-ID: <27293081.1273073376592.JavaMail.root@mswamui-thinleaf.atl.sa. earthl
Date: Wed, 5 May 2010 11:29:36 -0400 (EDT)
From: lutz@rmi.net
Reply-To: lutz@rmi.net
Subject: I’m a Lumberjack, and I’m Okay
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
X-Mailer: EarthLink Zoo Mail 1.0
X-ELNK-Trace: 309f369105a89a174e761f5d55cab8bca866e5da7af650083cf64d888edc 8b5a35
X-Originating-IP: 209.86.224.51
X-Nonspam: None
I cut down trees, I skip and jump,
I like to press wild flowers…
[Press Enter key]
Received: (qmail 17482 invoked from network); 5 May 2010 15:33:47 -0000
X-IronPort-Anti-Spam-Result: AlIBAIss4UthSoc7mWdsb2JhbACDF44FjD4BAQEBAQYNC gcRIq1
Received: (qmail 4009 invoked by uid 99); 5 May 2010 15:33:47 -0000
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"
X-Originating-IP: 72.236.109.185
User-Agent: Web-Based Email 5.2.13
Message-Id: <20100505083347.deec9532fd532622acfef00cad639f45.0371a89d29 wbe@emai
From: lutz@learning-python.com
Subject: testing
Date: Wed, 05 May 2010 08:33:47 -0700
Mime-Version: 1.0
X-Nonspam: None
Testing Python mail tools.
Bye.
Этот пользовательский интерфейс предельно прост — после соединения с сервером он выводит полный необработанный текст очередного сообщения, делая после каждого сообщения остановку и ожидая нажатия клавиши Enter. Для ожидания нажатия клавиши между выводом сообщений вызывается встроенная функция input. Благодаря этой паузе не происходит слишком быстрой прокрутки сообщений на экране. Чтобы зрительно выделить сообщения, они также отделяются строками дефисов.
Можно было бы сделать отображение более изощренным (например, мы могли бы с помощью пакета email анализировать заголовки, тела и вложения — смотрите примеры в этой и последующих главах), но здесь мы просто выводим целиком отправленное сообщение. Этот сценарий успешно справляется с простыми сообщениями, такими как эти два, но его неудобно использовать для чтения больших сообщений с вложениями — мы внесем дополнительные улучшения в этом направлении в последующих клиентах.
В этой книге не рассматриваются все возможные заголовки, которые только могут появляться в сообщениях электронной почты, тем не менее, некоторые из них мы будем использовать. Например, строка заголовка X-Mailer, если она присутствует, обычно идентифицирует программу-отправитель. Мы будем использовать этот заголовок для идентификации почтового клиента, написанного на языке Python. Типичные заголовки, такие как From и Subject, являются более важными для сообщений. На самом деле в тексте сообщения может пересылаться множество других заголовков. Например, заголовки Received трассируют те серверы, через которые прошло сообщение по пути к целевому почтовому ящику.
Поскольку сценарий popmail выводит весь текст сообщения в необработанном виде, здесь видны все заголовки, но в почтовых клиентах с графическим интерфейсом, ориентированных на конечного пользователя, таких как Outlook или веб-интерфейс, по умолчанию можно видеть лишь некоторые из них. Кроме того, по необработанному тексту сообщений отчетливо видно структуру электронного письма, о которой рассказывалось выше: электронное сообщение в целом состоит из множества заголовков, как в этом примере, за которыми следует пустая строка и основной текст сообщения. Однако, как мы увидим далее, они могут быть более сложными, если присутствуют альтернативные части или вложения.
Сценарий в примере 13.18 никогда не удаляет почту с сервера. Почта лишь загружается и выводится на экран и будет снова показана при следующем запуске сценария (если, конечно, не удалить ее другими средствами). Чтобы действительно удалить почту, требуется вызывать другие методы (например, server.dele(msgnum)), но такие возможности лучше отложить до момента разработки более интерактивных почтовых инструментов.
Обратите внимание, сценарий чтения декодирует каждую строку содержимого сообщения вызовом метода line.decode в строку str перед отображением. Как уже упоминалось выше, модуль poplib в версии 3.X возвращает содержимое в виде строк bytes. Фактически, если убрать вызов метода декодирования из сценария, это сразу отразится на его выводе:
[Press Enter key]
…часть строк опущена…
b’Date: Wed, 5 May 2010 11:29:36 -0400 (EDT)’
b’From: lutz@rmi.net’
b’Reply-To: lutz@rmi.net’
b’To: pp4e@learning-python.com’
b"Subject: I’m a Lumberjack, and I’m Okay"
b’Mime-Version: 1.0′
b’Content-Type: text/plain; charset=UTF-8′ b’Content-Transfer-Encoding: 7bit’ b’X-Mailer: EarthLink Zoo Mail 1.0′ b»
b’I cut down trees, I skip and jump,’
b’I like to press wild flowers…’
b»
Как будет показано далее, нам придется выполнять подобное декодирование, чтобы обеспечить возможность анализа этого текста с помощью инструментов из пакета email. Также в следующем разделе демонстрируется интерфейс, основанный на использовании строк байтов.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011