Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases...

33
Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 1 Especialista en Aplicaciones y Servicios Web con Java Enterprise Servicios de Mensajes en Java Sesión 1 JavaMail (1)

Transcript of Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases...

Page 1: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 1

Especialista en Aplicaciones y Servicios Web con Java Enterprise

Servicios de Mensajes en JavaSesión 1

JavaMail (1)

Page 2: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 2

IntroducciónInstalación y pruebaClase javax.mail.SessionClases Message y MimeMessageClase TransportClases Store y Folder

Indice

Page 3: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 3

IntroducciónInstalación y pruebaClase javax.mail.SessionClases Message y MimeMessageClase TransportClases Store y Folder

Introducción

Page 4: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 4

Motivación: JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema de e-mail.Proveedores JavaMail: proporcionan la funcionalidad necesaria para establecer la comunicación a través de protocolos concretos.Protocolos soportados por la implemenación de Sun: • SMTP (Simple Mail Transfer Protocol)• IMAP (Internet Message Access Protocol)• MIME (Multipurpose Internet Mail Extensions)• POP3 (Post Office Protocol 3)

Introducción

Page 5: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 5

Protocolos: SMTP: “Agente de entrega” (no se utiliza para leer e-mails). Sensible a “spams”, lo cual implica bloqueo de la capacidad del servidor.POP3: “Mecanismos de acceso”. Permiten acceder, descargar y almacenar el correo en otras carpetas. El usuario es el responsable del almacenamiento. IMAP: Más completo que los dos anteriores. El servidor es el responsable del almacenamiento. MIME: Extensión para permitir incorporar datos no ASCII. Los archivos binarios se pueden codificar en ASCII y luego transmitirse.

Introducción

Page 6: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 6

Elementos de JavaMail: Gestión de sesión: Protocolo de transferencia. Manipulación de mensajes: Creación y manipulación.Almacenamiento: Jerarquías de almacenamiento. Transporte: Mecanismos de entrega del mensaje.

Conceptos JavaMail: Transport: Servicio con capacidad para enviar mensajes a un destino (usualmente con SMTP) Store: Servicio con el que hay que conectar para descargar mensajes que han sido enviados a nuestro buzón (p.e. POP3 o IMAP)

Introducción

Page 7: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 7

IntroducciónInstalación y pruebaClase javax.mail.SessionClases Message y MimeMessageClase TransportClases Store y Folder

Instalación y prueba

Page 8: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 8

Instalación: JavaMail: • En java.sun.com/products/javamail• Últimas versiones: JavaMail 1.3, JavaMail• Copiar mail.jar en $JAVA_HOME/jre/lib/ext

JAF (JavaBeans Activation Framework):• En java.sun.com/beans/glasgow/jaf.html• Última versión: Jaf 1.0.2• Copiar activation.jar en $JAVA_HOME/jre/lib/ext

Prueba: msgsend.javajava msgsend –o [email protected] –M luceros.dccia.ua.es [email protected]

(pide subject y texto. Terminar con CRTL-D. Verificar)

Instalación y prueba

Page 9: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 9

IntroducciónInstalación y pruebaClase javax.mail.SessionClases Message y MimeMessageClase TransportClases Store y Folder

Clase javax.mail.Session

Page 10: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 10

Parámetros de sesión: java.util.PropertiesDefinen los parámetros de sesión. Pueden ser impuestos por nosotros o bien extraidos del sistema:

Parámetros: protocolo, host, usuario, etc..Extraer del sistema: System.getProperties()

Clase javax.mail.Session

Properties props = new Properties();props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.host", "luceros.dccia.ua.es"); props.put("mail.smtp.port", "25");Session session = Session.getInstance(props);

Page 11: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 11

Tipos de sesión: SessionSesiones (Session) públicas y privadas según queramos compartir o no los parámetros con otras clases que se ejecutan en la misma máquina virtual.

Clase javax.mail.Session

Properties props = System.getProperties();if (mailhost != null)props.put("mail.smtp.host“, mailhost);

// Get a Session objectSession session = Session.getDefaultInstance(props, null);if (debug)

session.setDebug(true);

Page 12: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 12

IntroducciónInstalación y pruebaClase javax.mail.SessionClases Message y MimeMessageClase TransportClases Store y Folder

Clases Message y MimeMessage

Page 13: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 13

Clase abstracta: MessageNos ocupamos ahora de la “construcción del mensaje”Proporciona un contenedor para la representación del mensaje de correo.Estructura del mensaje:• Cabecera: Asunto, receptor/es remitente, fecha de envío, etc. • Contenido: Datos propios del mensaje

Subclase javax.mail.internet.MimeMessagepara tratamiento de tipos MIME. Message (MimeMessage) implementa la interfaz javax.mail.Part (MimePart) para obtener la funcionalidad necesaria para la construcción de mensajes.

Clases Message y MimeMessage

Page 14: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 14

Clase: MimeMessageConstructor: A partir de los datos de la sesión o bien como copia de otra instancia (constructor de copia).

Métodos setXXX: (existen las contrapartidas getXXX)• setFrom(): Usando javax.mail.Internet.InternetAddress• setRecipients(): Especificar to, cc, bcc• setSubject(): Asunto del mensaje• setText(): Si se trata de una mensaje de texto• setContent(): Si se trata de un mensaje MIME• setHeader(): Clase desde la que se envía el email.• setSentDate(): Fecha de envío.

Clases Message y MimeMessage

Message msg = new MimeMessage(session);Message msg2 = new MimeMessage(msg);

Page 15: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 15

Clase: MimeMessagesetFrom():

setRecipients():

setSubject():

Clases Message y MimeMessage

if (from != null) msg.setFrom(new InternetAddress(from));else msg.setFrom();

msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));

msg.setSubject(subject);

Page 16: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 16

Clase: MimeMessagesetText(): mensaje de solo texto. Construiremos el String y luego invocaremos este método. setContent(): Tipo MIME (p.e. HTML).

setHeader(),setSentDate(), setReplyTo():

Clases Message y MimeMessage

String contenido = "<HTML><HEAD><TITLE> Hola</TITLE></HEAD><BODY> Texto<BODY></HTML>"msg.setContent(contenido, "text/html");

String mailer = "msgsend"; Adress[] direcciones = ...; msg.setHeader("X-Mailer", mailer);msg.setSentDate(new Date());msg.setReplyTo(direcciones);

Page 17: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 17

Clase: MimeMessagesetText(): mensaje de solo texto. Construiremos el String y luego invocaremos este método. setContent(): Tipo MIME (p.e. HTML).

setHeader(),setSentDate():

Clases Message y MimeMessage

String contenido = "<HTML><HEAD><TITLE> Hola</TITLE></HEAD><BODY> Texto<BODY></HTML>"msg.setContent(contenido, "text/html");

String mailer = "msgsend";...msg.setHeader("X-Mailer", mailer);msg.setSentDate(new Date());

Page 18: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 18

IntroducciónInstalación y pruebaClase javax.mail.SessionClases Message y MimeMessageClase TransportClases Store y Folder

Clase Transport

Page 19: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 19

Envío de mensajes: TransportUsualmente a través de SMTP.Método Transport.send(): Con el Message a enviar y un array de Address (opcionalmente) que sustituiría a todas las direcciones previamente especificadas.Alternativamente se puede utilizar un objeto Transporty llamar al método La ventaja que se sendMessage().tiene es que se aprovecha la misma conexión para facilitar el envío de un flujo de mensajes, mientras que con send() se establece una conexión por mensaje.

Clase Transport

Page 20: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 20

Con Transport.send()

Con sendMessage():

Clase Transport

Transport.send(msg);System.out.println("\nMail was sent successfully.");

msg.saveChanges(); // send() incluye una llamada aquiTransport tr = session.getTransport("smtp");tr.connect(host, usuario, password);tr.sendMessage(msg, msg.getAllRecipients());tr.close();

Page 21: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 21

IntroducciónInstalación y pruebaClase javax.mail.SessionClases Message y MimeMessageClase TransportClases Store y Folder

Clases Store y Folder

Page 22: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 22

Almacenamiento: StorePara leer comenzaremos por definir una Session y a partir de ella llamaremos al método getStore()especificando el protocolo de lectura (POP3, IMAP).Después nos conectaremos, con el método connect() de la clase Store, especificando host, usuario y password.

Acceso a carpetas: Folder

Clases Store y Folder

Properties props = new Properties();Session session = Session.getDefaultInstance(props, null);Store store = session.getStore("pop3");store.connect(host, username, password);

Page 23: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 23

Ejemplo: GetMessageExample.javajava GetMessageExample luceros.dccia.ua.es sco

password_sco

1. Propiedades y establecimiento de sesión.2. Acceso al Store y conexión.3. Obtener el Folder.4. Obtención de los mensajes: Message[]5. Bucle de lectura a petición del usuario.

Clases Store y Folder

Page 24: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 24

Clases Store y Folder

Folder folder = store.getFolder("INBOX“);folder.open(Folder.READ_ONLY);BufferedReader reader = new BufferedReader (

new InputStreamReader(System.in));Message message[] = folder.getMessages();for (int i=0, n=message.length; i<n; i++) {System.out.println(i + ": " + message[i].getFrom()[0]

+ "\t" + message[i].getSubject());System.out.println("Do you want to read message? [YES to

read/QUIT to end]");String line = reader.readLine();if ("YES".equals(line)) {

System.out.println(message[i].getContent());} else if ("QUIT".equals(line)) {

break;}}

Page 25: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 25

Métodos de, manejo, acceso y consulta a FoldergetDefaultFolder(): Carpeta por defectogetFolder(nombre): Carpeta “nombre”getParent(): Padre de la carpeta o null. list(match): Lista carpetas que emparejan. exists(): Indican si una carpeta exite físicamente.create(): Crea una carpeta con un tipo especificado. open(): Abrir en el modo especificado.expunge(): Borra mensajes marcados para borrado.close(): Cierra (indicando si con “expunge” o no)delete(): Borra carpeta con recursividad o no.

Clases Store y Folder

Page 26: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 26

Métodos setFlags():Por ejemplo para marcar un mensaje con el flagFlags.Flag.DELETED.setFlags(int[] nums, Flags flag, booleanvalor): Indicando los números de mensajes a borrar. setFlags(int i, j, Flags flag, booleanvalor): Indicando rango de los mensajes (de i a j).setFlags(Message[] mens, Flags flag, boolean valor): Indicando array de mensajes.

Clases Store y Folder

Page 27: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 27

Métodos getXXX():getMessageCount(): Número de mensajes de la carpeta o -1 si no es posible.hasNewMessage(): Indica si se ha recibido nuevo. getNewMessageCount(): Mensajes nuevos o -1. getUnreadMessageCount(): Mensajes no leidos. getMessage(): Mensaje correspondiente al número.getMessages(): Devuelve todos los mensajes. Se puede especificar un rango (números i, j).

Clases Store y Folder

Page 28: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 28

Copiar mensajes: copyMessages()Método de la clase Folder, que permite copiar un array de mensajes en una determinada carpeta:

void copyMessages(Message[] lista, Folder carpeta);

Los mensajes deben ser parte de la carpeta actual. Mover: mover.java

Para “mover” simplemente se copian primero los mensajes y luego se marcan con el flag de borrado. El borrado no se aplica hasta que se cierra la carpeta (si especificamos “expunge”).

Clases Store y Folder

Page 29: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 29

Clases Store y Folder

// Open destination folder, create if reqdFolder dfolder = store.getFolder(dest);if (!dfolder.exists())dfolder.create(Folder.HOLDS_MESSAGES);

if (end == -1)end = count;

// Get the message objects to copyMessage[] msgs = folder.getMessages(start, end);System.out.println("Moving " + msgs.length + " messages");if (msgs.length != 0) {folder.copyMessages(msgs, dfolder);folder.setFlags(msgs, new Flags(Flags.Flag.DELETED), true);

Page 30: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 30

Clases Store y Folder

// Dump out the Flags of the moved messages, to insure that// all got deletedfor (int i = 0; i< msgs.length; i++) {

if (!msgs[i].isSet(Flags.Flag.DELETED))System.out.println("Message # " + msgs[i] +

" not deleted");}

}

// Close folders and storefolder.close(expunge);dfolder.close(false);store.close();

java mover – H luceros.dccia.ua.es – U sco – P password_sco –s fuente –d destino –x expunge

Page 31: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 31

Ejemplo: ReplyExample.javajava ReplyExample luceros.dccia.ua.es luceros.dccia.ua.es

sco password [email protected]

1, 5. De Session a Message[]6. Realizar el reply:

Crear un MimeMessage para el “reply”Poner el “>” (“canned text”)Especificar el contenido nuevoEnviar el mensaje

Clases Store y Folder

Page 32: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 32

Clases Store y Folder

MimeMessage reply = (MimeMessage)message[i].reply(false);reply.setFrom(new InternetAddress(from));MimeMessage orig = (MimeMessage)message[i];StringBuffer buffer = new StringBuffer("Thanks\n\n“);

if (orig.isMimeType("text/plain")) {String content = (String)orig.getContent();StringReader contentReader = new StringReader(content);BufferedReader br = new BufferedReader(contentReader);String contentLine;while ((contentLine = br.readLine()) != null) {

buffer.append("> ");buffer.append(contentLine);buffer.append("\r\n");

}}

reply.setText(buffer.toString()); Transport.send(reply);

Page 33: Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases abstractas que definen los objetos e interfaces necesarias para implementar un sistema

Mensajes en Java © 2003-2004 Depto. Ciencia Computación e IA JavaMail 33

Ejercicio1.java…Modificar GetMessageExample.java para que cuando se presente un email al usuario, éste pueda borrarlo.Utilizar msgsend.java para enviar varios mensajes al servidor de correo.Tener en cuenta que hay que abrir la carpeta para lectura/escritura, poner el flag y luego cerrarla para que pueda realizar el “expunge”.

Ejercicios…