Обработка содержимого электронной почты в формате HTML

obrabotka soderzhimogo elektronnoj pochty v formate html Почтовый клиент PyMailGUI Python

До настоящего момента мы рассматривали базовые операции PyMailGUI в контексте простых текстовых сообщений. Мы также видели, что она может обрабатывать вложения в формате HTML, но мы еще не сталкивались со случаем, когда основной текст сообщения является разметкой HTML. В настоящее время использование формата HTML для представления основной части электронных писем стало обычным делом. Поскольку компонент редактора PyEdit, используемый программой PyMailGUI, опирается на виджет Text из библиотеки tkinter, ориентированный на простой текст, содержимое в формате HTML приходится обрабатывать особым образом:

     Для почтовых сообщений с альтернативной частью типа text/HTML PyMailGUI отображает в окне просмотра часть с простым текстом и добавляет кнопку, позволяющую по требованию открыть разметку HTML в веб-броузере.

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

Во всех случаях отображение интернациональных символов, присутствующих в разметке HTML, в веб-броузере зависит от информации о кодировках, имеющейся в тегах HTML, от механизма определения кодировки или от настроек пользователя. Корректно оформленные части в формате HTML уже содержат теги «<meta>» в разделах «<head>», определяющие имя кодировки, но они могут быть определены некорректно или вообще отсутствовать. Подробнее о поддержке интернационализации мы поговорим в следующем разделе.

На рис. 14.38 представлен случай просмотра альтернативной части типа text/HTML, а на рис. 14.39 показано, что происходит при просмотре сообщения, содержащего только текст в формате HTML. На рис. 14.38 веб-броузер был открыт щелчком на кнопке, соответствующей части в формате HTML, — этот случай ничем не отличается от примера с вложением в формате HTML, который мы видели выше.

Однако сообщения, содержащие только разметку HTML, обрабатываются в этой версии иначе: окно просмотра, на рис. 14.39 слева, отображает результат извлечения простого текста из разметки HTML, отображаемой в веб-броузере позади этого окна. Механизм синтаксического анализа HTML, используемый для этого, представляет собой первоначальный прототип, но даже те результаты, которые он способен воспроизвести, предпочтительнее, чем отображение исходной разметки HTML в окне просмотра. Для простейших почтовых сообщений в формате HTML, которые обычно отправляются отдельными лицами, а не компаниями, занимающимися массовыми рассылками рекламы (подобными той, что показана здесь), результаты при тестировании получаются в целом неплохие, хотя время покажет, как этот прототип будет чувствовать себя в суровых джунглях нестандартной разметки HTML — дальнейшее его улучшение весьма желательно.

Рис. 14.38. Просмотр сообщений с альтернативной частью типа text/HTML

 

Рис. 14.39. Просмотр сообщений, содержащих только разметку HTML

 

Одно замечание: программа PyMailGUI в настоящее время может отображать разметку HTML в веб-броузере и извлекать из нее простой текст, но она не может отображать разметку HTML непосредственно в своем собственном окне и не поддерживает ее редактирование. Данная функциональность относится к разряду расширений, ожидающих, когда свое внимание им уделят другие программисты, которые посчитают это полезным.

Поддержка интернационализации содержимого

Наша следующая особенность является следствием неизбежного успеха Интернета. Как описывалось выше, в разделе, где перечислялись нововведения в версии 3.0, программа PyMailGUI полностью поддерживает интернациональные наборы символов в почтовых сообщениях — текстовое содержимое и заголовки декодируются перед отображением и кодируются перед отправкой в соответствии со стандартами электронной почты, MIME и Юникода. Это, пожалуй, самое заметное новшество в данной версии программы. К сожалению, это сложно отразить на снимках с экрана, но вы можете получить более полное представление об этой особенности, открыв следующий файл с сохраненными почтовыми сообщениями, включенный в состав примеров, и просмотрев сообщения из него в форматированном и в исходном виде, попробовав создавать на их основе ответы или пересылаемые сообщения, и так далее:

C:\\PP4E\Internet\Email\PyMailGui\SavedMail\i18n-4E


PJ PyMailGU 3.0 — View

 

From: "eweeMy^imaschinaxom’ <eweetdy$ima$chinaxom>

 

(atwei

 

Ta

 

luU^rmuwt

 

pp PyMatIGUl 3.0 — View

 

Parb

 

Split

 

Subject

 

part 001.txt

 

Edit Search Tools

 

part 001. txt

 

part 002.htm

 

антикризисный шанс <l2000ena&almi.ru-

 

i.nct

 


PP PyMailGUI 30 — CAUien\mar1r\Stu1^Boota\4F\PP4F\dev\Fx*mple

 

По вопросам подробной информации и регистарации обращайтесь по

 

Рис. 14.40. Поддержка интернационализации, заголовки и тело декодированы для отображения

 

подпись: пидч.1.п м1дыгн.ми


006 | СопЬафа nala uma novidada I US* — Personal! •007 I КННЖ278» ЧЯНТ X I

000 | Ra; оптмимвация движения I PPiKOlaarninq F 009 I Ko; oimootaauKM движении | EP4K9learning*f

010 I rwd: 2И)Я*»хЛй»Н-»|Т WUflrjfeM I

Для демонстрации особенностей этой поддержки на рис. 14.40 показана ситуация, когда данный файл был открыт для разнообразия с одной из альтернативных настроек учетной записи, описываемых в следующем разделе. На этом снимке изображено окно со списком сообщений и окна просмотра с сообщениями на русском и китайском языках, отправленными на мой почтовый адрес (эти письма рекламного характера не имеют какого-то особого значения, но вполне пригодны для тестирования). Обратите внимание, что и заголовки сообщений, и их содержимое было корректно декодировано для отображения как в окне со списком, так и в окнах просмотра сообщений.

На рис. 14.41 показаны фрагменты исходного текста двух сообщений, полученные двойным щелчком на соответствующих им элементах списка (вы можете просмотреть эти сообщения, открыв указанный выше файл, если не сможете разглядеть какие-то детали на снимке в книге). Обратите внимание, что тело обоих сообщений представлено в кодированном виде в соответствии с требованиями стандартов MIME и Юникода — заголовки вверху и текст внизу в этих окнах представлен в виде строк в формате Base64 и quoted-printable, которые необходимо декодировать, чтобы получить форматированный результат, изображенный на рис. 14.40.

Информация в заголовках текстовых частей описывает схемы кодирования их содержимого. Например, значение charset="gb2312" в заголовке «Content-type» идентифицирует набор символов Юникода китайского языка, а заголовок «Content-Transfer-Encoding» определяет формат MIME (например, base64).


 


‘Ji Pyf dit 2.1 — raw message text


file Wit search tools Help


■■?gb2312?b?3XdllWteeUBpbWPaY2hpbadtuY29t?a* <awaakly8iMachina.com>


Subject: -7gb23127b7waKltLnbv7TNqb/L0d29asrTxrVtX^DC0»<2hoxr7w/el*>tox0/KII4MrTt7234A—7-

Date: Fri, 21 May 2010 09:45:33 «0800 MM


x-Mailor: Brososoft KMailer 2.0. MXNE-Vexaion: 1.0


boundary»* -Nextrart00A_000_61277812D"

X-ELNK-Reeeieed-Into! ape 0;

X-ELNK-AV: 0

X-EUIX-Xnfo: abv»0; abxc’.O; sbf’Ob; ebw’OOO;


Thia is a multi-port message in NIKE fonul.


■NoxtPart00A_000_(1277812D

Content-Type: text/plain;

charset-*gb2112*

Content-Transfer-Encoding: base€4


Bb7Tyrs*s^>XVBlMuPMXvaOax*vRudPD9PRNTX.jxyr2yCb*OXQn


»WextPart00A_000_81277ll2D

Content-Typer text/html; cXiarsete*gb2312" Content-Transfer-Encoding: baae«4


PCrET0NUWVBrXGh0bWvgUFVCTElDXCXtX.y9XM0NT1.0Rtn<CBYOFRNT Ly9rTi:g:mh0dHA€Ly93d3cudtMub3JnLlML3hodOlsHS9EVEQvn bC5kdGQiPg0KPGh0bWvgeGlsbnM9Xnh0dHA6Ly93d3cudzMub3JnL YWQaPeiIdGEgaKROcCllcXVpdj0iQ29uddVudClUeXBlt iBjb250l YXJx3XQ9dXltaiI.TgxIC8*DO=8dalObCO-‘xFm/y9b6»rrC9L«vyv3Xl


‘.Ji PyFdrt 2.1 ■ raw message1 text


t.le Ld.t Search tools Help


From: »7koi8-r?B?98HbXMHOlNnL0snaydPO2cog28HO0«»»?» -C12000ona8almi.ru> To: <gmctadtrai. net>

Subject: ■7koi8-r?B?79DUye3J2eXDydBgxNfJleXOydtgxMXOxdbO2cgg0M/U»8vPlyDJXMPO7- «?koi8-x?B?ydbPsanBXMnaxMX81»XLXMvPadDBx»nJLg’»?-

Pete; Tua. II Nay 2010 10:01:19 >0900

MINE-Verslon: 1.0

Content-Type: multipart/alternative;


boundary»"-


_NextPart_000_0007_01CAF«2«. 52DBD810*


X-Nailer: Microsoft Outlook Express €.00.2900.2180


X-ELNK-Received-Xnfo: spv«l;


_Next?art_000_0007_01CAF626.S2DBD810


chareet»“koi8-


=20


■C9»CB«C1«D2»

■20


| Save [ Cut | Copy | Paste | find |


Help


Рис. 14.41. Исходный текст интернационализированных сообщений, закодированные заголовки и тело


Здесь также присутствуют заголовки, кодированные в соответствии со стандартами поддержки интернационализации, — их содержимое само описывает формат MIME и кодировку Юникода. Например, префикс =?koi8-r?B в заголовке означает текст на русском языке в формате Base64. Программа PyMailGUI достаточно интеллектуальна, чтобы декодировать полные заголовки и компоненты имен в адресах независимо от того, закодированы они полностью (как показано здесь) или просто содержат кодированные подстроки (как в других почтовых сообщениях, хранящихся в файле version30-4E в каталоге SavedMail).

Дополнительно на рис. 14.42 показано, как выглядят основные части сообщений после их открытия с помощью соответствующих кнопок быстрого доступа. Содержимое частей было сохранено в файл в двоичном режиме после преобразования из формата MIME, а компоненты PyEdit в окнах просмотра выполняют их декодирование в соответствии с именами кодировок, полученными из заголовков сообщений. Как мы узнали в главах 9 и 11, стоящая за этим библиотека tkinter обычно отображает декодированные строки str лучше, чем двоичные строки bytes.

К настоящему моменту мы увидели, как PyMailGUI отображает интернационализированные сообщения, но эта программа позволяет также отправлять их и выполняет любые операции кодирования, предполагаемые текстовым содержимым. На рис. 14.43 демонстрируется результат запуска операций создания ответа и пересылки сообщения на русском языке, при этом, чтобы оградить случайного адресата от его получения, был изменен адрес в заголовке «To». Заголовки в окне просмотра


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 



Центры

 

Save Cut Copy Paste Find

 

Рис. 14.42. Основные текстовые части интернационализированных сообщений, декодированные компонентами PyEdit

 

были декодированы перед отображением, закодированы перед отправкой и вновь декодированы перед отображением. Текстовые части в теле письма точно так же были декодированы, закодированы и вновь декодированы, кроме того, были декодированы цитированные заголовки и оригинальный текст, начинающиеся с символов «>» и добавленные в конец сообщения.

И наконец, на рис. 14.44 демонстрируется фрагмент исходного текста ответа на русском языке, форматированное представление которого можно видеть в правом нижнем окне на рис. 14.43. Щелкните дважды на соответствующем элементе списка, чтобы рассмотреть его во всех подробностях. Обратите внимание, что и заголовки, и текст тела сообщения были закодированы в соответствии со стандартами электронной почты и MIME.

Согласно действующим настройкам текст в теле сообщения перед передачей всегда кодируется с применением кодировки UTF-8 и преобразуется в формат MIME, если его не удается закодировать как текст ASCII — настройке по умолчанию, заданной в модуле mailconfig. При желании можно определить другие настройки по умолчанию, в соответствии с которыми текст будет кодироваться перед отправкой. Фактически, текст, который не может вставляться непосредственно внутрь полного текста сообщения, преобразуется в формат MIME точно так же, как двоичные вложения, такие как изображения.


 


PyMaiFGU 3.0 View


Cancel


Parts


From; PP4l@learninq-pytbon.com

Ta PP4E@lcarning python.com


Split


sunjetr г»и- amwwm-ini. яяиакдкл*


PJ PyMailGlB 10 • View


Edit Search Toots


Cancel


Part»


Thanks, —Mark Lutr (http;//learning-python.’


From: PP4E@learmng-pyThon.com

Ta Ваш антикризисный шанс <i2000nonetuch@alminj>, PP4( ©leaminq-pythoacom

Cc luti@rmi.net

Subject Re Оптимизация движения денежных потоков и снижения издержек компании.


Spilt


part 000 txt


fdit Search Toon


Thank з ,


None


> ——Original Meaaage——

> From: Baai антикризисным ване <12000епа8а1м1.r > To; gmcfad8rmi.net

> Subject: Оптимизация движения денежных потоке > Date; Tue, 18 May 2010 10;06;19 >0900


> ——Original Message—-

> From; "eweeklyHinaachina.соя" <eweel

> To: luts8rmi.net

> Subject; 5 Ш5Я*5’5?.ЖШДЯ-Л¥.

> Date: Fri, 21 May 2010 09:45:33 +08<


Рис. 14.43. Результат выполнения операций ответа и пересылки сообщений с интернациональными символами, повторно декодированными


 


Рис. 14.44. Исходный текст ответа на русском языке, заголовки и тело письма закодированы повторно


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


То же относится и к неинтернационализированным наборам символов. Например, текстовая часть сообщения на английском языке, содержащая кавычки не из диапазона символов ASCII, будет закодирована с применением кодировки UTF-8 и преобразована в формат Base64, точно так же, как сообщение на рис. 14.44, при этом предполагается, что программа чтения почты получателя должна будет выполнить декодирование (все современные клиенты электронной почты поддерживают такую возможность). Это позволяет встраивать текст с символами вне диапазона ASCII в полный текст отправляемого сообщения.

Заголовки отправляемого сообщения тоже кодируются с применением кодировки UTF-8, если они содержат символы вне диапазона ASCII, благодаря чему они могут вставляться в полный текст сообщения. Фактически, если внимательно рассмотреть это сообщение, можно заметить, что заголовок «Subject» первоначально был закодирован с применением кириллической кодировки, но теперь он закодирован с применением кодировки UTF-8 — это новое представление воспроизводит те же самые символы (кодовые пункты) при декодировании для отображения.

Проще говоря, несмотря на то, что графический интерфейс по-прежнему остается англоязычным (метки и прочие надписи), операции отображения и отправки электронных писем поддерживают произвольные наборы символов. Декодирование для отображения, где это возможно, выполняется в зависимости от конкретного содержимого, с использованием информации в заголовках для текстового содержимого сообщения и содержимого в заголовках для самих заголовков. Кодирование для отправки выполняется в соответствии с пользовательскими настройками и правилами, с использованием пользовательских настроек или ввода или кодировки UTF-8 по умолчанию. Обязательное преобразование в формат MIME и кодирование заголовков электронной почты выполняется в значительной мере автоматически пакетом email, лежащим в основе программы.

Здесь не показаны диалоги, которые могут выводиться для запроса кодировок текстовых частей во время отправки, если это определено настройками в mailconfig. Подобные диалоги при определенных пользовательских настройках выводит и редактор PyEdit. Некоторые из этих пользовательских конфигураций задумывались для иллюстрации и для полноты картины. Предопределенные настройки прекрасно подходят для большинства ситуаций, с которыми мне приходилось сталкиваться, но у вас могут оказаться иные требования к поддержке интернационализации. Чтобы получить более полное представление, поэкспериментируйте с сообщениями, хранящимися в файле, на своем компьютере и рассмотрите исходный программный код системы.

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

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

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