Хабарларды талдау. Message классы

Email пакеті

Электрондық пошта пакетінің модульдері бөлшектеуге, өзгертуге және RFC 2822 форматында хабар жасау үшін көмектеседі. RFC 2822 көбінесе интернеттегі электронды пошта хабарларында қолданылады.

Пакетте бірнеше модульдер бар, мәні төменде көрсетілген (қысқаша):

Message

Модуль Message классын анықтайды - email пакетіндегі хаттарды көрсету үшін негізгі класс.

Parser

Обьектілік хабарлама құрылымы арқылы алынған хабарлама мәтініндегі түрде талдау үшін ұсынылған модуль.

Header

Өрістермен жұмыс істейтін , ASCII-да ерекшелінетін, кодтауын қолданылатын модуль.

Generator

Обьектік модель негізіндегі RFC 2822 текст хабарламасын тудырады.

Utils

Хабарламаға байланысты әр түрлі кішігірім міндеттерді шешетін түрлі утилиттер

Хабарларды талдау. Message классы

Message классы – email-дің барлық пакетінде орталықтандырылған. Ол бастапқы тақырыпша (header) және денесінен (payload) тұратын хабарлармен жұмыс істеу үшін әдістерді анықтайды. Тақырыпша өрісінің аты және қос нүктемен (қос нүкте атауғада , мәнгеде кірмейді) бөлінген мәні болады. Өріс аты мәнді іздегенде регистр әріпін елемейді, дегенмен регистрдің есебімен сақталады. Класста сонымен қатар кейбір көп қолданыстағы мазмұндарға (хабарламаларды кодтау, мазмұн түрі және т.б.) қол жетімділік үшін әдістер анықталған.

Айта кететіні, хабарлама бір немесе бірнеше бөліктерден тұрады, соның ішінде бір - біріне салынған.

Message классының көбіне қолданылатын әдістер мысалы, түсініктемемен:

>>> import email

>>> input_file = open("pr1.eml")

>>> msg = email.message_from_file(input_file)

Бұл жерде pr1.eml файылындағы хабарларды оқу үшін email.message_from_file() функциясы қолданылады. Хабарламаларды email.message_from_string() функциясы арқылы алуға болады. Ал енді осы хабарламалармен кейбір операциялар жасалуы тиіс. Аттары арқылы өрістерге қол жетімділік былай іске асырылады:

>>> print msg['from']

"felton olive" <[email protected]>

>>> msg.get_all('received')

['from mail.onego.ru\n\tby localhost with POP3 (fetchmail-6.2.5

polling mail.onego.ru account spam)\n\tfor spam@localhost

(single-drop); Wed, 01 Sep 2004 15:46:33 +0400 (MSD)',

'from thecanadianteacher.com ([222.65.104.100])\n\tby mail.onego.ru

(8.12.11/8.12.11) with SMTP id i817UtUN026093;\n\tWed, 1 Sep 2004

11:30:58 +0400']

Ескере кететіні, электронды хатта received атымен берілген бірнеше өрістер болуы мүмкін (бұл мысалда олар екеу).

Кейбір маңызды мәліметтерді дайын түрде алуға болады, мысалы, мазмұн түрін, кодтауды:

>>> msg.get_content_type()

'text/plain'

>>> print msg.get_main_type(), msg.get_subtype()

text plain

>>> print msg.get_charset()

None

>>> print msg.get_params()

[('text/plain', ''), ('charset', 'us-ascii')]

>>> msg.is_multipart()

False

Немесе өрістер тізімін:

>>> print msg.keys()

['Received', 'Received', 'Message-ID', 'Date', 'From', 'User-Agent',

'MIME-Version', 'To', 'Subject', 'Content-Type',

'Content-Transfer-Encoding', 'Spam', 'X-Spam']

Хабарлама бір бөліктер тұрғандықтан, оның денесін жолдар түрінде алуға болады.

>>> print msg.get_payload()

sorgeloosheid hullw ifesh nozama decompresssequenceframes

Believe it or not, I have tried several sites to b"_"uy presription

medication. I should say that currently you are still be the best amony

...

Енді хабарлама көптеген бөліктерден тұратын мысал қарастырылған. Бұл хабарлама вируспен қалыптасқан. Ол екі бөліктен тұрады: HTML-мәтіннен және cpl файл кеңейтілуімен салынған. Хабарламаның бөліктеріне қолжетімділік үшін оның барлық бөліктерін айналып өтетін walk () әдісі қолданылады. Жол - жөнекей мазмұн түрін, Content-Type (в ct_fields) өрісін және файлдар аттарын (filenames-дегі):

import email

parts = [ ]

ct_fields = [ ]

filenames = [ ]

f = open("virus.eml")

msg = email.message_from_file(f)

for submsg in msg.walk():

parts.append(submsg.get_content_type())

ct_fields.append(submsg.get('Content-Type', ''))

filenames.append(submsg.get_filename())

if submsg.get_filename():

print "Файл ұзындығы:", len(submsg.get_payload())

f.close()

print parts

print ct_fields

print filenames

Нәтижесінде:

Файл ұзындығы: 31173

['multipart/mixed', 'text/html', 'application/octet-stream']

['multipart/mixed;\n boundary="--------hidejpxkblmvuwfplzue"',

'text/html; charset="us-ascii"',

'application/octet-stream; name="price.cpl"']

[None, None, 'price.cpl']

Хабарлама өзі multipart/mixed түріне ие екенін parts тізімінен көруге болады, ал оның екі бөлігі - text/html және application/octet-stream сәйкес. Тек соңғы бөлігімен файл аты (price.cpl) байланысты. Файл get_payload() әдісімен оқылады және оның ұзындығы шығарылады.

Айтпақшы, хабарлама басқа бөліктерге контейнер болған жағдайда, get_payload() обьект – хабарламасының тізімін шығарады (яғни Message классының даналарын).

Наши рекомендации