Хабарларды талдау. 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 классының даналарын).