SERVEIS
5 Correu electrònic i pàgines web
CORREU JavaMail
“Necessito enviar missatges de correu electrònic
des d’una aplicació Java..”
L’API JavaMail és una extensió estàndard per llegir, compondre i
enviar missatges electrònics.
Utilitzem aquest paquet per crear components tipus Mail User
Agent (MUA) similars a Outlook. JavaMail està dissenyat per enviar
i rebre missatges de correu electrònic.
Per portar a terme l’enviament de missatges de correu electrònic es
serveix de varis protocols (per exemple, SMTP, POP o IMAP).
CORREU Protocols
Protocols d’emmagatzematge de missatges: Llegir missatges
des d’un servidor.
IMAP (Internet Message Access Protocol, Protocol d’accés als
missatges per Internet).
POP (Post Office Protocol, Protocol de l’oficina de Correus).
Protocols de transport de missatges: Envia missatges a un
servidor
SMTP (Simple Mail Transfer Protocol, Protocol senzill de
Transferència de correus).
Extensions de multipropòsit de correus de Internet (MIME):
Estàndard per descriure els missatges de correu electrònic.
CORREU Protocols
El protocol SMTP és el protocol utilitzat per enviar
correus electrònics.
Els protocols POP o IMAP són els protocols dels
que ens servim per descarregar els missatges de
correu electrònic que es troben en el nostre
servidor de correu.
CORREU JavaMail
JavaMail permet l’enviament i la recpeció de missatges de
correu electrònic i ens proveeix de classes essencials per
realitzar aquestes tasques.
CORREU JavaMail: Classes principals
CORREU Estructura del missatge
CORREU javax.mail
Les classes bàsiques que componen l’API són:
Session Message Address Authenticator
Transport Store Folder
Totes aquestes classes es troben dins del
paquet javax.mail de l’API JavaMail.
CORREU javax.mail: Session
La configuració per un compte de Gmail per l’enviament de
correus electrònics és la següent:
Requereix usuari i contrasenya. L’usuari és el compte
de correu – [email protected] -.
Protocol smtp.
TLS, si es troba disponible.
Port 587 – com sabeu, per defecte no és el port de
SMTP.
CORREU javax.mail
Per l’enviament d’un correu electrònic mitjançant un
compte de Gmail com a servidor de correu utilitzarem
les següents classes:
Session Message Address Authenticator
Transport Store Folder
Totes aquestes classes es troben dins del
paquet javax.mail de l’API JavaMail.
CORREU javax.mail: Session
La classe session representa la nostra connexió amb el
servidor de correu electrònic – en el nostre cas, Gmail -.
S’obté amb el mètode Session.getDefaultInstance()
passant-li un paràmetre:
Un Properties amb les propietats de la connexió.
Properties és una classe de Java estàndard
java.util.Properties. En aquesta classe guardarem
dades – de tipus String – donant-lis un nom a cadascun
per poder recuperar-los.
Això ho fem mitjançant el mètode setProperty().
CORREU javax.mail: Session
Properties és una classe de Java estàndard
java.util.Properties. En aquesta classe guardarem dades –
de tipus String – donant-lis un nom a cadascun per poder
recuperar-los.
Properties p = new Properties( ); p.setProperty(“un nom”, “un valor”); p.setProperty(“PI”, “3.1416”);
Les Properties que necessiten Session són específiques, és
a dir, han de tenir uns noms concrets i uns possibles valors
concrets.
CORREU javax.mail: Session
Quines són les classes estrictament necessàries per
connectar-nos amb Gmail i poder enviar missatges?
Properties p = new Properties ( ); // Nom del host de correu – smtp.gmail.com – props.setProperty(“mail.smtp.host”, “smtp.gmail.com”); // TLS si es troba disponible props.setProperty(“mail.smtp.starttls.enable”, “true”); // Port de gmail per l’enviament de correus Props.setProperty(“mail.smtp.port”, “587”); // Nom de l’usuari Props.setProperty(“mail.smtp.user”, [email protected]); // Si requereix o no usuari i contrasenya per connectar-se Props.setProperty(“mail.smtp.auth”, “true”);
CORREU javax.mail: MimeMessage
Ara construirem un missatge senzill de text. Per això
instanciarem la classe MimeMessage i li posem varies
dades.
En el constructor haurem de passar l’objecte Session.
MimeMessage message = new MimeMessage(session);
Posarem, a continuació el FROM i el TO del missatge – és a
dir, qui l’envia i a qui va adreçat -. Per afegir aquestes dades
utilitzarem els mètodes setFrom() i addRecipient() de
MimeMessage i li posem varies dades.
CORREU javax.mail: MimeMessage
En el constructor de la classe InternetAddress introduirem
l’adreça de correu.
Pels destinataris utilitzarem el mètode addRecipient() de
MimeMessage.
Message.RecipientType.To Destinatari principal del missatge
Message.RecipientType.CC Destinatari al que s’envia còpia del missatge
Message.RecipientType.BCC Destinatari al que s’envia còpia oculta del
missatge
// Qui envia el correu message setFrom(new InternetAddress ([email protected])); // A qui va adreçat Message.addRecipient(Message.RecipientType.TO, new InternetAddress([email protected]));
CORREU javax.mail: MimeMessage
Ara ja podem omplir l’assumpte (subject) del missatge i el
text. Els mètodes que utilitzarem són setSubject() i setText().
Message.setSubject(“Hola”); Message.setText(“Missatget amb JavaMail” + “dels bons”);
També podriem crear el mateix text però amb text html i
amb floritures de negreta i cursiva.
message.setText(“Missatget amb JavaMail<br>” + “<b>dels</b> <i>bons</i>”, ISO-8859-1”, “html”);
CORREU javax.mail: Transport
Per enviar el missatge, utilitzem la classe Transport que
s’obté de Session.
El mètode getTransport() requereix un paràmetre String amb
el nom del protocol a utilitzar. Com el de Gmail és smtp,
posarem smtp.
Transport t = session.getTransport(“smtp”);
Ara establirem la connexió, donant el nom d’usuari i
contrasenya.
t.connect ([email protected], “la contrasenya”);
CORREU javax.mail: Transport
Ara enviarem el missatge:
t.sendMessage(message, message.getAllRecipients());
t.close ();
El mètode per enviar missatges és sendMessage() i NO
solament send(). El mètode send() és estàtic i no té en
compte la connexió, l’usuari o la contrasenya.
Un cop haguem enviat el missatge, ja podrem tancar la
connexió.
CORREU JavaMail: Instal·lació
JavaMail és una llibreria desenvolupada per SUN
encaminada a l’enviament de correus electrònics
directament des de la nostra aplicació JAVA.
La instal·lació de la lliberia es pot realitzar mitjançant la
importació des de l’entorn de desenvolupament (Eclipse).
1) Descarreguem la lliberia (enllaç)
2) Accedim a les propietats del projecte amb el botó dret del ratolí.
3) Seleccionem l’opció “java Build Path” i accedim a l’opció “Add external
JARs”, busquem l’arxiu “mail.jar” que es troba dins de l’arxiu que
acabem de descarregar.
CORREU javax.mail & Gmail (1)
CORREU javax.mail & Gmail (2)
CORREU javax.mail & Gmail (3)
CORREU javax.mail & Gmail (4)
SSL i TLS Seguretat de la capa de transport
La TLS (Transport Layer Security, Seguretat de la Capa de
Transport) i la seva antecessora SSL (Secure Sockets Layer,
Capa de Sòcol Segur) són protocols criptogràfics que
proporcionen comunicacions segures per la xarxa.
...................
// TLS si es troba disponible props.setProperty(“mail.smtp.starttls.enable”, “true”); // Port de gmail per l’enviament de correus Props.setProperty(“mail.smtp.port”, “587”); // Nom de l’usuari Props.setProperty(“mail.smtp.user”, [email protected]); // Si requereix o no usuari i contrasenya per connectar-se Props.setProperty(“mail.smtp.auth”, “true”);
Servidor de correu sortint (SMTP) – necessita TLS o SSL:
smtp.gmail.com Utilitza autenticació: Sí Port per a TLS/STARTTLS: 587 Port per a SSL: 465
SSL i TLS Protocols criptogràfics
Per què s’utilitza el SSL?
• Perquè transferir informació important mitjançant una xarxa
pot ser d’alt risc en múltiples situacions com, per exemple,
davant la suplantació de la identitat.
SSL i TLS Protocols criptogràfics
• Actualment, el protocol criptogràfic SSL s’utilitza per protegir
tot tipus de comunicacions en l’àmbit de Internet,
principalment les connexions HTTPS.
• Una evolució del protocol SSL és el TLS.
• Tant SSL com TLS estan pensats per protegir les
comunicacions entre un client i un servidor.
• Els protocols ofereixen la possibilitat de xifrar les dades que
es transmeten per assegurar la confidencialitat.
SSL i TLS Protocols criptogràfics a Java
• Per utilitzar comunicacions xifrades a Java, hem de canviar
les classes java.net.Socket i java.net.serverSocket per
javax.net.ssl.SSLSocket i javax.net.ssl.SSLServerSocket.
• Només canviant les declaracions dels sockets i inicialitzant-
los com sockets SSL protegim les les comunicacions d’una
aplicació.
• La resta de línies del programa no han de ser modificades
per res.
SSL i TLS Protocols criptogràfics a Java
• Les classes javax.net.ssl.SSLSocket i
javax.net.ssl.SSLServerSocket són classes abstractes i, per
tant, no en podem crear objectes directament.
• Per crear objectes d’aquestes classes ho farem mitjançant
factories de sòcols. Les factories de sockets SSL venen
representades per les classes SSLSocketFactory i
SSLServerSocketFactory.
• Podrem crear una conneció SSL contra el host indicat
mitjançant el port indicat. Fariem el mateix pels sòcols de
servidor.
SSLSocketFactory ssf = (SSLSocketFactory)SSLSocketFactory.getDefault(); SSLSocket s = ssf.createSocket(host, port);
SSL i TLS KeyStores i TrustStores
• Ja tenim els sòcols creats. I ara, com ens autentiquem?
• El protocol SSL utilitza certificats X.509 per l’autenticació.
• Quan utilitzem factories de sockets “per defecte”, els
certificats d’autenticació (per identificar-se) es busquen al
disc, en arxius en format KeyStore.
• Una aplicació de xarxa que utilitzi SSL haurà de disposar
d’una KeyStore en disc on hi hagi el seu certificat i la seva
clau privada.
SSL i TLS KeyStores i TrustStores
• Si l’apliació estableix una comunicació i la part remota i
entrega un certificat, aquesta ha de decidir si el certificat
rebut és de confiança (trusted) o no.
• En les versions “per defecte” de SSL aquesta comprovació
també es realitza amb un KeyStore anomenat TrustStore.
• Si el certificat rebut es troba dins del TrustStore, llavors
s’accepta la comunicació. En cas contrari, es donaria un
error d’autenticació.
SSL i TLS KeyStores i TrustStores
• Un KeyStore conté claus privades i els certificats amb les seves
corresponents claus públiques. Solament és necessari si som un
servidor i requerim autenticació dels clients.
• Un TrustStore conté certificats d’altres parts amb les que esperem
comunicar-nos o d’Autoritats Certificadores en les que confiem per
identificar altres parts.
Web Llegint directament des d’una URL
• Mitjançant una crida al mètode
openStream () de la URL podem obtenir
un flux amb el que llegir el contingut de la
URL.
• El mètode openStream () retorna un
objecte java.io.InputStream que facilita la
lectura del contingut de la URL.
Web Classe URL
• Mitjançant el mètode openStream () podem establir un fluxe
d’entrada amb una URL (per exemple, http://www.yahoo.com/) per,
a continuació, obrir-hi un BufferedReader i llegir el contingut de la
URL.
Web URLConnection
• La classe URLConection és la superclasse abstracta de totes les
classes que representen la comunicació entre l’aplicació i una
URL.
• Un objecte d’aquest tipus es pot utilitzar per llegir des de i per
escriure cap al recurs al que fa referència l’objecte URL.
• La creació d’una connexió comporta:
1) S’obté un objecte URLConnection utilitzant el mètode openConnection() d’un
objecte URL.
2) S’estableixen els paràmetres i les propietats de la petició.
3) S’estableix la connexió utilitzant el mètode connect().
4) Es pot obtenir informació sobre la capçalera i/o obtenir el recurs remot.
•
Web URLConnection
Web Capturar una pàgina web (1)
Web Capturar una pàgina web (2)