of 29/29

Sveu£ili²te J.J.Strossmayera u Osijeku Odjel za matematiku ...mdjumic/uploads/diplomski/ČOR02.pdf · Sveu£ili²te J.J.Strossmayera u Osijeku Odjel za matematiku Sveu£ili²ni

  • View
    219

  • Download
    0

Embed Size (px)

Text of Sveu£ili²te J.J.Strossmayera u Osijeku Odjel za matematiku...

  • Sveuilite J.J.Strossmayera u Osijeku

    Odjel za matematiku

    Sveuilini preddiplomski studij matematike

    Rebeka ordaInternet protokoli za e-mail komunikaciju

    Zavrni rad

    Osijek, 2011.

  • Sveuilite J.J.Strossmayera u Osijeku

    Odjel za matematiku

    Sveuilini preddiplomski studij matematike

    Rebeka ordaInternet protokoli za e-mail komunikaciju

    Zavrni rad

    Mentor:doc.dr.sc. Domagoj Matijevi

    Osijek, 2011.

  • Saetak

    Protokoli su skup pravila koja odreuju kako dva ureaja ili programa meusobno komuni-ciraju. Oni odreuju formate poruka i naine kako ih raunala izmjenjuju. SMTP, POP iIMAP su protokoli za e-mail komunikaciju. SMTP protokol slui za slanje poruka od kli-jenta do servera. POP protokol slui za dohvaanje poruka od servera skidajui sve podatkesa servera. IMAP protokol takoer slui za dohvaanje poruka sa servera, ali pritom neskida poruke na raunalo nego ih ita i obavlja operacije nad njima na udaljenom serveru.Programski jezik Python sadri biblioteke u kojima su implementirane najbitnije funkcijekoje koriste odreeni protokoli. U biblioteci smtplib su implementirane funkcije koje koristiSMTP protokol. Biblioteka poplib sadri funkcije koje koristi POP protokol, a bibliotekaimaplib sadri funkcije koje koristi IMAP protokol.

    Kljune rijei

    protokol, SMTP, POP, IMAP, e-mail, klijent, server, RFC, Python

    Abstract

    Protocols are a set of rules that determine how the two devices or applications communicatewith each other. They dene message formats and how the computers send messages to eachother. SMTP, POP and IMAP are protocols for e-mail communication. SMTP protocolis used for sending messages from client to server. POP protocol is used for retrievingmessages from server by downloading all messages from server to computer. IMAP protocolis also used for retrieving messages from server, but it doesn't download messages to thecomputer. It reads messages and performs operations on them on remote server. Pythonprogramming language contains libraries where the most important functions that protocolsuse are implemented. The smtplib library contains most important functions which are usedby SMTP protocol. The poplib library contains most important functions which are used byPOP protocol, while the imaplib library contains most important functions which are usedby IMAP protocol.

    Key words

    protocol, SMTP, POP, IMAP, e-mail, client, server, RFC, Python

    1

  • Sadraj

    1 Uvod 3

    2 SMTP, POP3 i IMAP,

    protokoli za e-mail komunikaciju 4

    2.1 SMTP protokol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.1.1 SMTP i Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    2.2 POP protokol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.2.1 POP3 i Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

    2.3 IMAP protokol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.3.1 IMAP i Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

    3 Implementacija mail klijenta u Pythonu 15

    4 Zakljuak 25

    5 Literatura 26

    6 Prilog - popis slika 27

    2

  • 1 Uvod

    Kako se u dananje vrijeme internet sve bre iri i koliina podataka koji krue tomglobalnom mreom se svake godine viestruko poveava potrebni su neki alati kojima e seomoguiti brzo i sigurno slanje podataka izmeu korisnika. Jedni od tih alata su i internetprotokoli. U ovom radu u se baviti internet protokolima za e-mail komunikaciju, tj. SMTP,POP i IMAP protokolima.

    Rad je podijeljen na est dijelova: Uvod, SMTP, POP i IMAP, protokoli za e-mail ko-munikaciju, Implementacija mail klijenta u Pythonu, Zakljuak, Literatura i Prilog - popisslika.

    Poglavlje SMTP, POP i IMAP, protokoli za e-mail komunikaciju poblie pojanjava sampojam protokola i kako oni funkcioniraju. Poglavlje je podijeljeno na tri potpoglavlja: SMTPprotokol, POP protokol i IMAP protokol. U svakom od tih potpoglavlja je poblie objanjenprincip rada odreenog protokola te kratka povijest razvitka samog protokola kao i njegovihmehanizama za autentikaciju. U sklopu svakog potpoglavlja postoji jedan odlomak kojigovori o protokolu i programskom jeziku Python, tj. na koji je nain odreeni protokolimplementiran u Python te su nabrojane i pojanjene najbitnije funkcije biblioteke u kojojje odreeni protokol implementiran.

    Kao praktini dio ovog rada sam implementirala mail klijent u programskom jezikuPython. Prilikom implementacije koristila sam sva tri gore navedena protokola i funkcijeiz Pythonovih biblioteka u kojima su ti protokoli denirani. Poglavlje Implementacija mailklijenta u Pythonu sadri slike tog mail klijenta, kao i pojanjenja kako se odreeni diograkog suelja napravio. Nadalje, priloene su i pojanjene slike najbitnijih dijelova kdaiz kojih se vrlo jasno vidi praktina primjena navedenih protokola.

    3

  • 2 SMTP, POP3 i IMAP,

    protokoli za e-mail komunikaciju

    1969. godine je amerika vladina agencija ARPA uspjela spojiti nekoliko raunala saetiri odvojena sveuilita u jednu mreu koja je sluila za razmjenu podataka. Tu mreusu oni nazvali ARPANET. Bitan detalj kod kreiranja te mree je bio da e ako doe dooteenja na nekom dijelu mree komunikacija dalje nastaviti normalno kao da se nita nijedogodilo jer e podaci pronai neki drugi put da dou do odredita. Taj detalj je bio posebnozanimljiv amerikoj vojsci, pa se 1983. godine ARPANET podijelio na civilni (ARPANET)i vojni (MILNET) dio. Ta mrea se kasnije razvila u internet kakav danas poznajemo.Kako na internetu postoji sve vie i vie podataka potrebni su nam neki mehanizmi kojimae ti podaci putovati kroz mreu i sigurno stizati na odredite. Jedni od tih mehanizama sui internet protokoli. Protokoli su skup pravila koja odreuju kako dva ureaja ili programameusobno komuniciraju. Oni odreuju formate poruka i naine kako ih raunala izmjen-juju. Ugrubo internet protokole moemo podijeliti na transportne protokole i na servisneprotokole. Neki od transportnih protokola su: TCP/IP, UDP, SCTP, RSVP itd., a neki odservisnih protokola su: DNS, FTP, HTTP itd. i nama posebno zanimljivi SMTP, POP iIMAP.SMTP, POP i IMAP su protokoli za e-mail komunikaciju. Oni slue za prijenos naih elek-tronikih poruka s jednog raunala na drugo. Sva tri protokola su se razvila osamdesetihgodina dvadesetog stoljea. Tada je internet jo bio jako mala mrea i svi su bili prijateljskinastrojeni, pa su tim protokolima falili mehanizmi za autentikaciju. Svi su slali poruke nameusobno povjerenje. Svi internet protokoli su denirani u nekom RFC-u. RFC (requestfor comment) je serija zabiljeki o internetu u kojoj se deniraju novi protokoli i mehanizmi.Svaki RFC dobiva svoj broj. Jednom denirani i objavljeni RFC se ne smije mijenjati, paako se naprave neke nadogradnje na protokolu one se moraju denirati u potpuno novomRFC-u. Pa je tako SMTP prvi put deniran u RFC 821, POP u RFC 918, a IMAP u RFC1064, dok su dananje verzije koje mi trenutno koristimo denirane redom u RFC 5321, RFC2449 i RFC 2060.U poetku su svi internet protokoli bili vrlo jednostavni, pa su i SMTP, POP i IMAP mogliprenositi samo tekstualne podatke, ali kako se poveavala kompleksnost podataka na inter-netu postalo je jasno da se ti protokoli moraju nadograditi kako bi mogli slati i druge vrstepodataka osim tekstualnih. U tu svrhu se razvio MIME (Multipurpose Internet Mail Ex-tensions) standard koji dekodira binarne datoteke kako bi se mogle prenositi putem SMTP,POP i IMAP protokola.U ovom poglavlju u vam pokuati pribliiti SMTP, POP i IMAP protokole za e-mail ko-munikaciju.

    4

  • 2.1 SMTP protokol

    SMTP (Simple Mail Transfer Protocol) je internet standard koji slui za prijenos elek-tronike pote putem mrea zasnovanih na internet protokolima. Prvi puta je deniran uRFC821 1982. godine, a zadnji puta je auriran u RFC5321 2008. godine, gdje je dodan iESMTP, tj. proireni SMTP. SMTP protokol je odreen za prijenos odlazne pote i za tokoristi TCP port 25.1960 - ih godina su se koristili razni standardi za slanje elektronike pote s jednog raunalana drugo. Ljudi su komunicirali jedni s drugima koristei standarde napravljene posebno zaoperativne sustave koje je koristilo njihovo raunalo i mogli su slati poruke samo ljudimakoji su koristili isti takav sustav. Kako se sve vie i vie raunala meusobno povezivalo(naroito u mrei amerike vlade ARPANET) razvijali su se standardi koji su dozvoljavalislanje elektronike pote i korisnicima koji su koristili drukiji operativni sustav od vas. Uprocesu razvoja tih standarda 1970-ih godina se razvio i SMTP. On je prvi puta implemen-tiran 1971. u Mail Box protokolu i u SNDMSG programu. U to je vrijeme u ARPANETbilo spojeno samo 50-ak raunala. 1973. godine je implementiran i u FTP Mailu i MailProtocolu. Razvoj SMTP-a se nastavio kroz cijele 1970 - e sve dok se ARPANET 1980.nije pretvorio u moderni internet. Dvije godine nakon toga je Jon Postel objavio SMTP kaoRFC821. Sendmail je bio jedan od prvih agenata u koji je implementiran SMTP protokol.Neki od poznatih SMTP servera su i Postx, qmail, Novell, GroupWise, Exim, Novell Net-Mail, Microsoft Exchange Server, Sun Java System Messaging Server. SMTP protokol jeprvo bio baziran samo na istom ASCII tekstu i nije se dobro nosio sa binarnim datotekama.Kako bi se to popravilo razvijeni su standardi poput MIME koji dekodiraju binarne datotekekako bi se mogle prenositi putem SMTP-a. Mnogi ljudi su doprinjeli specikaciji SMTP-a, ameu njima su i Jon Postel, Eric Allman, Dave Crocker, Ned Freed, Randall Gellens, JohnKlensin i Keith Moore.SMTP je protokol baziran na tekstu u kojem poiljatelj alje poruku primatelju izdajuipotrebne naredbe i podatke putem neke pouzdane veze, obino TCP-a. Prilikom razmjenepodataka SMTP-om izmjenjuju se poruke SMTP klijenta i odgovarajui odgovori SMTPservera. Razmjena moe ukljuivati nijednu ili vie SMTP transakcija. SMTP transakcijase sastoji od tri slijeda naredbi i odgovora. To su:

    1. MAIL naredba pomou koje se odreuje povratna adresa, tj. adresa na koju se aljeobavijest ako poruka ne stigne na odredite.

    2. RCPT naredba kojom se odreuje primatelj poruke. Ova naredba se moe izdati vieputa, za svakog primatelja po jednom.

    3. DATA za slanje poruke teksta. Sastoji se od zaglavlja poruke i teksta poruke koji suodvojeni praznim redom. DATA je zapravo skupina naredbi na koju server odgovaradva puta: prvi put potvruje da je spreman primiti tekst, a drugi put (nakon primanjateksta) alje poruku je li primio ili odbacio cijelu poruku.

    Na sljedeoj slici je prikazan tipini primjer slanja poruke putem SMTP protokola na dvijeadrese koje imaju istu domenu.

    5

  • Slika 1. Primjer slanja poruke SMTP-omNakon to klijent uspostavi sigurnu vezu sa serverom razgovor zapoinje pozdravom serverakoji alje svoj FQDN (Fully Qualied Domain Name), a klijent odgovara naredbom HELOkojom se identicira. Koriste se prije opisane naredbe MAIL, RCPT i DATA na koje serverodgovara 250 Ok jer je sve prolo u redu. Ovdje se jasno vidi da je zaglavlje poruke odvojenood tijela poruke praznim redom. Na kraju klijent poziva naredbu QUIT i zavrava razgovor.Prvotna specikacija SMTP-a nije imala sposobnost ovjeriti autentinost poiljatelja poruke.U tu svrhu je razvijen SMTP-AUTH deniran u RFC 2554. Taj proireni SMTP (ESMTP)omoguuje klijentu da uspostavi sigurnu vezu sa serverom i ovjeri autentinost razmjenepodataka. No, ni taj mehanizam nije dovoljan za zatitu od neeljene pote, pa postojiAnti-Spam Research Group koja pokuava napraviti bolji i sigurniji SMTP protokol koji eprepoznavati i odbijati neeljenu potu.

    6

  • 2.1.1 SMTP i Python

    Python ima ugraenu implementaciju SMTP protokola u svoju standardnu bibliotekukoja je spremljena pod nazivom smtplib i omoguuje osnovne operacije sa SMTP pro-tokolom. Taj modul su napravili The Dragon De Monsyne, Eric S. Raymond, Carey Evansi Gerhard Haering kao modikaciju biblioteke HTTP lib.smtplib sadri klase za iznimke i pogreke, klasu SMTP, klasu SMTP_SSL koja nasljeujefunkcije iz klase SMTP i dodaje nove vezane za sigurnost, te klasu LMTP (Local Mail Trans-fer Protocol) koja takoer nasljeuje funkcije iz klase SMTP. Klasa SMTP je najbitnija i unjoj su sadrane naredbe, tj. funkcije koje korisnici najee koriste. U ovom potpoglavljuu se osvrnuti na najbitnije funkcije u klasi SMTP, a to su: connect, send, getreply, helo,ehlo, noop, mail, rcpt, data, verify, login, starttls, sendmail, close i quit.Funkcija connect je denirana sa connect(self, host='localhost', port = 0) i onaspaja korisnika na zadani host i port. Ako ime hosta zavrava sa : i nekim brojem, aport nije deniran, funkcija connect e automatski dio iza dvotoke shvatiti kao port na kojise treba spojiti.Funkcija send je denirana sa send(self, str). Njezin posao je poslati str (tj. neki string)serveru.Funkcija getreply je denirana sa getreply(self). Ona dohvaa odgovor servera. Odgovorservera dolazi kao ureeni par. Na prvom mjestu se nalazi kd odgovora servera, npr. `250'ako je sve u redu ili `500' ako doe do pogreke u sintaksi. Ako klijent ne moe proitatiodgovor ova e vrijednost biti postavljena na -1. Na drugom mjestu odgovora je string kojiide uz odreeni kd. Ako je to dugaak tekst koji se sastoji iz vie redova ovdje se on inter-pretira kao jedan string koji se sastoji iz vie redova.Funkcija helo je denirana sa helo(self, name=' '). Ta funkcija zapoinje razgovor saserverom. Kada koristimo funkciju helo moemo iza te naredbe denirati nau domenu daserver zna tko smo mi, npr. HELO mailhost2. cf.ac.uk. Server na tu naredbu odgovarasvojim punim imenom, tj. poalje svoj FQDN.Funkcija ehlo je denirana sa ehlo(self, name=' '). To je gotovo ista funkcija kao i helo,ali na ovaj zahtjev server odgovara svojim FQDN i uz to alje klijentu i popis svojih proirenihmogunosti ako one postoje.Funkcija noop je denirana sa noop(self). Noop znai no operation i to je funkcija kojane radi nita. Ali i ona je vrlo korisna kada npr. trebamo ekati na neku konekciju ili kadaelimo da klijent klikne neku tipku za nastavak, sve dok se to ne dogodi ova funkcija odravaprogram na ivotu, ali nita drugo ne radi.Funkcija mail je denirana sa mail(self,sender,options=[]). To je SMTP naredba mailkoju sam ve pojasnila u poglavlju SMTP protokol.Funkcija rcpt je denirana sa rcpt(self,recip,options=[]) i to je takoer kao i mailnaredba objanjeno prije u tekstu. U pythonu ovom naredbom deniramo samo jednog pri-matelja, pa ju moemo pozvati onoliko puta koliko imamo primatelja.Funkcija data je denirana sa data(self,msg). alje poruku msg serveru i dobiva dva putaodgovor od servera to je pojanjeno prije u tekstu.Funkcija verify je denirana sa verify(self, address). Ta funkcija provjerava ispravbostporuke address.

    7

  • Funkcija login je denirana sa login(self, user, password). Ovom funkcijom se klijentautenticira kada se spaja na SMTP server koji zahtjeva autentikaciju. Funkcija zaht-jeva argumente user, tj. korisniko ime i password, tj. lozinku. Ako prije pozivanja ovefunkcije nisu pozvane funkcije HELO ili EHLO ona prvo pokua uspostaviti ESMTP EHLOvezu sa serverom. Ako autentikacija ne uspije ova funkcija e vratiti jednu od sljedeihgreaka: SMTPHeloError, ako server nije pravilno odgovorio na funkciju helo; SMTPAu-thenticationError, ako server nije prihvatio uneenu kombinaciju korisnikog imena i lozinkeili SMTPException, ako nije pronaena odgovarajua metoda autentikacije.Funkcija starttls je denirana sa starttls(self, keyfile = None, certfile = None).Ova funkcija stavlja SMTP vezu u TLS nain rada. Ako prije pozivanja ove funkcije nisupozvane funkcije HELO ili EHLO ova funkcija e pozvati ESMTP EHLO. Ako server po-drava TLS starttls funkcija e ifrirati ostatak SMTP razgovora. Ako funkciji proslijedimoparametre keyle i certle mogu se provjeriti identiteti SMTP servera i klijenta.Funkcija sendmail je denirana sa sendmail(self, from_addr, to_addrs, msg,mail_options=[],rcpt_options=[]). Ova funkcija obavlja cijeli prijenos poruke. Njeniargumenti su: from_addr, adresa s koje se alje poruka; to_addr, lista adresa na koje sealje poruka (ako je uneen samo jedan string funkcija e ga gledati kao listu s jednomadresom); msg, poruka koja se alje; mail_options, popis ESMTP opcija (npr. 8bitmime) zamail naredbu; rcpt_options, popis ESMTP opcija za svaku rcpt naredbu. Ako prije pozivaove funkcije nisu pozvane funkcije HELO ili EHLO, ona e prvo pokuati pozvati ESMTPEHLO. Ako to ne uspije, pokuat e HELO naredbu i tada e ESMTP opcije biti zanemarene.Ova funkcija vraa True ako je poruka stigla bar na jednu adresu. Poslije toga vraa rijeniku kojem svako polje pripada po jednom primatelju koji nije dobio poruku. Svako polje sesastoji od ureenog para SMTP koda pogreke i odgovarajue poruke pogreke. Ako su sviprimatelji primili poruku funkcija e vratiti prazan rijenik.Funkcija close je denirana sa close(self). Ona zatvara vezu sa SMTP serverom, dokfunkcija quit koja je denirana sa quit(self) prekida sve razgovore i zatvara vezu saserverom.

    8

  • 2.2 POP protokol

    POP (Post Oce Protocol) je internet standard koji koriste e-mail klijenti kako bidohvatili poruke sa udaljenog servera, obino putem TCP/IP veze. POP protokol se razvijaokroz nekoliko verzija, ali tek je trea verzija, tj. POP3 postala standard za dohvaanjeporuka. Veina webmail servisa podrava POP3 protokol, a meu njima su i Hotmail,Gmail i Yahoo! Mail.POP1 je deniran u RFC 918, POP2 u RFC 937. POP3 je prvotno deniran u RFC 1081.Aktualna verzija POP3 protokola je denirana u RFC 1939 i nadopunjena u RFC 2449.Poetna verzija POP3 protokola je doputala samo USER/PASS autentikaciju, dok sadanjaverzija podrava nekoliko metoda autentikacija kako bi osigurao nekoliko razina zatite e-mail klijentima u pristupanju svojim porukama. Postoji i prijedlog za POP4 protokol kojibi popravio neke trenutne nedostatke POP3 protokola (npr. podravao bi pristup svimdijelovima pote, a ne samo dolaznoj poti), ali od 2003. godine se nije nita ozbiljnije radilona implementaciji POP4 protokola.Openito, e-mail klijenti koji koriste POP protokol se spoje na server, dohvate poruke, spremeih na klijentovo raunalo, obriu ih sa servera i odjave se sa servera. POP3 server slua naportu 110. Nakon ostvarenja veze server zahtjeva kriptiranu komunikaciju i za to koristiSTLS ako je podran ili POP3S koji koristi TLS ili SSL na portu 995 (npr. Gmail). Porukeu sanduiu su oznaene rednim brojevima ili jedinstvenim identikacijskim brojevima. Akosu oznaene rednim brojevima onda se resetiraju prilikom svakog spajanja na server, a ako suoznaene identikacijskim brojevima oni ostaju jednaki prilikom svakog spajanja na server itada smo sigurni da uvijek gledamo istu poruku ako otvorimo poruku s istim brojem. Klijentmoe oznaiti broj poruke koju eli obrisati i kada se odjavi sa servera ta poruka se brie izsanduia.Neki od mail servera koji koriste POP3 su: Dovecot, Mailtraq, Nginx, qmail-pop3d, RePOP,Zimbra.

    2.2.1 POP3 i Python

    Python u svojoj standardnoj biblioteci ima ugraen modul poplib koji omoguuje ko-risnicima da lako koriste sve naredbe koje POP protokol doputa. Taj modul su napraviliDavid Ascher, Piers Lauder i Hector Urtubia.poplib modul sadri klase za pogreke, klasu POP3, te klasu POP3_SSL koja nasljeujefunkcije iz klase POP3 i dodaje jo neke vezane za sigurnost. Klasa POP3 je najbitnija i unjoj su sadrane naredbe, tj. funkcije koje korisnici najee koriste. U ovom potpoglavljuu se osvrnuti na najbitnije funkcije unutar klase POP3 i poblie pojasniti to koja funkcijaradi. Najbitnije funkcije u POP3 klasi su: user, pass_, stat, list, retr, dele, noop, rset, quit,apop, top i uidl.Funkcija user je denirana sa user(self, user). Zahtjeva korisniko ime od korisnika, afunkcija pass_ koja je denirana sa pass_(self, pswd) zahtjeva korisnikovu lozinku i po-mou ta dva podatka se spaja na POP server.Funkcija stat je denirana sa stat(self). Pozivanjem ove funkcije traimo status potan-skog sanduia. Odgovor dobijemo u obliku ureenog para u kojem je na prvom mjestu broj

    9

  • poruka koje se nalaze u naem sanduiu, a na drugom mjestu ukupna veliina svih porukau byteima.Funkcija list je denirana sa list(self, which=None). Ova funkcija vraa odgovor u ob-liku (response, ['mesg_num octets', ...], octets), gdje je response odgovor servera u kojemnapie je li sve proslo u redu te stanje sanduia koje bismo dobili da pozovemo funkciju stat;['mesg_num octets',...] je lista poruka koja za svaku poruku napie broj poruke i njezinuveliinu u byteima, a octets je broj okteta (npr. ako u se u sanduiu nalaze 3 poruke taj broje iznositi 24). Primjer jednog odgovora: ('+OK 3 messages (5675 bytes)', ['1 2395','2 1626','3 1654'], 24).Funkcija retr je denirana sa retr(self, which). Vraa cijelu poruku pod brojem koji jedeniran argumentom which. Ova funkcija alje odgovor u obliku ['response', ['line', ...],octets] slino kao i funkcija list, jedino je razlika to u drugom lanu odgovora dobijemo lin-ije poruke, a ne popis poruka. Kada pozovemo ovu funkciju server e oznaiti da je porukaproitana.Funkcija dele je denirana sa dele(self, which). Ona oznaava poruku pod brojem koji jedeniran argumentom which zha brisanje. Obino se ta poruka obrie tek kada se odjavimosa servera.Funkcija noop je denirana sa noop(self) i ona isto kao i ta funkcija kod SMTP protokolane radi nita, nego samo odrava program na ivotu dok se ne klikne neka tipka na tipkovniciili dok se ne pozove neka druga funkcija.Funkcija rset je denirana sa rset(self). Nju koristimo kada elimo odznaiti sve porukekoje smo oznaili za brisanje.Funkcija quit je denirana sa quit(self). Ovom funkcijom se odjavljujemo sa servera.Server tada napravi sve potrebne promjene (npr. obrie poruke koje smo oznaili za brisanjei otkljua sandui kako bi se s nekog drugog mjesta opet mogli prijaviti u njega i na krajuprekine vezu sa klijentom.Funkcija apop je denirana sa apop(self, user, secret). apop je skraenica za autho-rized POP. Argumenti ove funkcije su user, tj. korisniko ime da server zna s kime razgovarai secret, tj. tajni kod koji znaju samo klijent i server i tako prenose poruke da ih nitko drugine moe proitati.Funkcija top je denirana sa top(self, which, howmuch). Ova funkcija vrati zaglavljeporuke pod brojem zadanim argumentom which i prvih nekoliko redova, gdje je broj tihredova zadan argumentom howmuch. Odgovor je u obliku ['response', ['line', ...], octets] istokao i kod funkcije retr.Funkcija uidl je denirana sa uidl(self, which=None). Vraa listu jedinstvenih identi-kacijskih brojeva poruka. Ako u argument which napiemo neki broj onda e ova funkcijavratiti jedinstveni identikacijski broj poruke koju smo oznaili. Ako which ostavimo prazanonda ce vratiti listu identikacijskih brojeva svih poruka koje se nalaze u sanduiu i to uobliku ['response', ['mesgnum uid', ...], octets], gdje srednji lan oznaava tu listu ureenihparova gdje je prvi broj broj poruke, a drugi identikacijski broj te poruke.

    10

  • 2.3 IMAP protokol

    IMAP (Internet Message Access Protocol) je isto kao i POP protokol za dohvaanjeporuka iz sanduia. Denirao ga je Mark Crispin 1986. godine kao suprotnost POP pro-tokolu koji je tada bio u irokoj upotrebi. IMAP protokol pristupa udaljenom potanskomsanduiu i na tom udaljenom sanduiu izvodi potrebne operacije nad porukama, za razlikuod POP protokola koji preuzme sve poruke iz sanduia na raunalo i odjavi se. IMAPje prije bio poznat pod nazivima: Internet Mail Access Protocol, Interactive Mail AccessProtocol i Interim Mail Access Protocol.Izvorni Interim Mail Access Protocol je bio implementiran kao klijent na Xerox Lisp stroju ina TOPS-20 serveru. Do danas se nije sauvala niti jedna kopija specikacije tog protokola.Interim protokol je vrlo brzo zamijenjen Interactive Mail Acces Protocol-om (IMAP2). Onje prvi puta deniran 1988. godine u RFC 1064, a auriran je 1990. u RFC 1176. IMAP2 jeprvi uveo zastavice naredbi i odgovora i to je bila prva verzija IMAP protokola koja je javnodistribuirana. IMAP3 je izumrla i vrlo rijetka verzija IMAP protokola. Deniran je 1991.u RFC 1203 i nikada nije bio prihvaen na tritu. IESG (Internet Engineering SteeringGruop) ga je proglasio "povijesnim protokolom" ve 1993. godine. Kada se razvio MIME,IMAP2 je proiren tako da podrava MIME i dodana je funkcija upravljanja datotekamaunutar sanduia koja je nedostajala u IMAP2 protokolu. Ta proirena verzija IMAP2 pro-tokola je nazvana IMAP2bis i objavljena je samo kao skica. Nikada nije bila denirana unekom RFC-u. Poetkom 1990-ih u IETF-u (Internet Engineering Task Force) je osnovanaIMAP Working Group koja je preuzela odgovornost za stvaranje dizajna IMAP2bis-a. Onisu odluili preimenovati IMAP2bis u IMAP4, kako se ne bi mijeao sa IMAP3 verzijom.Od tada akronim IMAP stoji za Internet Message Access Protocol. IMAP4 je deniran uprosincu 1994. godine u RFC 1730, a nadograen je u RFC 2060 u prosincu 1996. godine.Postoji vrlo malo implementacija klijenata i servera koji koriste IMAP4 deniran u RFC1730 zbog njegovog kratkog vijeka.Neke prednosti IMAP protokola nad POP protokolom:

    prilikom koritenja POP protokola klijent se samo nakratko spoji na server, preuzmeporuke i odjavi se, a pri koritenju IMAP protokola klijent je spojen na server dok godto eli i to ubrzava itanje poruka ako smo pristupili nekom jako velikom sanduiu(bre je vrijeme odgovora na zahtjev jer smo ve spojeni, ne moramo se ponovo spajati).

    prilikom koritenja POP protokola samo jedan klijent moe gledati sandui, dok kodIMAP protokola vie klijenata odjednom moe pristupiti istom sanduiu i postojemehanizmi koji omoguavaju klijentima da primijete promjene koje prave drugi spojeniklijenti.

    obino se poruke prenose internetom u MIME formatu i tako imaju oblik stabla kojemlistovi predstavljaju odreene tipove podataka koji se nalaze u poruci (tekst, html, slikaitd.). IMAP4 omoguuje itanje tih dijelova posebno, dok POP3 skine cijelu poruku ionda se koriste neke druge naredbe koje parsiraju poruku.

    IMAP koristi zastavice koje omoguuju klijentima da vide u kojem su stanju poruke(oznaene za brisanje, nove, proitane itd.), pa olakavaju klijentima upravljanje svojim

    11

  • porukama, a POP to ne podrava. IMAP4 omoguuje i deniranje vlastitih zastavica(npr. omiljene poruke). Jedan od servisa koji omoguuje kreiranje vlastitih zastavicaje i Gmail.

    korisnici koji koriste IMAP4 mogu stvarati, preimenovati ili brisati datoteke u svomsanduiu i premjetati poruke izmeu tih datoteka.

    IMAP omoguuje klijentima pretraivanje poruka u sanduiu po raznim kriterijimabez da skidaju sve poruke na raunalo i onda ih pretrauju kao to je to sluaj kodPOP protokola.

    2.3.1 IMAP i Python

    Python u svojoj standardnoj biblioteci ima ugraen modul imaplib koji omoguujekorisnicima lako koritenje svih naredbi koje IMAP protokol doputa. Taj modul su izradilii dopunili: Piers Lauder, Donn Cave, Anthony Baxter, Tino Lange, Andreas Zeidler, RickHolbert i Tomas Lindroos.imaplib modul sadri klase IMAP4, error, abort, readonly te klase IMAP4_SSL iIMAP4_stream koje nasljeuju sve funkcije klase IMAP4 i dodaju jo neke. IMAP4 je na-jbitnija klasa ovog modula i u ovom potpoglavlju u se osvrnuti na najbitnije funkcije iz teklase, a to su: open, read, readline, send, shutdown, recent, response, append, capability,authenticate, close, copy, create, delete, expunge, fetch, list, login, logout, noop, partial,rename, search, select, status i store.Funkcija open je denirana sa open(self, host = '', port = IMAP4_PORT). Stvara vezusa udaljenim serverom imena host i na portu koji je deniran atributom port. Ako nijedanod ta dva argumenta nije deniran ova funkcija e za njihove vrijednosti uzeti localhost istandardni IMAP4 port. Ova veza e se koristiti za radnje read, readline, send i shutdown.Funkcija read je denirana sa read(self, size). Ona uzima argument size i oitava tolikukoliinu podataka sa servera koja je zadana argumentom size. Size je veliina podataka ubyteima.Funkcija readline je denirana sa readline(self). ita jedan red podataka sa udaljenogservera.Funkcija send je denirana sa send(self, data). Ova funkcija alje podatke koji su predanifunkciji u argumentu data na udaljeni server na koji smo se prije spojili.Funkcija shutdown je denirana sa shutdown(self). Ova funkcija ne prekida vezu saserverom ve samo zatvara sve kanale za prijenos podataka koji su otvoreni funkcijom open.Funkcija recent je denirana sa recent(self). Vraa najnovije odgovore ako postoje, a akone onda ova funkcija pozove naredbu NOOP kako bi osvjeila server. Odgovor je u obliku(typ, [data]) = .recent(), ako nema poruka onda je vrijednost argumentadata None, a u suprotnom je data zapravo lista najzadnjih pozvanih naredbi i odgovora.Funkcija response je zadana sa response(self, code). Ova funkcija vraa podatke zaodgovor kojem je kod zadan argumentom code ako oni postoje, u suprotnom vrati vrijed-nost None.Funkcija append je zadana sa append(self, mailbox, flags, date_time, message).

    12

  • Ovom funkcijom dodajemo poruku u zadani sandui. Argument mailbox odreuje datotekuu sanuiu u koju emo dodati poruku; argument ags nam doputa da odaberemo zastavicekoje elimo (npr. poruka je proitana, oznaena za brisanje itd.); argument date_timeupisuje datum i vrijeme dodavanja poruke i message je sama poruka koju dodajemo u da-toteku.Funkcija capability je denirana sa capability(self). Ovom funkcijom zahtjevamo odservera da nam poalje skup svih moguih naredbi koje on podrava.Funkcija authenticate je zadana sa authenticate(self, mechanism, authobject). Ovafunkcija zahtjeva obradu odgovora. Argumentom mechanism odreujemo koji e se meha-nizam autentikacije koristiti. Taj mehanizam mora biti iz popisa mogunosti servera kojedobijemo ako pozovemo funkciju capability. Authobject mora biti neka od naredbi za kojumi zapravo moemo provesti autentikaciju odgovora.Funkcija close je denirana sa close(self). Ovom funkcijom zatvaramo trenutno oznaenudatoteku u sanduiu. Kada pozovemo ovu naredbu sve poruke koje su oznaene za brisanjese briu. Preporua se pozivanje ove funkcije prije pozivanja funkcije logout.Funkcija copy je denirana sa copy(self, message_set, new_mailbox). Kopira skupporuka koje su denirane argumentom message_set u datoteku u sanduiu koja je deni-rana argumentom new_mailbox.Funkcija create je denirana sa create(self, mailbox). Ovom funkcijom stvaramo novudatoteku u sanduiu koja e biti spremljena pod nazivom koji je dan argumentom mail-box. Npr. ako hoemo napraviti novu datoteku u sanduiu u koju emo spremati najdraeporuke moemo napisati create(favorites).Funkcija delete je denirana sa delete(self, mailbox). Ova funkcija slui za brisanjecijele datoteke iz sanduia. Ime te datoteke je dano argumentom mailbox.Funkcija expunge je denirana sa expunge(self). Kada pozovemo ovu funkciju trajnobriemo sve poruke iz datoteke u kojoj se nalazimo koje su oznaene za brisanje. Za svakuna ovaj nain obrisanu poruku se stvori odgovor `expunge'.Funkcija fetch je denirana sa fetch(self, message_set, message_parts). Ova funkcijadohvaa dijelove poruke. Odgovor dobivamo u obliku (typ, [data, ...]) = .fetch(message_set, message_parts), gdje bi argument message_parts trebao biti string, tj. skupznakova kojim emo opisati koji dio poruke elimo dohvatiti npr. `(UID BODY[TEXT])'. Utom sluaju bismo dohvatili jedinstveni identikacijski broj poruke i tekstualni dio poruke.Funkcija list je denirana sa list(self, directory='""', pattern='*'). Pozivom ovefunkcije dobijemo izlistanje svih datoteka koje imamo u sanduiu u obliku liste. Npr. jedansandui moe sadravati datoteke inbox, sent mail, outbox i deleted.Funkcija login je denirana sa login(self, user, password). Ova funkcija nas spaja saserverom. Prosljeujemo joj korisniko ime putem argumenta user i nau lozinku putemargumenta password. A funkcija logout koja je denirana sa logout(self) prekida sve vezesa serverom.Funkcija noop je denirana sa noop(self) i isto kao i kod SMTP i POP protokola to jefunkcija koja ne radi nita, ali u nekim sluajevima moe biti korisna.Funkcija partial je denirana sa partial(self, message_num, message_part, start,length). To je zapravo modicirana funkcija fetch. Ona dohvaa dio poruke s brojem kojije deniran argumentom message_num, samo to ovdje jo moramo denirati koja e biti

    13

  • poetna toka od koje emo poeti itati poruku (argument start) i koju emo koliinu po-dataka dohvatiti (argument length).Funkcija rename je denirana sa rename(self, oldmailbox, newmailbox). To je funkcijakoja slui za preimenovanje datoteka u potanskom sanduiu. Ovoj funkciji prosljeujemodva stringa, prvi je dan argumentom oldmailbox i odreuje datoteku kojoj elimo promijen-iti ime, a drugi je dan argumentom newmailbox i to je zapravo novo ime koje elimo datioznaenoj datoteci.Funkcija search je denirana sa search(self, charset, *criteria). Ovo je funkcija zapretraivanje sanduia. Odgovor dobijemo u obliku (typ, [data]) = .search(charset, criterion, ...), gdje je data lista brojeva poruka u sanduiu koje zadovoljavajuzadane kriterije pretraivanja.Funkcija select je denirana sa select(self, mailbox='INBOX', readonly=False).Ovom funkcijom oznaavamo datoteku u sanduiu s kojom elimo raditi. Ako ne up-iemo argumente funkcija e shvatiti kao da smo odabrali inbox, tj. datoteku sa pristiglimporukama.Funkcija status je denirana sa status(self, mailbox, names). Kao to kod POP pro-tokola moemo zatraiti stanje naeg sanduia, tj. broj poruka koje se nalaze u njemu injihovu ukupnu veliinu, tako i ovdje ovom funkcijom moemo traiti stanje, ali ne cijelogsanduia nego jedne datoteke u njemu koja je odreena argumentom names.Funkcija store je denirana sa store(self, message_set, command, flags). Inae, kadamijenjamo zastavice na porukama, tj. na neki nain obiljeavamo da je na pojedinimporukama dolo do promjene, te promjene se spreme tek kada se odjavimo sa servera. Ali akoelimo da se na svim ili samo na nekim porukama (to je odreeno argumentom message_set)promjene spreme ba kada mi to elimo moemo pozvati ovu funkciju.

    14

  • 3 Implementacija mail klijenta u Pythonu

    U sklopu praktinog dijela ovoga rada implementirala sam e-mail klijent u programskomjeziku Python. Kako bi mail klijent to bolje izgledao i bio to laki za upotrebu napravilasam grako suelje i u tu svrhu sam koristila wxPython. wxPython je alat za pravljenjegrakog suelja u Pythonu. Implementiran je u Python kao proirenje kako bi olakaokorisnicima pravljenje grakog suelja. Nakon instalacije wxPython proirenja moemoukljuiti wx biblioteku koja nam omoguuje stvaranje prozora, gumbova, polja za upisivanjeteksta itd. Na sljedeim slikama moete vidjeti kako izgleda grako suelje napravljeno uwxPythonu.

    Slika 2. Prozor za spajanje na server

    Slika 3. Izbornik

    15

  • Slika 4. Prozor za slanje nove poruke

    Slika 5. Popis primljenih poruka

    16

  • Slika 6. Popis poslanih poruka

    Na slici 2 se vidi prozor koji se otvori kada se program pokrene. U taj prozor upisujemopodatke u polja korisniko ime i lozinka i spajamo se na server koji upiemo u polje server.Klikom na gumb `Spoji' spajamo se na server. Ako smo nekim sluajem unijeli pogrenepodatke u status baru e se ispisati poruka `neuspjela autentikacija' i polja za upis e seoistiti i biti spremna za unos novih podataka. Neke od naredbi iz wx biblioteke koje sukoritene u ovom dijelu programa su wx.Frame, CreateStatusBar, wx.Panel, wx.BoxSizer,wx.StaticText, wx.TextCtrl, wx.Button.wx.Frame je naredba kojom napravimo prozor u koji emo slagati sve ostale objekte. Nadnu prozora moemo stvoriti statusbar, tj. traku u kojoj e se ispisivati obavijesti i topostiemo naredbom CreateStatusBar. Naredbom wx.Panel stvaramo panel koji moemoshvatiti kao neku `radnu plohu' na koju moemo slagati `kutije' i gumbe koje stvaramonaredbama wx.SetBoxSizer i wx.Button. Kutije mogu biti orijentirane horizontalno i ver-tikalno. U prozoru na slici 2 postoji jedan panel koji zauzima cijeli prozor i na njega jepostavljena jedna vertikalna kutija u kojoj su jedna ispod druge poslagane tri horizontalnekutije i na kraju jedan gumb. Kao to na panel moemo postavljati objekte tako i u kutijemoemo slagati pojedine objekte. U ovom sluaju smo za to koristili naredbe wx.StaticTexti wx.TextCtrl. Naredbom wx.StaticText smo dobili teskt Server, Korisnicko ime i Lozinka.Dakle, to je naredba kojom dobijemo jedan redak teksta gdje elimo i najee se koristiu ovakvim situacijama kada trebamo opisati to treba unijeti u odreeno polje. Polja zaunos teksta pokraj redaka Server, Korisnicko ime i Lozinka su nastala pozivom naredbewx.TextCtrl. Dakle, to je naredba kojom pravimo polje u koje je mogu unos teksta s ko-jim emo mi kasnije neto raditi. wx.TextCtrl ima puno dodatnih opcija. Jednu od njihsam ovdje iskoristila prilikom upisivanja teksta u polje Lozinka. Ako unutar zagrada nakon

    17

  • wx.TextCtrl upiemo style=wx.TE_PASSWORD prilikom upisivanja teksta u to polje neese prikazivati slova i brojevi nego kruii koji uvaju tajnost vae lozinke. Klikom na gumb`Spoji' zapravo pozivamo posebno deniranu funkciju koja spaja korisnika na server. Ovaoperacija je omogueno zbog naredbe Bind koja povezuje odreen gumb sa nekom radnjom.Na slici 3 je prikazan prozor koji se otvori ako spajanje uspije. To je zapravo jedan izbornikkoji nam omoguava snalaenje u naem potanskom sanduiu. Klikom na gumb `Novaporuka' otvorit e se novi prozor koji omoguava slanje poruke, gumb `Pristigle poruke' namotvara popis svih primljenih poruka koje imamo u sanduiu, gumb `Poslane poruke' otvarapopis svih poruka koje je korisnik poslao i klikom na gumb `Odjava' prekidaju se sve vezesa serverom i gasi se program. U stvaranju ovog prozora su koritene naredbe wx.Frame,wx.Panel, wx.Button te wx.Boxsizer. Kao i u prethodnom sluaju postoji jedan panel kojizauzima cijeli prozor, na njega je postavljena jedna vertikalna kutija i na nju su poslaganeetiri horizontalne kutije u koje su postavljeni gumbovi. Gumbovi su funkcijom Bind vezaniza nove funkcije koje obavljaju daljnje radnje.Slika 4 prikazuje prozor koji dobijemo klikom na gumb `Nova poruka' u izborniku sa slike3. SMTP protokol zahtjeva podatak o poiljatelju poruke, pa zbog toga ovdje postoji poljepod nazivom `Od:'. Sljedea polja su uobiajena polja koja se trae prilikom slanja e-mailporuke putem bilo kojeg servisa. To su polja `Za', `Naslov' i `Poruka'. Na kraju stoji gumb`Salji'. I ovdje su kao i ranije koritene naredbe wx.Frame, wx.StaticText, wx.Textctrl,wx.BoxSizer, wx.Button i wx.Panel. Na panel je postavljena jedna vertikalna kutija u ko-joj su jedna ispod druge poslagane horizontalne kutije na kojima se nalaze polja napravljenanaredbama wx.StaticText i wx.TextCtrl, te gumb 'Salji'. I ovdje je koritena jedna jakokorisna opcija funkcije wx.Textctrl. Naime, ako u zagrade iza naredbe wx.TextCtrl upiemostyle=wx.TE_MULTILINE dobit emo polje u koje je mogue upisati tekst od vie redakai na desnoj strani se pojavljuje traka za pomicanje, tj. scrollbar koja nam omoguuje pom-icanje napisanog teksta gore - dolje ako upisani tekst prelazi granice prozora. Na taj nainmoemo upisivati dugaak tekst koji e i dalje biti pregledan. Klikom na gumb `Salji' porukase alje na upisanu adresu i javlja se obavijest da je poruka poslana.Na slikama 5 i 6 su prikazani popisi primljenih i poslanih poruka. Ta dva prozora su napravl-jena na isti nain pa u opisati samo jedan. Glavni prozor je podijeljen na dva dijela. Ugornjem dijelu se nalazi lista primljenih (poslanih) poruka. Lista je podijeljena u 6 (odnosno5) stupaca. U tim stupcima se nalaze podaci o porukama, a to su: redni broj poruke, tko jeposlao poruku, tko je primatelj poruke, naslov primljene (odnosno poslane) poruke, datumkada je poruka primljena (poslana), te veliina primljene poruke u byteima (ovog podatkanema u poslanim porukama). Klikom na jedan od podataka u listi u donjem dijelu prozora seprikae tekst odabrane poruke i na desnoj strani tog dijela se pojavljuje scrollbar, tj. traka zapomicanje ako poruka prijee granice tog dijela prozora. Prilikom stvaranja ovog prozora ko-ritene su naredbe wx.Frame, wx.SplitterWindow, wx.Panel, wx.TextCtrl, wx.ListCtrl,wx.BoxSizer.U stvaranju ovih prozora je koritena jedna nova naredba wx.SplitterWindow koja omoguujekorisniku da podijeli prozor na dva dijela. Moemo odabrati elimo li podijeliti prozor nadva vertikalna ili dva horizontalna dijela. U ovom sluaju su bila potrebna dva horizon-talna prozora, pa je pozvana naredba SplitHorizontally. Nakon podjele prozora u svaki odnovonastalih prozora je postavljen po jedan panel na koji su poslagani ostali objekti. Na

    18

  • gornjem dijelu se pojavljuje nova naredba, a to je wx.ListCtrl. Tom naredbom stvaramolistu koju moemo po elji ureivati. Ovdje smo tu listu rastavili na est stupaca i svakomstupcu smo dali odreeno ime. Podatke u listu upisujemo red po red koristei naredbe In-sertStringItem i SetStringItem. Prvom naredbom unosimo podatak u prvi stupac u retku.Prosljeujemo joj broj retka i podatak koji se upisuje na to mjesto, a nakon toga pozivamofunkciju SetStringItem koja u sljedee stupce u tom retku upisuje elemente koje joj prosli-jedimo. Kada kliknemo na jedan element (redak) liste poziva se posebno denirana funkcijakoja utjee na donji dio prozora, tj. u donjem dijelu prikazuje tekst odabrane poruke. Nadonjem dijelu prozora nalazi se objekt deniran funkcijom wx.TextCtrl koji je smjeten napanel. I ovdje je koritena jedna opcija koju ima naredba wx.TextCtrl. Kako se ovdje radio itanju poruka ne bi bilo zgodno da se sadraj otvorene poruke moe mijenjati po volji,pa je odabrana opcija da se poruka moe samo itati, tj. da je read-only i to se postigloupisivanjem style=wx.TE_READONLY u zagrade iza naredbe wx.TextCtrl. Kao i kod pro-zora za slanje nove poruke i ovdje je koritena opcija wx.TE_MULTILINE, te se s desnestrane pojavljuje traka za pomicanje gore - dolje ako poruka prelazi granice prozora. Postojijo jedna korisna naredba kod SplitterWindow funkcije koju sam ovdje iskoristila. Naime,kako korisnik po volji moe poveavati i smanjivati oba prozora ne bi izgledalo lijepo kadabi se bilo koji od prozora mogao smanjiti do kraja tako da se u njemu nita ne vidi. Upravozbog toga postoji naredba SetMinimumPaneSize kojom moemo odrediti najmanju veliinudo koje se neki prozor moe smanjiti. U zagradu iza ove naredbe se upisuje broj pikselakojim se odreuje ta veliina. U ovom prozoru sam odredila da je to 100 piksela. To se moevidjeti na sljedeoj slici.

    Slika 7. Najmanja dozvoljena veliina gornjeg prozora

    19

  • Prilikom implementacije mail klijenta sam koristila sva tri prije navedena protokolaukljuivanjem biblioteka smtplib, poplib i imaplib. U nastavku teksta u pojasniti to radeneke bitne funkcije u programu i priloiti slike najbitnijih dijelova mog kda.Kao to sam ve prije napomenula kod opisivanja slike 2 klikom na gumb Spoji se pozivaposebno denirana funkcija koja zapravo obavlja posao spajanja na server. Tu funkcijusam nazvala NaSpoji. Funkcija NaSpoji prilikom poziva prvo uzima vrijednosti iz polja podnazivom Server, Korisnicko ime i Lozinka naredbom GetValue koje e joj biti potrebne pri-likom spajanja. Nakon toga stvara tri objekta: po = poplib.POP3_SSL(server),p = smtplib.SMTP(server), m = imaplib.IMAP4(server) klasa smtplib, poplib i imaplibna kojima se obavljaju sve operacije prilikom slanja i primanja poruka. Server je argumentkoji funkcija uzima iz polja nazvanog Server. Tada funkcija prosljeuje objektima po, p i mkorisniko ime i lozinku i ta tri objekta se spajaju na server funkcijama koje su denirane uklasama smtplib, poplib i imaplib. To se vidi na sljedeoj slici.

    Slika 8. Kd funkcije NaSpoji

    Sa slike je vidljivo i da u pythonu moemo hvatati iznimke, tj. funkcija se prvo pokua spojitina server, a ako ne uspije onda javlja greku `Login failed'.Sljedea bitna funkcija je funkcija NaOdjava koja se aktivira kada u izborniku (Slika 3)kliknemo gumb odjava. Nakon pozivanja ova funkcija na svakom od tri objekta po, p i mpoziva funkciju iz biblioteka smtplib, poplib i imaplib koje su zaduene za prekidanje vezasa serverom. Sljedea slika prikazuje odjavu sa servera.

    Slika 9. Kd funkcije NaOdjava

    20

  • Kada napiemo novu poruku u prozoru za slanje nove poruke (Slika 4) i kliknemo gumb Saljipozivamo funkciju koju sam nazvala NaSalji. Ova funkcija prvo uzima vrijednosti iz polja Od,Za, Naslov i Poruka funkcijom GetValue. Nakon toga od vrijednosti iz polja Od, Za i Naslovstvara zaglavlje iza kojeg je jedan prazan red. Tada na to zaglavlje nadoda tekst poruke itako stvara poruku koja e se slati. Naime, kako sam ve prije napomenula u dijelu 2.1, kadaaljemo poruku putem SMTP protokola potrebno je odvojiti zaglavlje i tekst praznim redomjer je to forma poruke kakvu SMTP prepoznaje. Na kraju funkcija na objektu po pozivafunkciju sendmail koja je denirana u biblioteci smtplib. Funkciji sendmail se prosljeujupoiljatelj, primatelj i sama poruka koju ona tada alje na odgovarajuu adresu. Ako jeporuka uspjeno poslana na traci za obavijesti, tj. statusbaru, e se ispisati da je porukauspjeno poslana. U suprotnom e se aktivirati jedna od iznimaka i u traci za obavijesti ese ispisati obavijest da poruka nije poslana. Sve to je vidljivo na sljedeoj slici.

    Slika 10. Kd funkcije NaSalji

    Sljedea bitna funkcija je funkcija OnSelect koja se aktivira klikom na neki elemet listeprimljenih ili poslanih poruka. Funkcija OnSelect se nalazi unutar klase kojom su napravljenipopisi primljenih i poslanih poruka. Prilikom kreiranja lista u kojima se vide podaci opoiljatelju, naslovu, veliini i vremenu slanja poruke sam koristila neke funkcije koje suugraene u module poplib i email. email je modul koji pomae u parsiranju `sirovih' e-mailporuka. Da bi se bolje vidjelo o emu se radi na sljedeoj slici je primjer jednog `sirovog'odgovora.

    Slika 11. `Sirova' e-mail poruka

    21

  • Ovakav odgovor se dobije pozivom funkcije top. Ova funkcija je denirana u modulu poplibi ona slui za dohvaanje poruke pod brojem koji je zadan argumentom koji se upisuje uzagradu iza funkcije top (objanjeno u 2.2.1). Funckija vraa tri vrijednosti: response, to jeneki kd i odgovarajui tekst koji ide uz taj kd (npr. 250 Ok); lines, to je zapravo odgovorkoji se vidi na slici 11 i octets, tj. broj okteta koje poruka zauzima. Kod ove funkcije je dobroto to ne oznaava odabranu poruku kao proitanu kada ju pozovemo, pa se upravo zbogtoga koristi prilikom dohvaanja zaglavlja poruke. Naravno da nije nimalo pregledno akokorisniku ispiemo ovako dobiveni odgovor. Upravo zbog toga je modul email vrlo koristan.Pozivom naredbe email.message_from_string('\n'.join(lines)) cijeli odgovor spojimo u jedanveliki string koji kasnije moemo na neki nain pretraivati i izdvajati dijelove koji su nampotrebni. Tako je sa sljedee slike vidljivo da sada jednostavno napiemo npr. poruka['From']i program izdvoji poiljatelja oznaene poruke.

    Slika 12. Dohvaanje podataka iz zaglavlja poruke

    Na slian nain dohvaamo i tekst poruke kada kliknemo na nju. To je denirano u funkcijiOn Select. Ova funkcija prvo dohvati redni broj poruke koju smo oznaili. Taj brojprosljeuje funkciji retr koja je denirana u modulu poplib i tom funkcijom dohvaamooznaenu poruku. Funkcija retr je zapravo ista funkcija kao i top i vraa iste vrijednosti, alipozivom funkcije retr se oznaena poruka oznaava kao proitana. Nakon toga na isti nainpozivom funkcije email.message_from_string('\n'.join(lines)) parsiramo nau poruku, ali uovom dijelu nam nisu bitni podaci iz zaglavlja nego sam tekst poruke. Zbog toga koristimofunkciju walk. Ta funkcija nam omoguuje da `proeemo' kroz poruku i uzmemo dijelovekoji su nam bitni. Funkcijom get_content_type() odreujemo koju vrstu podataka elimodohvatiti (u ovom sluaju je to obini tekst) i tada funkcijom get_payload() dohvaamoodabranu vrstu podataka iz dijela u kojem se trenutno nalazimo. Sve to moete vidjeti nasljedeoj slici.

    Slika 13. Kd funkcije OnSelect

    22

  • Kod liste poslanih poruka se kd ipak malo razlikuje jer je u tom sluaju koriten IMAPprotokol i modul imaplib, te se naredbe razlikuju od naredbi u modulu poplib. U imaplibmodulu postoji naredba fetch kojoj se mogu proslijediti tono oni dijelovi poruke koje e-limo dohvatiti i u tom sluaju nije potrebno parsirati poruku naredbama iz modula email,pa je posao dohvaanja zaglavlja i teksta poruke uvelike olakan. Naredba fetch vraadvije vrijednosti. Prva je odgovor koji se sastoji od ureenog para kda i odgovarajuegteksta, a druga je dio poruke koji smo traili. Ta vrijednost isto dolazi u `sirovom' ob-liku, pa je potrebno izdvojiti ba onaj dio koji nam je stvarno potreban. Ako napiemofetch(i,'(BODY.PEEK[HEADER.FIELDS (FROM)])') dobit emo odgovor u obliku koji sevidi na sljedeoj slici.

    Slika 14. `Sirovi' odgovor dobiven funkcijom fetch

    Dakle, odgovor se sastoji od rijenika u kojem je jedan element ureeni par u kojem se naprvom mjestu nalazi traena naredba, a na drugom mjestu traeni podaci, a drugi elementrijenika je zagrada. Kako korisnik ne bi morao traiti potreban podatak potrebno je izoliratii ispisati samo npr. poiljatelja poruke. Ako smo odgovor funkcije fetch oznaili sa `od' akonapiemo od[0][1] dobit emo nulti element rijenika i prvi element tog ureenog para, tj.dobit emo tekst `From: adresa poiljatelja'. Analogno se postupa i za sve ostale elementezaglavlja. Na sljedeoj slici je cijeli kd pomou kojeg dobijemo sve podatke iz zaglavlja kojinam trebaju.

    Slika 15. Dohvaanje podataka iz zaglavlja poruke funkcijom fetch

    23

  • I ovdje postoji funkcija slina funkciji OnSelect i nazvana je OnSelect1. U biti je toista funkcija, samo to za dohvaanje teksta poruke ne koristi funkcije modula poplib negomodula imaplib i zbog toga nema parsiranja poruke funkcijama iz modula email, pa jestvar opet malo olakana. Funkcija OnSelect1 prvo dohvati broj oznaene poruke i tadafunkcijom fetch(bro,'(BODY[TEXT])') dohvaa tekst poruke pod rednim brojem koji je danargumentom bro. Uoimo da postoji razlika u dohvaanju dijelova zaglavlja i teksta poruke.Kada smo dohvaali zaglavlje koristili smo naredbu BODY.PEEK, a prilikom dohvaanjateksta naredbu BODY. Suks PEEK zapravo oznaava da emo samo zaviriti u poruku iu tom sluaju se nee podii zastavica koja oznaava da je poruka proitana. Dakle, uneku ruku to je ekvivalent funkciji top iz poplib modula. Naredba BODY pogleda porukui postavi zastavicu tako da se vidi da je poruka proitana, pa bi to bio ekvivalent funkcijiretr iz poplib modula. Kada pozovemo naredbu fetch opet dobivamo `sirovi' odgovor ijustrukturu moete vidjeti na slici 16.

    Slika 16. `Sirovi' tekst poruke dobiven funkcijom fetch

    Sa slike je vidljivo da je odgovor ureeni par. Na prvom mjestu se nalazi odgovor, u ovomsluaju je to `Ok' jer je sve prolo u redu, a na drugom mjestu je rjenik. U rjeniku seopet nalaze dva elementa. Prvi je ureeni par, a drugi zagrada. U ureenom paru na prvommjestu stoji broj odabrane poruke i naredba koja je pozvana, a na drugom mjestu je samtekst poruke. Ako smo odgovor funkcije fetch(bro,'(BODY[TEXT])') oznaili sa poruka,tada emo naredbom poruka[1][0][1] dobiti prvi element ureenog para (rjenik), zatim nultielement rijenika (ureeni par naredbe i teksta poruke) i na kraju prvi element tog ureenogpara (sam tekst poruke). Sve to se vidi u kdu funkcije OnSelect1 sa slike 17.

    Slika 17. Kd funkcije OnSelect1

    24

  • 4 Zakljuak

    irenjem interneta i poveavanjem obujma podataka koji krue internetom razvila sepotreba za odreenim alatima koji e pouzdano prenositi eljene podatke s jednog mjestana drugo. U tu svhu su nastali protokoli.

    U ovom radu sam se bazirala na protokolima koji slue za siguran i uinkovit prijenose-mail poruka od servera do klijenta i obratno jer u dananje vrijeme e-mail komunikacijapostaje najbri i najuinkovitiji oblik komuniciranja i razmjene podataka. Cilj mi je biopribliiti vam sam nain rada tih protokola kao i sigurnost kojom se poruke prenose timprotokolima.

    Iz praktinog dijela ovoga rada se jasno vidi da se ovi protokoli jednostavno mogu im-plementirati, a zapravo su vrlo mono sredstvo za prijenos podataka. U budunosti e seinternet protokoli sve vie usavravati i prijenos podataka putem tih protokola e biti svepouzdaniji i uinkovitiji. Vjerujem da je samo pitanje vremena kada e komunikacija puteminterneta gotovo u potpunosti potisnuti sve ostale oblike komunikacije upravo zbog tog us-avravanja internet protokola.

    Zahvaljujem mentoru doc.dr.sc.Domagoju Matijeviu na svoj pomoi oko pisanja ovog

    zavrnog rada i pravljenja praktinog dijela u Pythonu.

    25

  • 5 Literatura

    [1] B. Rhodes, J.Goerzen, Foundations of Python Network Programming: The comprehen-sive guide to building network applications with Python, second edition, Apress, SAD,2010.

    [2] IMAP protokol. U Wikipediji. Dostupno na:http://en.wikipedia.org/wiki/Internet_Message_Access_Protocol (28.06.2011.)

    [3] POP protokol. U Wikipediji. Dostupno na:http://en.wikipedia.org/wiki/Post_Oce_Protocol (28.06.2011.)

    [4] RFC 821 - SMTP protokolhttp://tools.ietf.org/html/rfc821 (28.06.2011.)

    [5] RFC 1939 - POP3 protokolhttp://tools.ietf.org/html/rfc1939 (28.06.2011.)

    [6] RFC 2060 - IMAP4 protokolhttp://tools.ietf.org/html/rfc2060 (28.06.2011.)

    [7] SMTP protokol. U Wikipediji. Dostupno na:http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol (28.06.2011.)

    [8] URL izvori:http://www.hmailserver.com/documentation/latest/?page=information_imap(30.06.2011.)http://www.emailaddressmanager.com/tips/protocol.html (30.06.2011.)

    26

  • 6 Prilog - popis slika

    Slika 1. Primjer slanja poruke SMTP-om.............................................................................6Slika 2. Prozor za spajanje na server...................................................................................15Slika 3. Izbornik..................................................................................................................15Slika 4. Prozor za slanje nove poruke..................................................................................16Slika 5. Popis primljenih poruka..........................................................................................16Slika 6. Popis poslanih poruka.............................................................................................17Slika 7. Najmanja dozvoljena veliina gornjeg prozora.........................................................19Slika 8. Kd funkcije NaSpoji..............................................................................................20Slika 9. Kd funkcija NaOdjava...........................................................................................20Slika 10. Kd funkcije NaSalji..............................................................................................21Slika 11. `Sirova' e-mail poruka............................................................................................21Slika 12. Dohvaanje podataka iz zaglavlja poruke.............................................................22Slika 13. Kd funkcije OnSelect..........................................................................................22Slika 14. `Sirovi' odgovor dobiven funkcijom fetch...............................................................23Slika 15. Dohvaanje podataka iz zaglavlja poruke funkcijom fetch......................................23Slika 16. `Sirovi' tekst poruke dobiven funkcijom fetch.......................................................24Slika 17. Kd funkcije OnSelect1.........................................................................................24

    27