Java Enterprise Edition spotkanie nr 1 (c.d.) JavaMail 1
Wprowadzenie JavaMail 1.4 (opiera się na JavaBean Activation Framework (JAF) 1.1) odbieranie, tworzenie i wysyłanie wiadomości elektronicznych w sposób niezależny od konkretnego protokołu programowanie aplikacji Mail User Agent (MUA), programowanie protokołów Mail Transfer Agent (MTA) wiele protokołów obsługiwanych w jeden sposób opcjonalny pakiet do Java SE, zawiera się w Java EE od kwietnia 2006 implementacja SUNowska jest dostępna na licencji CDDl jest też otwarta implementacja JavaMail 1.3 na licencji GNU 2
Machanizm funkcjonowania poczty elektronicznej Opracował Do: jacek@b.org Od: ania@a.org Drogi Jacku,... Do: jacek@b.org Od: ania@a.org Drogi Jacku,... MUA Ani POP3 MUA Jacka SMTP smtp.a.org DNS Internet mail exchange server dla b.org? SMTP mx.b.org pop3.b.org mx.b.org DNS ns.b.org 3
Protokoły Simple Mail Transfer Protocol (SMTP) nie radzi sobie dobrze z plikami binarnymi (dlatego powstało MIME) nie weryfikuje nadawcy serwer SMTP może wymagać uwierzytelnienia (rozszerzenie SMTP-AUTH) 4
S: 220 www.example.com ESMTP Postfix C: HELO mydomain.com S: 250 Hello mydomain.com C: MAIL FROM:<sender@mydomain.com> S: 250 Ok C: RCPT TO:<friend@example.com> S: 250 Ok C: DATA S: 354 End data with <CR><LF>.<CR><LF> C: Subject: test message C: From: sender@mydomain.com C: To: friend@example.com C: C: Hello, C: This is a test. C: Goodbye. C:. S: 250 Ok: queued as 12345 C: QUIT S: 221 Bye 5
Protokoły c.d. Post Office Protocol (POP) kolejkuje wiadomości dla osób, które nie mogą być bez przerwy w sieci i odbierać poczty przy pomocy SMTP zazwyczaj wiadomości są pobierane i kasowane z serwera oraz przetwarzane na komputerze klienta (resztę symulują programy pocztowe) każdy list musi być pobierany razem z załącznikami i jego części nie można w łatwy sposób pomijać nie ma możliwości przeszukiwania kolejki jest propozycja POP4 z m.in. podstawowymi folderami i flagowaniem wiadomości Internet Message Access Protocol (IMAP) Multipurpose Internet Mail Extension (MIME) i inne 6
S: <wait for connection on TCP port 110> C: <open connection> S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us> C: USER mrose S +OK User accepted C: PASS mrosepass S +OK Pass accepted C: STAT S: +OK 2 320 C: LIST S: +OK 2 messages (320 octets) S: 1 120 S: 2 200 S:. C: RETR 1 S: +OK 120 octets S: <the POP3 server sends message 1> S:. C: DELE 1 S: +OK message 1 deleted C: RETR 2 S: +OK 200 octets S: <the POP3 server sends message 2> S:. C: DELE 2 S: +OK message 2 deleted C: QUIT S: +OK dewey POP3 server signing off (maildrop empty) C: <close connection> S: <wait for next connection> Opracował 7
Najważniejsze klasy z javax.mail Session Message Address Authenticator Transport Store Folder używa się też klas z javax.mail.internet 8
Wysyłanie wiadomości 9
javax.mail.session zawiera dane konfiguracyjne, np. dostępne klasy transport provider ma prywatne konstruktory, tworzymy przy pomocy Fabryki Properties props = new Properties(); //wypełniamy informacje o serwerze, użytkowniku, haśle, itp. Session session = Session.getDefaultInstance(props, null); lub Properties props = new Properties(); //wypełniamy informacje o serwerze, użytkowniku, haśle, itp. Session session = Session.getInstance(props, null); drugi parametr to obiekt Authenticator zazwyczaj można współdzielić sesję (nawet pracując na wielu skrzynkach) wtedy użytkownika i hasło podaje się podczas komunikacji 10
javax.mail.message klasa abstrakcyjna należy korzystać z javax.mail.internet.mimemessage w nagłówkach najlepiej używać jedynie znaczki US-ASCII, w niektórych inne znaczki są odpowiednio kodowane (MIME) Message implementuje Part, a MimeMessage implementuje MimePart MimeMessage message = new MimeMessage(session); //message.setcontent("test 1, 2, 3", "text/plain"); message.settext("test 1, 2, 3");//skrót dla wiad. tekstowych message.setsubject("wiadomość testowa"); 11
MIME SMTP umożliwia jedynie przysyłanie 7-bitowych znaków ASCII Multipurpose Internet Mail Extension (MIME) to mechanizm umieszczania w poczcie innych znaków narodowych umieszczania w poczcie nietekstowych załączników łączenia w jedne przesyłce kilku rodzai zawartości (ang. Multipart Message) MIME dodaje nowe nagłówki do wiadomości, np. Content-type standardowe nagłówki: To:, Subject:, From: i Date: Można używać znaki narodowe w nagłówkach =?charset?encoding?encoded text?= Kodowanie i dekodowanie wykonują programy pocztowe Wiadomości MIME mogą być przesyłane przez stare serwer 12
Przykład wiadomości wieloczęściowej Opracował Content-type: multipart/mixed; boundary="frontier" MIME-version: 1.0 To jest wieloczesciowa wiadomosc w formacie MIME. (wiadomość dla starych klientów, przez nowych ignorowana) --frontier Content-type: text/plain To jest zawartosc wiadomosci --frontier Content-type: application/octet-stream Content-transfer-encoding: base64 PGh0bWw+CiAgPGh1YWQ+CiAgPC9oZWFkPgogIDxib2R5gogICAgPHA+VGhpcyBp cybpcyb0agugym9kesbvzib0agugbwvzc2fnzs48l3a+ciagpc9ib2r5pgo8l2h 0bWw+Cg== 13
javax.mail.address klasa abstrakcyjna należy korzystać z javax.mail.internet.internetaddress InternetAddress address; //ala = new InternetAddress("ala@mimuw.edu.pl"); ala = new InternetAddress("ala@mimuw.edu.pl", "Ala ma kota"); poprawność podawanych adresów nie jest sprawdzana podajemy zarówno adres od jak i do (większość serwerów obecnie nie pozwala wpisywać dowolnego adresu od) message.setfrom(ala); message.setreplyto(new InternetAddress[] {ala}); message.addrecipient(message.recipienttype.to, ola); message.addrecipient(message.recipienttype.cc, ala); 14
javax.mail.authenticator klasa abstrakcyjna należy ją rozszerzyć i zaimplementować metodę getpasswordauthenticator(), która ma zwracać obiekt PasswordAuthentication zawierający nazwę użytkownika i hasło... odczytywanie z pliku pytanie użytkownika Authenticator przekazuje się jako drugi parametr tworząc sesję 15
javax.mail.transport klasa abstrakcyjna można jednorazowo wysłać pojedynczą wiadomość Transport.send(message); można też wysłać kilka wiadomości utrzymując jedno połączenie Transport transport = session.gettransport("smtp"); transport.connect("students.mimuw.edu.pl", "xx123456", "xxx"); transport.sendmessage(message, message.getallrecipients()); transport.close(); ustawiając session.setdebug(true) można podejrzeć komunikację z serwerem 16
Pobieranie wiadomości 17
javax.mail.store/folder Store store = session.getstore("pop3"); store.connect("poczta.o2.pl", "login", "hasło"); Folder folder = store.getfolder("inbox");//dla imap mogą być inne folder.open(folder.read_only); Message[] messages = folder.getmessages(); //implementacja SUNowska ściąga wiadomości dopiero jak są dotykane for (Message m : messages) System.out.println(m.getContent()); folder.close(false); store.close(); 18
odpowiadanie Istnieje skrót pozwalający wygodnie odpowiadać na wiadomości //parametr wskazuje czy odpowiedzieć do wszystkich (true), czy tylko do wysyłającego (false) MimeMessage reply = (MimeMessage) message.reply(false); reply.setfrom(adres); reply.settext("żadna treść nie jest automatycznie tworzona"); Transport.send(reply); odpowiedź jest stosownie zaadresowana tytuł odpowiedzi jest poprzedzony przez Re: 19
przekazywanie //analogicznie załączniki //tworzymy widomość Message forward = new MimeMessage(session); //wypełniamy nagłówek forward.setsubject("fwd: " + message.getsubject()); forward.setfrom(new InternetAddress(from)); forward.addrecipient(message.recipienttype.to, new InternetAddress(adresDo)); //wiadomość będzie się składała z kilku części //tworzymy część z dodawaną treścią BodyPart messagebodypart = new MimeBodyPart(); messagebodypart.settext("oto oryginalna wiadomość:\n\n"); 20
przekazywanie //tworzymy zlepek części i wstawiamy dodawaną treść Multipart multipart = new MimeMultipart(); multipart.addbodypart(messagebodypart); //tworzymy część z oryginalną wiadomością messagebodypart = new MimeBodyPart(); messagebodypart.setdatahandler(message.getdatahandler()); //dodajemy oryginalną wiadomość do zlepka multipart.addbodypart(messagebodypart); //wstawiamy zlepek do wiadomości forward.setcontent(multipart); //wysyłamy Transport.send(forward); 21
Bezpieczeństwo TLS certyfikaty keytool 22