JavaMail
- Área: Librerías y Utilidades para Aplicaciones Java
- Carácter del recurso: Recomendado
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 dividiendose 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 autentificació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:
Clase | Definición |
---|---|
Session | Define 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 |
Message | A 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 |
Address | A 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 |
Authenticator | Permite proteger el acceso a los recursos mediante el empleo de un un autentificador de nombre y clave asociada |
Transport | Realiza el envío del mensaje |
Store/Folder | Sistema 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