Базовые интерфейсы пакета email в действии

bazovye interfejsy paketa email v dejstvii Сценарии на стороне клиента

У нас нет возможности привести здесь исчерпывающую справочную информацию, тем не менее, рассмотрим несколько простых интерактивных сеансов, иллюстрирующих основы обработки электронной почты. Чтобы скон струиро вать полный текст сообщения, готового к отправке, например с помощью модуля smtplib, создайте объект Message, присвойте заголовки как ключи этого объекта и определите информационное наполнение в теле сообщения. Операция преобразования получившегося объекта в строку дает в результате полный текст почтового сообщения. Этот процесс намного более прост и не так подвержен ошибкам, как выполнение текстовых операций вручную, которые мы применяли в примере 13.19 для составления сообщений в виде строк:

>   >> from email.message import Message

>   >> m = Message()

>   >> m[‘from’] = ‘Jane Doe <jane@doe.com>’

>   >> m[‘to’] = ‘PP4E@learning-python.com’

>   >> m.set_payload(‘The owls are not what they seem…’)

>>> 

>   >> s = str(m)

>   >> print(s)

from: Jane Doe <jane@doe.com>

to: PP4E@learning-python.com

The owls are not what they seem

Анализ текста сообщения — подобный тому, что возвращает модуль poplib, — выполняется так же просто и по сути представляет обратную процедуру: мы получаем из текста объект Message с ключами, представляющими заголовки, и с информационным наполнением в теле:

>   >> s # та же строка, что и в предыдущем сеансе

‘from: Jane Doe <jane@doe.com>\nto: PP4E@learning-python.com\n\nThe owls…’

>   >> from email.parser import Parser

>>> x = Parser().parsestr(s)

>>> x

<email.message.Message object at 0x015EA9F0>

>>> 

>>> x[‘From’]

‘Jane Doe <jane@doe.com>’

>>> x.get_payload()

‘The owls are not what they seem…’

>>> x.items()

[(‘from’, ‘Jane Doe <jane@doe.com>’), (‘to’, ‘PP4E@learning-python.com’)]

Пока что продемонстрированные приемы мало отличаются от приемов использования устаревшего и ныне отсутствующего в библиотеке модуля rfc822, но, как будет показано чуть ниже, все становится намного интереснее, когда на сцене появляются сообщения, состоящие из нескольких частей. Для простых сообщений, как в примере выше, генератор walk объекта сообщения интерпретирует его как сообщение, состоящее из единственной части простого текстового типа:

>  >> for part in x.walk():

print(x.get_content_type())

print(x.get_payload())

text/plain

The owls are not what they seem.

Обработка сообщений, состоящих из нескольких частей

Для создания письма с вло же ниями не требуется прикладывать особых усилий: мы просто создаем корневой объект Message и присоединяем к нему вложенные объекты Message, созданные из объектов типов MIME, соответствующих типам присоединяемых данных. Класс MIMEText, например, является подклассом Message, который предназначен для создания текстовых частей и знает, как генерировать правильные заголовки при выводе. Классы MIMEImage и MIMEAudio являются похожими расширениями класса Message для изображений и аудиофрагментов и могут применять к двоичным данным алгоритм кодирования MIME Base64 и другие. Корневым объектом сообщения является тот, который хранит главные заголовки почтового сообщения, и вместо того, чтобы конструировать все основное информационное наполнение сообщения целиком, мы прикрепляем к корневому объекту составные части — теперь информационное наполнение приобретает вид списка, а не строки. Класс MIMEMultipart — это подкласс Message, который предоставляет методы, необходимые корневому объекту:

>  >> from email.mime.multipart import MIMEMultipart # подкласс Message

>  >> from email.mime.text import MIMEText # дополнительные заголовки+методы >>>

>  >> top = MIMEMultipart() # корневой объект Message

>  >> top[‘from’] = ‘Art <arthur@camelot.org>’ # по умолчанию nogmun=mixed

>  >> top[‘to’] = ‘PP4E@learning-python.com’

>>> 

>  >> sub1 = MIMEText(‘nice red uniforms…\n’) # вложения

>  >> sub2 = MIMEText(open(‘data.txt’).read())

>  >> sub2.add_header(‘Content-Disposition’, ‘attachment’, filename=’data.txt’) >>> top.attach(sub1)

>  >> top.attach(sub2)

Если попытаться запросить текст сообщения, в ответ будет возвращен корректно отформатированный полный текст сообщения с разделителями и всем остальным, готовый к отправке с помощью smtplib, что весьма непросто, если попробовать сделать это вручную:

>  >> text = top.as_string() # или то же самое: str(top) или print(top)

>  >> print(text)

Content-Type: multipart/mixed; boundary="===============1574823535=="

MIME-Version: 1.0

from: Art <arthur@camelot.org>

to: PP4E@learning-python.com

>   -===============1574823535==

Content-Type: text/plain; charset="us-ascii"

MIME-Version: 1.0

Content-Transfer-Encoding: 7bit

nice red uniforms

>   -===============1574823535==

Content-Type: text/plain; charset="us-ascii"

MIME-Version: 1.0

Content-Transfer-Encoding: 7bit

Content-Disposition: attachment; filename="data.txt"

line1

line2

line3

>   -===============1574823535==—

Если теперь отправить это сообщение и получить его с помощью poplib, при попытке проанализировать его полный текст мы получим объект Message, точно такой же, как тот, что был сконструирован для отправки. Генератор walk объекта сообщения позволяет обойти все его части, определять их типы и извлекать информационное наполнение:

>   >> text # тот же самый текст, что был получен в предыдущем сеансе

‘Content-Type: multipart/mixed; boundary="===============1574823535=="\nMI…’

>   >> from email.parser import Parser

>   >> msg = Parser().parsestr(text)

>   >> msg[‘from’]

‘Art <arthur@camelot.org>’

>   >> for part in msg.walk():

print(part.get_content_type())

print(part.get_payload())

print()

multipart/mixed

[<email.message.Message object at 0x015EC610>,

<email.message.Message object at0x015EC630>]

text/plain

nice red uniforms

text/plain

line1

line2

line3

Альтернативные части составных сообщений (с текстом и разметкой HTML, содержащими одну и ту же информацию) можно создавать и извлекать похожим способом. Поскольку простой объектно-ориентированный API позволяет клиентам электронной почты легко и просто анализировать и конструировать сообщения, они могут сосредоточиться на пользовательском интерфейсе, а не на обработке текста.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

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