Хабарларды талдау. 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" <zinakinch@thecanadianteacher.com>

>>> 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 классыны даналарын).