JavaMail

RECU-0242 (Recurso Ficha Técnica)

Descripción

El API JavaMail es un paquete opcional (extensión estándar) para leer, componer, y envía mensajes electrónicos. Usamos este paquete para crear programas del tipo MUA (Mail User Agent) similares a Eudora, Pine, y Microsoft Outlook. Su propósito principal no es transportar, enviar, o re-enviar mensajes como sendmail u otros programas del tipo MTA (Mail Transfer Agent)En otras palabras, los usuarios interactúan con los programas para leer y escribir e-mails. Los programas MUA tratan con los programas MTA para el envío real. El API JavaMail está diseñado para proporcionar acceso independiente del protocolo para enviar y recibir mensajes dividiéndose en dos partes:

  • La primera parte del API es el foco de este tutor. Básicamente, cómo enviar y recibir mensajes independientemente del proveedor/protocolo.
  • La segunda parte habla de lenguajes específicos del protocolo como SMTP, POP, IMAP, y NNTP. Con el API, JavaMail para poder comunicar con un servidor, necesitamos un proveedor para un protocolo.

A continuación realizamos una breve definición de los diferentes protocolos:

  • SMTP: Simple Mail Transfer Protocol, define el mecanismo para enviar e-mail. En el contexto API JavaMail, el programa desarrollado contactará con el servidor SMTP de nuestro proveedor de servicios (ISP), Este servidor SMTP, dejara el mensaje en el servidor SMTP del receptor para que sea recogido por los usuarios a traves de POP o IMAP. Se utilizan sistemas de autenticación para la comprobación de usuarios.
  • POP: Post Office Protocol, es el mecanismo que se usa para conseguir el correo via WEB. Define el soporte de un sólo mailbox por usuario
  • IMAP: Internet Message Acess Protocol, Es un protocolo más avanzado para recibir mensajes . Tiende a sobrecargar mucho el servidor de correo, requiriendo que el servidor reciba los nuevos mensajes, los entregue a los usuarios cuando los soliciten y los mantiene en distintas carpeta de cada usuario tendiendo a agotar el espacio en el disco.
  • MIME: Multipurpose Internet Mail Extensions. No es un protocolo de transferencia de e -mail. En su lugar, define el contenido de lo que se está transfiriendo: el formato de los mensajes, los adjuntos, etc.

Si analizamos los componentes de la API tenemos las siguientes clases:

ClaseDefinición
SessionDefine una sesión de correo básica. El objeto Session se aprovecha de un objeto de java.util.Properties para obtener información acerca del servidor de correo, nombre de usuario, password..etc
MessageA partir del objeto de Session, se crea el mensaje para el envío . Se hace mediante un objeto Message . Siendo una clase abstracta, deberemos de trabajar con una subclase que mayoritariamente será javax.mail.internet.MimeMessage
AddressA partir de Session y Message, indicaremos el destino del mensaje.Siendo una clase abstracta, deberemos de trabajar con una subclase que mayoritariamente será javax.mail.internet.InternetAddress
AuthenticatorPermite proteger el acceso a los recursos mediante el empleo de un un autentificador de nombre y clave asociada
TransportRealiza el envío del mensaje
Store/FolderSistema para la obtención de mensajes. Después de obtener la sesión, y tras la autentificación le indicamos a Store que protocolo utilizar. Una vez obtenido el Store, buscamos el folder que debe de estar abierto para poder obtener los mensajes

Ejemplo de Uso

Ejemplo de una clase envoltorio que nos sirve para interpretar un mail

package org.javahispano.mailer;

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;

/**
 *  Envoltorio (wrapper, decorator, etc) para facilitarnos el manejo de mails
 *
 * @author  Alberto Molpeceres
 * @created  26. November 2002
 */
public class POP3Mail {

  /** Mensaje real de JavaMail */
  private Message message;
  /** Remitente del mensaje */
  private String from;
  /** Asunto del mensaje */
  private String subject;


  /**
   *Construye un envoltorio para un mensaje de  JavaMail
   *
   * @param  message Mensaje a envolver.
   */
  protected POP3Mail(Message message) {
    this.message = message;
    //recoger el remitente
    try {
      InternetAddress fromAddress = (InternetAddress) message.getFrom()[0];
      //Almacenamos la dirección del remitente de la forma:
      //  NOMBRE (DIRECCION)
      from = fromAddress.getPersonal() + " (" +
        fromAddress.getAddress() + ")";
    } catch (Exception e) {
      from = "Remitente no disponible";
    }
    //recoger el asunto del mensaje
    try {
      subject = message.getSubject();
    } catch (Exception e) {
      subject = "Asunto no disponible";
    }
  }


  /**
   *  Método estático que convierte los emails del tipo de JavaMail a nuestra
   clase envoltorio para facilitarnos el trabajo,.
   *
   * @param  messages Mesnajes en la carpeta
   * @return  Lista con nuestros mails convertidos
   */
  public static List convertMails(Message[] messages) {
    List list = new ArrayList();
    for (int i = 0; i < messages.length; i++) {
      list.add(new POP3Mail(messages[i]));
    }
    return list;
  }


  /**
   *  DEvuelve el remitente o emisor del mensaje
   *
   * @return  remitente
   */
  public String getFrom() {
    return from;
  }


  /**
   *  DEvuelve el asunto del mensaje
   *
   * @return  Asunto del mensaje
   */
  public String getSubject() {
    return subject;
  }


  /**
   *  Devuelve el contenido del email, el texto.

   Como estamos tratando solo con emails de texto, no es necesario
     tener en cuenta las partes (MIME)
   *
   * @return  el texto del email
   */
  public String getContent() {
    try{
    return message.getContent().toString();
    }
    catch(Exception e){
      return "Error!";
    }
  }


  /**
   *  Devuleve una representación del mail como cadena de caracteres
   *
   * @return  descripción
   */
  public String toString() {
    if (message != null) {
      return "From: " + from + "\n\t Subject: " + subject;
    } else {
      return ("No hay mensaje");
    }
  }


  /**
   *  Elimina un mail
   *
   * @exception  Exception si no se puede eliminar
   */
  public void delete()
    throws Exception {
    message.setFlag(Flags.Flag.DELETED, true);
  }
}

Requisitos e incompatibilidades

  • Se necesita JDK 1.4 o superior
  • Se necesitará la extensión JavaBeans Activation Framework (JAF) que viene con el paquete javax.activation. Se aconseja utilizar la versión 1.1