mre žno računarstvo

39
Mre Mre žno računarstvo žno računarstvo Chapter 19 Chapter 19 The JavaMail API The JavaMail API

Upload: yehuda

Post on 07-Jan-2016

30 views

Category:

Documents


3 download

DESCRIPTION

Mre žno računarstvo. Chapter 19 The JavaMail API. Uvodna priča. Kako poslati mail iz Java apleta ili aplikacije? JavaMail API je standardna Java ekstenzija koja obezbeđuje biblioteku klasa za email klijente. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Mre žno računarstvo

MreMrežno računarstvožno računarstvo

Chapter 19 Chapter 19

The JavaMail APIThe JavaMail API

Page 2: Mre žno računarstvo

Uvodna pričaUvodna priča

Kako poslati mail iz Java apleta ili Kako poslati mail iz Java apleta ili aplikacije?aplikacije?JavaMail API je standardna Java JavaMail API je standardna Java ekstenzija koja obezbeđuje biblioteku ekstenzija koja obezbeđuje biblioteku klasa za email klijente.klasa za email klijente.Programi koriste JavaMail API kako bi Programi koriste JavaMail API kako bi komunicirali sa SMTP, POP i IMAP komunicirali sa SMTP, POP i IMAP serverima i slali i primali email.serverima i slali i primali email.Ovaj API nas štiti od detalja niskog nivoa Ovaj API nas štiti od detalja niskog nivoa protokola protokola

Page 3: Mre žno računarstvo

UpotrebaUpotreba

pisanje standardnih email klijenatapisanje standardnih email klijenatamailing list menadžerimailing list menadžeriveće aplikacije koje šalju ili primaju manji emailveće aplikacije koje šalju ili primaju manji emailaplet može koristiti email da pošalje podatke bilo aplet može koristiti email da pošalje podatke bilo kom procesu ili osobi na Internetu koja ima email kom procesu ili osobi na Internetu koja ima email adresu, koristeći web serverov SMadresu, koristeći web serverov SMTTP server kao P server kao jednostavan proksi da zaobiđe uobičajena jednostavan proksi da zaobiđe uobičajena bezbednosna ograničenja koja se odnose na to bezbednosna ograničenja koja se odnose na to sa kim aplet može da komunicirasa kim aplet može da komuniciraObrnuto, aplet može komunicirati sa IMAP Obrnuto, aplet može komunicirati sa IMAP serverom na hostu apleta kako bi primio podatke serverom na hostu apleta kako bi primio podatke sa proizvoljno puno hostova širom sa proizvoljno puno hostova širom nneta.eta.

Page 4: Mre žno računarstvo

Šta je JavaMail API?Šta je JavaMail API?

JavaMail API je reprezentacija prilično visokog nivoa JavaMail API je reprezentacija prilično visokog nivoa osnovnih komponenata proizvoljnog email sistema.osnovnih komponenata proizvoljnog email sistema.Komponente su predstavljene apstraktnim klasama Komponente su predstavljene apstraktnim klasama paketa javax.mailpaketa javax.mailNpr. apstraktna klasa Npr. apstraktna klasa javax.mail.Messagejavax.mail.Message predstavlja predstavlja email poruku. Ona deklariše apstraktne metode za email poruku. Ona deklariše apstraktne metode za dohvatanje i postavljanje raznih informacija o poruci, kao dohvatanje i postavljanje raznih informacija o poruci, kao što su pošiljalac i primalac, datum slanja, subject poruke.što su pošiljalac i primalac, datum slanja, subject poruke.Apstraktna klasa Apstraktna klasa javax.mail.Folderjavax.mail.Folder predstavlja kontejner predstavlja kontejner poruka. Ona deklariše apstraktne metode za dohvatanje poruka. Ona deklariše apstraktne metode za dohvatanje poruke iz foldera, premeštanje poruka iz foldera u folder i poruke iz foldera, premeštanje poruka iz foldera u folder i brisanje poruka iz folderabrisanje poruka iz foldera

Page 5: Mre žno računarstvo

Sve ove klase su apstraktne jer ne prave nikakve Sve ove klase su apstraktne jer ne prave nikakve pretpostavke o tome kako se email čuva ili šalje između pretpostavke o tome kako se email čuva ili šalje između mašinamašinaKonkretne potklase ovih klasa specijalizuju apstraktne Konkretne potklase ovih klasa specijalizuju apstraktne klase za određene protokole i mail formate.klase za određene protokole i mail formate.Ako želimo da radimo sa standardnim Internet email-om, Ako želimo da radimo sa standardnim Internet email-om, možemo koristiti javax.mail.možemo koristiti javax.mail.MimeMessageMimeMessage umesto umesto javax.mail.Message, javax.mail.javax.mail.Message, javax.mail.InternetAddressInternetAddress umesto umesto javax.mail.Address i com.sun.mail.imap.javax.mail.Address i com.sun.mail.imap.IMAPStoreIMAPStore umesto javax.mail.Store.umesto javax.mail.Store.

Page 6: Mre žno računarstvo

Korišćeni protokol formati i pridružene Korišćeni protokol formati i pridružene klase su određene uglavnom jednom klase su određene uglavnom jednom linijom klinijom kôôda u našem programu koja da u našem programu koja imenuje protokol. Promena imena imenuje protokol. Promena imena protokola čini 90% posla da program protokola čini 90% posla da program umesto jednog protokola (npr. POP) koristi umesto jednog protokola (npr. POP) koristi drugi (npr. IMAP)drugi (npr. IMAP)

Page 7: Mre žno računarstvo

Servis provajderi implementiraju pojedinačne Servis provajderi implementiraju pojedinačne protokole. Servis provajder je grupa konkretnih protokole. Servis provajder je grupa konkretnih potklasa apstraktnih JavaMail API klasa koje potklasa apstraktnih JavaMail API klasa koje specijalizuju opšti API za određeni protokol i mail specijalizuju opšti API za određeni protokol i mail format.format.Pošto mail-ovi stižu sa mreže u vremenskim Pošto mail-ovi stižu sa mreže u vremenskim trenucima koje nije moguće predvideti, JavaMail trenucima koje nije moguće predvideti, JavaMail API se zasniva na mehanizmu događaja za API se zasniva na mehanizmu događaja za rukovanje dolazećom poštom. Ovo je potpuno rukovanje dolazećom poštom. Ovo je potpuno ista šema kao kod AWT. ista šema kao kod AWT. java.mail.eventjava.mail.event paket definiše razne vrste paket definiše razne vrste događaja, kao i pridružene listener interfejse i događaja, kao i pridružene listener interfejse i adapterske klase za ove događajeadapterske klase za ove događaje

Page 8: Mre žno računarstvo

mail.jarmail.jaremail poruke mogu sadržati višejezične tekstove kao i email poruke mogu sadržati višejezične tekstove kao i multimediju. JavaMail API koristi JavaBeans Activation multimediju. JavaMail API koristi JavaBeans Activation Framework (JAF) za opisivanje i prikaz ovih sadržaja.Framework (JAF) za opisivanje i prikaz ovih sadržaja.JavaMail API je standardna Java ekstenzija, nije deo JavaMail API je standardna Java ekstenzija, nije deo JDK ili JRE. Zato je nužno download-ovati ga odvojeno i JDK ili JRE. Zato je nužno download-ovati ga odvojeno i instalirati na sopstvenom sistemu. Dostupan je na instalirati na sopstvenom sistemu. Dostupan je na http://www.oracle.com/technetwork/java/index-138643.html To je .zip arhiva koja sadrži dokumentaciju, sample code To je .zip arhiva koja sadrži dokumentaciju, sample code i, najvažnije od svega, i, najvažnije od svega, mail.jarmail.jar fajl. Ovaj fajl sadrži .class fajl. Ovaj fajl sadrži .class fajlove koji implementiraju JavaMail API. Da bi se fajlove koji implementiraju JavaMail API. Da bi se kompajlirali i pokretali primeri iz ovog poglavlja, kompajlirali i pokretali primeri iz ovog poglavlja, neophodno je dodati ovaj fajl u class path, bilo neophodno je dodati ovaj fajl u class path, bilo dodavanjem njegove putanje u CLASSPATH dodavanjem njegove putanje u CLASSPATH environment promenljivu ili smeštanjem mail.jar u naš environment promenljivu ili smeštanjem mail.jar u naš jre/lib/ext direktorijumjre/lib/ext direktorijum

Page 9: Mre žno računarstvo

activation.jaractivation.jar

JavaBeans Activation Framework (JAF) je JavaBeans Activation Framework (JAF) je takođe standardna Java ekstenzija.takođe standardna Java ekstenzija.

Može se preuzeti sa:Može se preuzeti sa:

http://www.oracle.com/technetwork/java/javase/downloads/index-135046.html

Tu se nalazi Tu se nalazi activation.jaractivation.jar fajl koji takođe fajl koji takođe treba smestiti u class pathtreba smestiti u class path. .

VAVAŽNO: ŽNO: Sastavni je deoSastavni je deo Java SE 6 i 7, tako Java SE 6 i 7, tako da za njih nije potrebno posebno ga da za njih nije potrebno posebno ga dodavati!dodavati!

Page 10: Mre žno računarstvo

Slanje email-aSlanje email-a

Osnovna email potrebaOsnovna email potrebaemail klijenti i mailing list menadžeri su jedina vrsta email klijenti i mailing list menadžeri su jedina vrsta programa koji primaju email-oveprograma koji primaju email-oveali sve vrste programa ih šaljuali sve vrste programa ih šaljunpr. web browser-i mogu poslati HTML forme putem npr. web browser-i mogu poslati HTML forme putem email-a.email-a.Books & Writers izvršava popularni servis koji prati rang Books & Writers izvršava popularni servis koji prati rang prodaje knjiga autora na Amazon.com i obaveštava ih prodaje knjiga autora na Amazon.com i obaveštava ih periodično email-om.periodično email-om.U današnjem uvrnutom svetu, daleko najjednostavniji U današnjem uvrnutom svetu, daleko najjednostavniji način da obavestite korisnike o događaju kada oni ne način da obavestite korisnike o događaju kada oni ne sede za računarom na kome se izvršava program jeste sede za računarom na kome se izvršava program jeste poslati im email.poslati im email.

Page 11: Mre žno računarstvo

KoraciKoraci

JavaMail API obezbeđuje sve što je potrebno programu kako bi JavaMail API obezbeđuje sve što je potrebno programu kako bi poslao email. Da bi poslao poruku, program prati sledećih 8 poslao email. Da bi poslao poruku, program prati sledećih 8 jednostavnih koraka:jednostavnih koraka:

1.1. postavljanje postavljanje mail.host mail.host svojstva da pokazuje na lokalni mail serversvojstva da pokazuje na lokalni mail server2.2. pokretanje pokretanje mail sesijemail sesije metodom Session.getInstance() metodom Session.getInstance()3.3. kreiranje novog kreiranje novog MessageMessage objekta, verovatno instanciranjem jedne od objekta, verovatno instanciranjem jedne od

konkretnih potklasa klase Messagekonkretnih potklasa klase Message4.4. postavljanje postavljanje From:From: adrese poruke adrese poruke5.5. postavljanje postavljanje To:To: adrese poruke adrese poruke6.6. postavljanje postavljanje Subject:Subject: poruke poruke7.7. postavljanje postavljanje sadržajasadržaja poruke poruke8.8. slanje poruke metodom slanje poruke metodom Transport.send()Transport.send()

Poredak ovih koraka nije strogo fiksiran. Npr. koraci 4 do 7 mogu Poredak ovih koraka nije strogo fiksiran. Npr. koraci 4 do 7 mogu sese izvršiti bilo kojim redom. izvršiti bilo kojim redom. Pojedinačno, svaki od koraka je prilično jednostavan.Pojedinačno, svaki od koraka je prilično jednostavan.

Page 12: Mre žno računarstvo

koraci 1 i 2koraci 1 i 2

Prvi korak je postavljanje svojstava mail sesije. Prvi korak je postavljanje svojstava mail sesije. Jedino svojstvoJedino svojstvo koje koje treba postaviti da bi se mail poslao je treba postaviti da bi se mail poslao je mail.hostmail.host. Ono se konfiguriše . Ono se konfiguriše java.util.java.util.PropertiesProperties objektom. Sledeće parče k objektom. Sledeće parče kôôda postavlja da postavlja mail.host svojstvo na mail.host svojstvo na mail.cloud9.netmail.cloud9.net:: Properties props = new Properties();Properties props = new Properties();

props.put("mail.host", "mail.cloud9.net");props.put("mail.host", "mail.cloud9.net");Naravno, naši programi će postavljati ovo svojstvo na ime našeg Naravno, naši programi će postavljati ovo svojstvo na ime našeg mail servera.mail servera. (za gmail je potrebno postaviti jo(za gmail je potrebno postaviti još dva svojstvaš dva svojstva))Ova svojstva se koriste kako bi se dobio Ova svojstva se koriste kako bi se dobio SessionSession objekat metodom objekat metodom Session.getInstance():Session.getInstance():

Session mailConnection = Session.getInstance(props, null);Session mailConnection = Session.getInstance(props, null);Session objekat predstavlja komunikaciju između programa i jednog Session objekat predstavlja komunikaciju između programa i jednog mail servera. Drugi argument metoda getInstance(), ovde mail servera. Drugi argument metoda getInstance(), ovde nullnull, je , je javax.mail.javax.mail.Authenticator Authenticator koji traži šifru od korisnika ako je server koji traži šifru od korisnika ako je server zahteva. Više reči o tome biće kasnije.zahteva. Više reči o tome biće kasnije.

Page 13: Mre žno računarstvo

korak 3korak 3

Session objekat se koristi za konstruisanje Session objekat se koristi za konstruisanje novog Message objekta:novog Message objekta:

Message msg = new MimeMessage(mailConnection);Message msg = new MimeMessage(mailConnection);

Ovde je zadata klasa Ovde je zadata klasa MimeMessageMimeMessage pošto pošto znamo da ćemo slati Internet email. znamo da ćemo slati Internet email.

Međutim, ovo je mesto gde se zaista eksplicitno Međutim, ovo je mesto gde se zaista eksplicitno bira format email poruke. U nekim slučajevima, bira format email poruke. U nekim slučajevima, ovo ne mora biti neophodno, ako se može ovo ne mora biti neophodno, ako se može prekopirati format dolazeće porukeprekopirati format dolazeće poruke

Page 14: Mre žno računarstvo

koraci 4 i 5 – I koraci 4 i 5 – I

Sada kada imamo Message objekat, treba da Sada kada imamo Message objekat, treba da postavimo njegova polja i sadržaj. From: adresa postavimo njegova polja i sadržaj. From: adresa i To: adresa će biti i To: adresa će biti javax.mail.internet.javax.mail.internet.InternetAddressInternetAddress objekti. Može objekti. Može se zadati samo email adresa ili adresa zajedno se zadati samo email adresa ili adresa zajedno sa imenom:sa imenom:

Address bill = new InternetAddress("godAddress bill = new InternetAddress("god@@microsoft.com", "Bill Gates");microsoft.com", "Bill Gates");Address elliotte = new InternetAddress("elharoAddress elliotte = new InternetAddress("elharo@@metalab.unc.edu");metalab.unc.edu");

Page 15: Mre žno računarstvo

koraci 4 i 5 – II koraci 4 i 5 – II

Metod Metod setFrom()setFrom() nam omogućuje da kažemo ko šalje nam omogućuje da kažemo ko šalje poruku postavljanjem From:. poruku postavljanjem From:. Nema zaštite od Nema zaštite od zloupotrebezloupotrebe. Prilično je jednostavno da se pretvaramo da . Prilično je jednostavno da se pretvaramo da smo Bill Gates:smo Bill Gates:

msg.setFrom(bill);msg.setFrom(bill);Metod Metod setRecipient()setRecipient() je za nijansu komplikovaniji. Ne je za nijansu komplikovaniji. Ne zadajemo samo adresu na koju će poruka biti poslata, zadajemo samo adresu na koju će poruka biti poslata, već kako se adresa koristi, tj. kao To:, Cc: ili Bcc: polje. već kako se adresa koristi, tj. kao To:, Cc: ili Bcc: polje. Za ovo postoje 3 mnemoničke konstante klase Za ovo postoje 3 mnemoničke konstante klase Message.RecipientType:Message.RecipientType:

Message.RecipientType.TOMessage.RecipientType.TOMessage.RecipientType.CCMessage.RecipientType.CCMessage.RecipientType.BCCMessage.RecipientType.BCC

Npr. Npr. msg.setRecipient(Message.RecipientType.TO, elliotte);msg.setRecipient(Message.RecipientType.TO, elliotte);

Page 16: Mre žno računarstvo

koraci 6, 7 i 8koraci 6, 7 i 8

Subject se postavlja kao string. Npr.Subject se postavlja kao string. Npr.msg.setSubject("You must comply");msg.setSubject("You must comply");

Telo se takođe postavlja kao string. Međutim, Telo se takođe postavlja kao string. Međutim, pored tog teksta treba proslediti i MIME type pored tog teksta treba proslediti i MIME type teksta. Najuobičajeniji je text/plain. Npr.teksta. Najuobičajeniji je text/plain. Npr.

msg.setContent("Resistance is futile. You will be msg.setContent("Resistance is futile. You will be assimilated! ", "text/plain");assimilated! ", "text/plain");

Najzad, statički Najzad, statički Transport.send()Transport.send() metod metod konektuje se na mail server određen mail.host konektuje se na mail server određen mail.host svojstvom i šalje poruku njenim putem:svojstvom i šalje poruku njenim putem:

Transport.send(msg);Transport.send(msg);

Page 17: Mre žno računarstvo

Primer 1Primer 1

Objedinjava sve ovo u program koji šalje Objedinjava sve ovo u program koji šalje poruku. (Bitno je znati primaoca i poruku. (Bitno je znati primaoca i pošiljaoca, subject i telo poruke)pošiljaoca, subject i telo poruke)

Page 18: Mre žno računarstvo

Primer 2: Slanje email-a iz Primer 2: Slanje email-a iz AplikacijeAplikacije

Primer 1 je jednostavna aplikacija koja šalje fiksiranu Primer 1 je jednostavna aplikacija koja šalje fiksiranu poruku na poznatu adresu i sa zadatim subject-om.poruku na poznatu adresu i sa zadatim subject-om.Jednom kada smo videli kako se to radi, pravolinijski je Jednom kada smo videli kako se to radi, pravolinijski je zameniti stringove koji određuju poruku, adresu, subject i zameniti stringove koji određuju poruku, adresu, subject i telo podacima koji se čitaju iz komandne linije, GUI-ja, telo podacima koji se čitaju iz komandne linije, GUI-ja, baze podataka ili nekog drugog izvora.baze podataka ili nekog drugog izvora.Primer 2 je veoma jednostavan GUI za slanje email-a. Primer 2 je veoma jednostavan GUI za slanje email-a. Sav kSav kôôd za slanje mail-a je u metodu actionPerformed() i d za slanje mail-a je u metodu actionPerformed() i izgleda veoma slično main() metodu iz Primera 1. Velika izgleda veoma slično main() metodu iz Primera 1. Velika razlika je što se sada host, subject, From: adresa, To: razlika je što se sada host, subject, From: adresa, To: adresa i tekst poruke čitaju iz GUI komponenata u vreme adresa i tekst poruke čitaju iz GUI komponenata u vreme izvršavanja programa umesto da budu ukodirani kao izvršavanja programa umesto da budu ukodirani kao string konstante u source kstring konstante u source kôôd. Ostatak kd. Ostatak kôôda odnosi se da odnosi se na podešavanje GUI-ja i ima malo sa JavaMail API-jem.na podešavanje GUI-ja i ima malo sa JavaMail API-jem.

Page 19: Mre žno računarstvo

Primer 2: napomenePrimer 2: napomene

Ovo je daleko od idealnog. GUI bi morao Ovo je daleko od idealnog. GUI bi morao biti jasnije odvojen od kbiti jasnije odvojen od kôôda za mail. I bilo da za mail. I bilo bi bolje otvoriti dijalog o grešci ako nešto bi bolje otvoriti dijalog o grešci ako nešto pođe po zlu, nego samo štampati stack pođe po zlu, nego samo štampati stack trace izuzetka na System.err.trace izuzetka na System.err.

Međutim, pošto nas ništa od toga ne bi Međutim, pošto nas ništa od toga ne bi naučilo nečemu o JavaMail API, to je naučilo nečemu o JavaMail API, to je ostavljeno za vežbuostavljeno za vežbu

Page 20: Mre žno računarstvo

Primer 3: Slanje email-a iz ApletaPrimer 3: Slanje email-a iz Apleta

U terminima GUI-ja i JavaMail API-ja, nema razlike U terminima GUI-ja i JavaMail API-ja, nema razlike između slanja email-a iz apleta i iz aplikacije.između slanja email-a iz apleta i iz aplikacije.Međutim, security manager browser-a nam se može naći Međutim, security manager browser-a nam se može naći na putu. Kako i sve ostalo, tako i JavaMail API ne može na putu. Kako i sve ostalo, tako i JavaMail API ne može zaobići uobičajene restrikcije mrežnih konekcija za zaobići uobičajene restrikcije mrežnih konekcija za aplete. Aplet koji želi da pošalje mail i dalje može aplete. Aplet koji želi da pošalje mail i dalje može komunicirati samo sa hostom sa kog je sam aplet došao.komunicirati samo sa hostom sa kog je sam aplet došao.Na sreću, mnogi hostovi koji izvršavaju web servere Na sreću, mnogi hostovi koji izvršavaju web servere takođe izvršavaju i SMTP servere. Ako je to slučaj, takođe izvršavaju i SMTP servere. Ako je to slučaj, prilično je pravolinijski da aplet pošalje mail. JavaMail prilično je pravolinijski da aplet pošalje mail. JavaMail API i Java Activation Framework nisu uključeni u većinu API i Java Activation Framework nisu uključeni u većinu browser-a, ali pošto su implementirani u čistoj Javi u browser-a, ali pošto su implementirani u čistoj Javi u paketu javax, browser-i mogu download-ovati paketu javax, browser-i mogu download-ovati neophodne klase sa servera. Npr. ovaj APPLET element neophodne klase sa servera. Npr. ovaj APPLET element referiše ne samo kreferiše ne samo kôôd samog apleta, već takođe i mail.jar d samog apleta, već takođe i mail.jar i activation.jar fajlove za JavaMail API i Java Activation i activation.jar fajlove za JavaMail API i Java Activation Framework, redom:Framework, redom:

Page 21: Mre žno računarstvo

<APPLET CODE=<APPLET CODE=SMTPAppletSMTPApplet ARCHIVE="ARCHIVE="activation.jaractivation.jar,,mail.jarmail.jar""

WIDTH=600 HEIGHT=400>WIDTH=600 HEIGHT=400>

<PARAM NAME="<PARAM NAME="toto" VALUE= " VALUE= "[email protected]">"[email protected]">

<PARAM NAME="<PARAM NAME="subjectsubject" VALUE="Hay Orders">" VALUE="Hay Orders">

<PARAM NAME="<PARAM NAME="fromfrom" VALUE="none">" VALUE="none">

</APPLET></APPLET>

za za Java SE 6 i 7 radi i bez activation.jarJava SE 6 i 7 radi i bez activation.jar

Page 22: Mre žno računarstvo

Primer 3 je jednostavan aplet koji Primer 3 je jednostavan aplet koji šalje šalje email. Adresa na koju se email šalje i email. Adresa na koju se email šalje i subject se čitaju iz PARAM tagova. Adresa subject se čitaju iz PARAM tagova. Adresa sa koje se šalje email se takođe čita iz sa koje se šalje email se takođe čita iz PARAM taga, ali korisnik ima opciju da to PARAM taga, ali korisnik ima opciju da to promeni. Tekst koji se šalje korisnik promeni. Tekst koji se šalje korisnik ukucava u tekstualno polje. Konačno, ukucava u tekstualno polje. Konačno, server se određuje na osnovu codebase server se određuje na osnovu codebase apletaapleta

Page 23: Mre žno računarstvo

Primer 3: napomenePrimer 3: napomene

Ispravno ponašanje ovog apleta zavisi od nekoliko Ispravno ponašanje ovog apleta zavisi od nekoliko spoljašnjih faktora:spoljašnjih faktora:– browser mora podržavati bar Java1.1 sa security modelom ne browser mora podržavati bar Java1.1 sa security modelom ne

restriktivnijim od podrazumevanogrestriktivnijim od podrazumevanog– mail.jar i activation.jar fajlovi moraju biti dostupni u codebase mail.jar i activation.jar fajlovi moraju biti dostupni u codebase

apletaapleta– web server koji opslužuje aplet mora takođe biti i SMTP server web server koji opslužuje aplet mora takođe biti i SMTP server

koji želi da prosledi mail od klijentskog sistema do sistema koji želi da prosledi mail od klijentskog sistema do sistema primaoca. Ovo može biti problem (i dovesti do izuzetka: primaoca. Ovo može biti problem (i dovesti do izuzetka: javax.mail.SendFailedException: 550 javax.mail.SendFailedException: 550 <<[email protected]”>@sideview.mtsterling.ky.us”> ... Relaying denied) ... Relaying denied)

Međutim, trebalo bi da budemo u mogućnosti da Međutim, trebalo bi da budemo u mogućnosti da pošaljemo email bar na adrese koje se nalaze u domenu pošaljemo email bar na adrese koje se nalaze u domenu web servera. Možemo da podesimo neku od tih adresa web servera. Možemo da podesimo neku od tih adresa da automatski forward-uje poruke njihovom eventualnom da automatski forward-uje poruke njihovom eventualnom primaocuprimaocu

Page 24: Mre žno računarstvo

Primanje mail-aPrimanje mail-a

Kompleksnije je od slanjaKompleksnije je od slanja

SMTP koristi samo 14 različitih komandi, a SMTP koristi samo 14 različitih komandi, a jednostavan email klijent se može jednostavan email klijent se može implementirati korišćenjem samo 5 od njihimplementirati korišćenjem samo 5 od njih

POP3, međutim, ima 12 komandi, ali POP3, međutim, ima 12 komandi, ali klijent treba da koristi skoro sveklijent treba da koristi skoro sve

IMAP ima 24 različite komandeIMAP ima 24 različite komande

Page 25: Mre žno računarstvo

JavaMail API je dizajniran sa pretpostavkom da JavaMail API je dizajniran sa pretpostavkom da server može vratiti zaglavlja odvojeno od poruka server može vratiti zaglavlja odvojeno od poruka kojima pripadaju, pretraživati mailbox-ove, kojima pripadaju, pretraživati mailbox-ove, obezbeđivati smeštaj za poruke umesto da to obezbeđivati smeštaj za poruke umesto da to radi klijent itd.radi klijent itd.JavaMail API nam obezbeđuje manje nego što JavaMail API nam obezbeđuje manje nego što nam treba za klijentski orijentisane protokole nam treba za klijentski orijentisane protokole pristupa mail-ovima, kao što je POP3, koji pristupa mail-ovima, kao što je POP3, koji pretpostavlja da klijent čuva i održava arhivu pretpostavlja da klijent čuva i održava arhivu mail-ova, ali nam i dalje pruža alat za download-mail-ova, ali nam i dalje pruža alat za download-ovanje mail-a sa servera. Samo treba da ovanje mail-a sa servera. Samo treba da implementiramo sopstveni sistem smeštaja na implementiramo sopstveni sistem smeštaja na klijentuklijentu

Page 26: Mre žno računarstvo

Mi ćemo videti jednostavniji POP protokol Mi ćemo videti jednostavniji POP protokol (u nastavku ima i IMAP)(u nastavku ima i IMAP)

Iz perspektive JavaMail-a, IMAP se može Iz perspektive JavaMail-a, IMAP se može videti kao POP plus neke komande za videti kao POP plus neke komande za manipulaciju folderima. Za jednostavne manipulaciju folderima. Za jednostavne programe koji operišu samo INBOX programe koji operišu samo INBOX folderom, POP i IMAP klijenti su manje-folderom, POP i IMAP klijenti su manje-više istiviše isti

Page 27: Mre žno računarstvo

koracikoraciIma oko 12 koraka za čitanje udaljenog mailbox-a (broj koraka može Ima oko 12 koraka za čitanje udaljenog mailbox-a (broj koraka može neznatno varirati, pošto su neki koraci opcioni ili se mogu kombinovati sa neznatno varirati, pošto su neki koraci opcioni ili se mogu kombinovati sa ili zameniti drugima):ili zameniti drugima):

1.1. postavljanje svojstava koja ćemo koristiti za konekcijupostavljanje svojstava koja ćemo koristiti za konekciju2.2. konstruisanje konstruisanje AuthenticatorAuthenticator-a koji ćemo koristiti za konekciju-a koji ćemo koristiti za konekciju3.3. Dohvatanje Dohvatanje SessionSession objekta metodom Session.getDefaultInstance() objekta metodom Session.getDefaultInstance()4.4. Korišćenje metoda Korišćenje metoda getStore()getStore() sesije za dohvatanje Store sesije za dohvatanje Store5.5. Konektovanje na storeKonektovanje na store6.6. dohvatanje INBOX folderadohvatanje INBOX foldera iz store metodom getFolder() iz store metodom getFolder()7.7. otvaranje INBOX folderaotvaranje INBOX foldera8.8. otvaranje foldera unutar INBOX folderaotvaranje foldera unutar INBOX foldera i ponavljanje ovoga i ponavljanje ovoga neophodan neophodan

broj putabroj puta da bi se stiglo do foldera koji se traži da bi se stiglo do foldera koji se traži9.9. dohvatanje poruka iz folderadohvatanje poruka iz foldera kao niza Message objekata kao niza Message objekata10.10. iteriranje kroz niz poruka, procesiranje svake od njihiteriranje kroz niz poruka, procesiranje svake od njih korišćenjem metoda korišćenjem metoda

klase Message. Npr. možemo štampati svaku poruku ili prosto prikazati klase Message. Npr. možemo štampati svaku poruku ili prosto prikazati pošiljaoca, subject i druge značajne informacije u GUI-jupošiljaoca, subject i druge značajne informacije u GUI-ju

11.11. zatvaranje folderazatvaranje foldera12.12. zatvaranje storezatvaranje store

Page 28: Mre žno računarstvo

korak 1 – svojstva sesijekorak 1 – svojstva sesije

Svaki od ovih koraka ponaosob je prilično Svaki od ovih koraka ponaosob je prilično jednostavan.jednostavan.Prvi je postavljanje svojstava za mail sesiju. Prvi je postavljanje svojstava za mail sesiju. Svojstva koja bismo želeli da postavimo Svojstva koja bismo želeli da postavimo uključuju uključuju mail.hostmail.host, , mail.store.protocolmail.store.protocol, , mail.usermail.user, , mail.pop3.usermail.pop3.user i i mail.pop3.hostmail.pop3.host..Međutim, ne moramo da postavimo Međutim, ne moramo da postavimo baš nijedno baš nijedno od ovihod ovih. Ako će Session biti korišćen samo za . Ako će Session biti korišćen samo za dohvatanje mail-a, prazan Properties objekat je dohvatanje mail-a, prazan Properties objekat je dovoljan. Npr.dovoljan. Npr.

Properties props = new Properties();Properties props = new Properties();

Page 29: Mre žno računarstvo

koraci 2 i 3koraci 2 i 3

Dalje, želimo da kreiramo instancu Dalje, želimo da kreiramo instancu javax.mail.Authenticatorjavax.mail.Authenticator klase (pravilnije, klase (pravilnije, instancu njene konkretne potklase) koja može instancu njene konkretne potklase) koja može tražiti šifru od korisnika. Za sada, prosto ćemo tražiti šifru od korisnika. Za sada, prosto ćemo ukodirati te vrednosti i proslediti ukodirati te vrednosti i proslediti nullnull umesto umesto stvarnog Authenticator-a. Popravićemo ovo stvarnog Authenticator-a. Popravićemo ovo kasnije:kasnije:

Authenticator a = null;Authenticator a = null;Dalje, koristimo ove Properties i Authenticator Dalje, koristimo ove Properties i Authenticator objekte da dobijemo Session instancu:objekte da dobijemo Session instancu:

Session session = Session.getDefaultInstance(props, a);Session session = Session.getDefaultInstance(props, a);

Page 30: Mre žno računarstvo

koraci 4 i 5koraci 4 i 5

Tražimo od sesije store za provajdera. Ovde, želimo Tražimo od sesije store za provajdera. Ovde, želimo provajder za POP3:provajder za POP3:

Store store = session.getStore("POP3");Store store = session.getStore("POP3");Konačno, spremni smo da se zaista konektujemo Konačno, spremni smo da se zaista konektujemo na store koristeći metod na store koristeći metod connect()connect(). Treba proslediti . Treba proslediti host na koji se konektujemo i korisničko ime i šifru host na koji se konektujemo i korisničko ime i šifru koji će se koristiti:koji će se koristiti:

store.connect("mail.cloud9.net", "elharo", "my_password");store.connect("mail.cloud9.net", "elharo", "my_password");

Možemo proslediti Možemo proslediti nullnull za šifru da ukažemo da se za šifru da ukažemo da se prethodno zadati prethodno zadati AuthenticatorAuthenticator treba pobrinuti za treba pobrinuti za šifrušifru

Page 31: Mre žno računarstvo

korak 6korak 6

Sada kada je store konektovan, spremni Sada kada je store konektovan, spremni smo da otvorimo folder u store. Ovaj korak smo da otvorimo folder u store. Ovaj korak je više orijentisan na IMAP nego na POP, je više orijentisan na IMAP nego na POP, pošto POP serveri ne vode računa o pošto POP serveri ne vode računa o različitim folderima. Za svrhe JavaMail različitim folderima. Za svrhe JavaMail API-ja, POP3 provajderi koriste folder sa API-ja, POP3 provajderi koriste folder sa imenom INBOX:imenom INBOX:

Folder inbox = store.getFolder("INBOX");Folder inbox = store.getFolder("INBOX");

Page 32: Mre žno računarstvo

korak 7korak 7

Folder je zatvoren kada ga dohvatimo. Možemo Folder je zatvoren kada ga dohvatimo. Možemo vršiti neke operacije na zatvorenom folderu, vršiti neke operacije na zatvorenom folderu, uključujući njegovo brisanje ili preimenovanje, ali uključujući njegovo brisanje ili preimenovanje, ali ne možemo dohvatati poruke iz zatvorenog ne možemo dohvatati poruke iz zatvorenog foldera. Prvo ga moramo otvoriti.foldera. Prvo ga moramo otvoriti.Folder možemo otvoriti sa pristupom samo za Folder možemo otvoriti sa pristupom samo za čitanje, prosleđivanjem mnemoničke konstante čitanje, prosleđivanjem mnemoničke konstante Folder.READ_ONLYFolder.READ_ONLY metodu open(), ili metodu open(), ili konstante konstante Folder.READ_WRITEFolder.READ_WRITE za pristup za za pristup za čitanje i pisanje:čitanje i pisanje:

inbox.open(Folder.READ_ONLY);inbox.open(Folder.READ_ONLY);

Page 33: Mre žno računarstvo

korak 9korak 9

Sada smo spremni da download-ujemo poruke Sada smo spremni da download-ujemo poruke metodom metodom getMessages()getMessages(), koji vraća niz koji , koji vraća niz koji sadrži sve poruke u folderu:sadrži sve poruke u folderu:Message Message [] messages = inbox.getMessages();[] messages = inbox.getMessages();Klasa Message obezbeđuje mnogo metoda za Klasa Message obezbeđuje mnogo metoda za rad sa pojedinačnim porukama. Ona poseduje rad sa pojedinačnim porukama. Ona poseduje metode za dohvatanje raznih polja iz zaglavlja metode za dohvatanje raznih polja iz zaglavlja poruke, dohvatanje sadržaja poruke, poruke, dohvatanje sadržaja poruke, odgovaranje na poruku i drugo.odgovaranje na poruku i drugo.Sada, uradićemo najprostiju stvar koja se može Sada, uradićemo najprostiju stvar koja se može zamisliti – odštampati svaku poruku na zamisliti – odštampati svaku poruku na System.out koristeći metod System.out koristeći metod writeTo()writeTo() poruke: poruke:

Page 34: Mre žno računarstvo

koraci 10, 11 i 12koraci 10, 11 i 12

for(int i = 0; i < messages.length; i++)for(int i = 0; i < messages.length; i++){{ System.out.println("----------- Message " + (i+1) + "--------------");System.out.println("----------- Message " + (i+1) + "--------------"); messages[i].writeTo(System.out);messages[i].writeTo(System.out);

}}

Nakon Nakon što smo završili sa porukama, zatvaramo folder i što smo završili sa porukama, zatvaramo folder i zatim zatvaramo store metodima zatim zatvaramo store metodima close():close():

inbox.close(false);inbox.close(false);

store.close();store.close();

Argument false metoda close() foldera ukazuje da ne želimo Argument false metoda close() foldera ukazuje da ne želimo da server zaista izbriše bilo koju obrisanu poruku iz foldera. da server zaista izbriše bilo koju obrisanu poruku iz foldera. Prosto želimo da raskinemo našu konekciju sa ovim Prosto želimo da raskinemo našu konekciju sa ovim folderom.folderom.

Page 35: Mre žno računarstvo

Primer 4: POP3ClientPrimer 4: POP3Client

Primer objedinjuje sve ovo u jednostavan Primer objedinjuje sve ovo u jednostavan program koji download-uje i štampa sadržaj program koji download-uje i štampa sadržaj određenog POP mailbox-a. Poruke se prosto određenog POP mailbox-a. Poruke se prosto štampaju na System.out u podrazumevanom štampaju na System.out u podrazumevanom načinu kodiranja. Serveri, korisnička imena i načinu kodiranja. Serveri, korisnička imena i ostalo je sve ukodirano. Međutim, primer brzo ostalo je sve ukodirano. Međutim, primer brzo demonstrira većinu ključnih tačaka primanja demonstrira većinu ključnih tačaka primanja mailova korišćenjem JavaMail API-ja. Napredniji mailova korišćenjem JavaMail API-ja. Napredniji program bi uključio odgovarajući GUI.program bi uključio odgovarajući GUI.Jedina izmena koja je potrebna da bi program Jedina izmena koja je potrebna da bi program radio za IMAP bila bi postavljanje provider radio za IMAP bila bi postavljanje provider promenljive na imap umesto na pop3.promenljive na imap umesto na pop3.

Page 36: Mre žno računarstvo

Password AuthenticationPassword Authentication

Ugrađivanje šifara u source code (kao u Ugrađivanje šifara u source code (kao u Primeru 4) je jako loša ideja. Ako se Primeru 4) je jako loša ideja. Ako se zahteva šifra, treba je zahtevati od zahteva šifra, treba je zahtevati od korisnika u vreme izvršavanja programa. korisnika u vreme izvršavanja programa. Dalje, kada korisnik kuca šifru, ona ne Dalje, kada korisnik kuca šifru, ona ne treba da bude prikazana na ekranu. treba da bude prikazana na ekranu. Idealno, ona ne treba ni da se šalje kao Idealno, ona ne treba ni da se šalje kao čist tekst preko mreže, iako trenutno čist tekst preko mreže, iako trenutno mnogo klijenata i servera to radi.mnogo klijenata i servera to radi.

Page 37: Mre žno računarstvo

Kada se otvara konekcija ka message store, JavaMail Kada se otvara konekcija ka message store, JavaMail API nam dopušta da obezbedimoAPI nam dopušta da obezbedimo javax.mail.Authenticatorjavax.mail.Authenticator objekat koji može da koristi za objekat koji može da koristi za dobijanje korisničkog imena i šifre. Authenticator je dobijanje korisničkog imena i šifre. Authenticator je apstraktna klasaapstraktna klasaKada provajder treba da zna korisničko ime i šifru, Kada provajder treba da zna korisničko ime i šifru, poziva metod poziva metod getPasswordAuthentication()getPasswordAuthentication() korisnički korisnički definisane potklase klase Authenticator. Ovaj metod definisane potklase klase Authenticator. Ovaj metod vraća vraća PasswordAuthenticationPasswordAuthentication objekat koji sadrži ove objekat koji sadrži ove informacije:informacije:

protected PasswordAuthentication getPasswordAuthentication()protected PasswordAuthentication getPasswordAuthentication()

Page 38: Mre žno računarstvo

Primer 5. GUI authenticatorPrimer 5. GUI authenticator

Da bi se u naše programe dodala password Da bi se u naše programe dodala password autentifikacija u vreme izvršavanja programa, autentifikacija u vreme izvršavanja programa, izvede se potklasa klase izvede se potklasa klase AuthenticatorAuthenticator i i predefiniše predefiniše getPasswordAuthentication() getPasswordAuthentication() metodom koji ume da bezbedno traži šifru od metodom koji ume da bezbedno traži šifru od korisnika. Jedan koristan alat za ovaj proces korisnika. Jedan koristan alat za ovaj proces jeste jeste JPasswordFieldJPasswordField Swing komponenta. Swing komponenta.Primer 5 demonstrira Swing-zasnovanu Primer 5 demonstrira Swing-zasnovanu AuthenticatorAuthenticator potklasu koja otvara dijalog koji potklasu koja otvara dijalog koji traži da korisnik unese svoje korisničko ime i traži da korisnik unese svoje korisničko ime i šifrušifru

Page 39: Mre žno računarstvo

Primer 6Primer 6

Većina ovog kVećina ovog kôôda samo rukuje GUI-jem.da samo rukuje GUI-jem.JPasswordFieldJPasswordField čuva šifru kao niz karaktera tako da kada završimo čuva šifru kao niz karaktera tako da kada završimo rad sa šifrom, možemo je prepisati nulama. Ovo znači da šifra rad sa šifrom, možemo je prepisati nulama. Ovo znači da šifra postoji u memoriji kraće i manje je verovatno da će sistem virtualne postoji u memoriji kraće i manje je verovatno da će sistem virtualne memorije swap-ovati program na disk i ostaviti šifru tamo kao čist memorije swap-ovati program na disk i ostaviti šifru tamo kao čist tekst. Međutim, tekst. Međutim, PasswordAuthenticationPasswordAuthentication čuva šifre kao stringove, čuva šifre kao stringove, koji su nepromenljivi i time mogu nenamerno biti sačuvani na diskukoji su nepromenljivi i time mogu nenamerno biti sačuvani na diskuModifikovanje POP klijenta kako bi podržao ovaj stil autentifikacije je Modifikovanje POP klijenta kako bi podržao ovaj stil autentifikacije je pravolinijsko. To demonstrira Primer 6. pravolinijsko. To demonstrira Primer 6. Menjamo ugrađeno Menjamo ugrađeno korisničko ime i šifru null-ovima i prosleđujemo MailAuthenticator korisničko ime i šifru null-ovima i prosleđujemo MailAuthenticator instancu kao drugi argument metoda connect().instancu kao drugi argument metoda connect().Jedina preostala izmena je da pozivamo System.exit() na kraju Jedina preostala izmena je da pozivamo System.exit() na kraju main() metoda, pošto se program više neće završiti kada se završi main() metoda, pošto se program više neće završiti kada se završi main() nakon što je pokrenuta AWT nit.main() nakon što je pokrenuta AWT nit.