Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases...
Transcript of Servicios de Mensajes en Java Sesión 1 JavaMail (1) · ¾JavaMail: API Java con las clases...
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)
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
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
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
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
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
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
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
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
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);
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);
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
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
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);
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);
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);
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());
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
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
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();
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
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);
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
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;}}
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
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
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
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
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);
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
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
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);
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…