API JavaMail: clases principales

La API de JavaMail consta de algunas interfaces y clases que se utilizan para enviar, leer y eliminar mensajes de correo electrónico. Aunque hay muchos paquetes en la API de JavaMail, cubrirá los dos paquetes principales que se utilizan con frecuencia en la API de Java Mail: el paquete javax.mail y javax.mail.internet . Estos paquetes contienen todas las clases principales de JavaMail. Son:

Clase Descripción
javax.mail.Session La clase clave de la API. Un objeto multiproceso representa la fábrica de conexiones.
javax.mail.Message Una clase abstracta que modela un mensaje de correo electrónico. Las subclases proporcionan las implementaciones reales.
javax.mail.Address Una clase abstracta que modela las direcciones (desde y hacia direcciones) en un mensaje. Las subclases proporcionan las implementaciones específicas.
javax.mail.Authenticator Una clase abstracta utilizada para proteger los recursos de correo en el servidor de correo.
javax.mail.Transport Una clase abstracta que modela un mecanismo de transporte de mensajes para enviar un mensaje de correo electrónico.
javax.mail.Store Una clase abstracta que modela un almacén de mensajes y su protocolo de acceso, para almacenar y recuperar mensajes. Una tienda se divide en carpetas.
javax.mail.Folder Una clase abstracta que representa una carpeta de mensajes de correo. Puede contener subcarpetas.
javax.mail.internet.MimeMessage El mensaje es una clase abstracta, por lo tanto, debe funcionar con una subclase; en la mayoría de los casos, usará un MimeMessage. Un MimeMessage es un mensaje de correo electrónico que comprende los tipos y encabezados MIME.
javax.mail.internet.InternetAddress Esta clase representa una dirección de correo electrónico de Internet que utiliza la sintaxis de RFC822. La sintaxis de dirección típica tiene el formato [email protected] o Nombre personal <[email protected]> .

Estudiemos cada una de estas clases en detalle y en los capítulos siguientes estudiaremos ejemplos utilizando cada una de ellas.

Clase de sesión

La clase Session es la clase principal de la API JavaMail y no está subclasificada. El objeto Session actúa como fábrica de conexiones para la API JavaMail, que maneja tanto la configuración como la autenticación.

El objeto de sesión se puede crear de las siguientes formas:

  • Buscando el objeto administrado almacenado en el servicio JNDI

    InitialContext ctx = new InitialContext();
    Session session = (Session) ctx.lookup("usersMailSession");

    usersMailSession es el objeto de nombre JNDI utilizado como objeto administrado para el objeto Session. usersMailSession se puede crear y configurar con los parámetros requeridos como pares de nombre / valor, incluida información como el nombre de host del servidor de correo, la cuenta de usuario que envía el correo y los protocolos admitidos por el objeto Session.

  • Otro método para crear el objeto Session se basa en el enfoque programático en el que puede usar un objeto java.util.Properties para anular parte de la información predeterminada, como el nombre del servidor de correo, el nombre de usuario, la contraseña y otra información que puede ser compartido en toda su aplicación.

El constructor de la clase Session es privado . Por lo tanto, la clase Session proporciona dos métodos (enumerados a continuación) que obtienen el objeto Session .

  • getDefaultInstance(): Hay dos métodos para obtener el objeto de sesión mediante el método getDefaultInstance (). Devuelve la sesión predeterminada.

    public static Session getDefaultInstance(Properties props)
    public static Session getDefaultInstance(Properties props,Authenticator auth)
  • getInstance(): Hay dos métodos para obtener el objeto de sesión mediante el método getInstance (). Devuelve la nueva sesión.

    public static Session getInstance(Properties props)
    public static Session getInstance(Properties props,Authenticator auth)

Clase de mensaje

Con el objeto Session creado, ahora pasamos a crear un mensaje que se enviará. El tipo de mensaje será javax.mail.Message .

  • El mensaje es una clase abstracta. Por lo tanto, su subclase javax.mail.internet.MimeMessage se usa principalmente.

  • Para crear el mensaje, debe pasar el objeto de sesión en el constructor de la clase MimeMessage. Por ejemplo:

    MimeMessage message=new MimeMessage(session);
  • Una vez que se crea el objeto de mensaje, necesitamos almacenar información en él. La clase de mensaje implementa la interfaz javax.mail.Part mientras que javax.mail.internet. MimeMessage implementa javax.mail.internet.MimePart. Puede usar message.setContent () o mimeMessage.setText () para almacenar el contenido.

  • Los métodos comúnmente usados ​​de la clase MimeMessage son

    Método Descripción
    public void setFrom (Dirección dirección) utilizado para establecer el campo de encabezado de.
    public void addRecipients (tipo Message.RecipientType, direcciones de cadena) se utiliza para agregar la dirección dada al tipo de destinatario.
    public void setSubject (Asunto de cadena) utilizado para establecer el campo de encabezado del asunto.
    public void setText (String textmessage) se utiliza para establecer el texto como el contenido del mensaje utilizando texto / tipo MIME sin formato.

Clase de dirección

Ahora que tenemos un objeto Sesión y Mensaje (con contenido almacenado en él), necesitamos direccionar la carta usando el objeto Dirección .

  • La dirección es una clase abstracta. Por lo tanto, su subclase javax.mail.internet.InternetAddress se usa principalmente.

  • La dirección se puede crear simplemente pasando la dirección de correo electrónico:

    Address address = new InternetAddress("[email protected]");
  • Otra forma de crear una dirección es pasando el nombre junto con la dirección de correo electrónico:

    Address address = new InternetAddress("[email protected]", Manisha);
  • También puede configurar los campos Para, De, CC, CCO como se muestra a continuación

    • message.setFrom(address)

    • message.addRecipient (tipo, dirección)

    • Tres tipos de direcciones predefinidos son objetos con uno de estos valores:

      • Message.RecipientType.TO

      • Message.RecipientType.CC

      • Message.RecipientType.BCC

Clase de autenticador

La clase Authenticator representa un objeto que sabe cómo obtener autenticación para una conexión de red. Por lo general, lo hará solicitando información al usuario.

  • Authenticator es una clase abstracta. Usted crea una subclase PasswordAuthentication , pasando un nombre de usuario y una contraseña a su constructor.

  • Debe registrar el autenticador con la sesión cuando cree el objeto de sesión.

A continuación, se muestra un ejemplo del uso del autenticador :

Properties props = new Properties();
//Override props with any customized data
PasswordAuthentication auth = new PasswordAuthentication("manisha", "pswrd")
Session session = Session.getDefaultInstance(props, auth);

Clase de transporte

La clase de transporte se utiliza como mecanismo de transporte de mensajes. Esta clase normalmente usa el protocolo SMTP para enviar un mensaje.

  • Es una clase abstracta.

  • Puede usar la versión predeterminada de la clase simplemente llamando al método send () estático :

    Transport.send(message);
  • La otra forma de enviar un mensaje es obtener una instancia específica de la sesión para su protocolo, pasar el nombre de usuario y la contraseña (en blanco si no es necesario), enviar el mensaje y cerrar la conexión:

    message.saveChanges(); // implicit with send()
    //Get transport for session
    Transport transport = session.getTransport("smtp");
    //Connect
    transport.connect(host, username, password);
    //repeat if necessary
    transport.sendMessage(message, message.getAllRecipients());
    //Done, close the connection
    transport.close();

Clase de tienda

Una clase abstracta que modela un almacén de mensajes y su protocolo de acceso, para almacenar y recuperar mensajes. Las subclases proporcionan implementaciones reales. Store extiende la clase Service , que proporciona muchos métodos comunes para nombrar tiendas, conectarse a tiendas y escuchar eventos de conexión.

Los clientes obtienen acceso a un almacén de mensajes al obtener un objeto de almacén que implementa el protocolo de acceso a la base de datos. La mayoría de los almacenes de mensajes requieren que el usuario esté autenticado antes de permitir el acceso. El método de conexión realiza esa autenticación.

Store store = session.getStore("pop3");
store.connect(host, username, password);

Clase de carpeta

Carpeta es una clase abstracta que representa una carpeta para mensajes de correo. Las subclases implementan carpetas específicas del protocolo. Las carpetas pueden contener tanto subcarpetas como mensajes, proporcionando así una estructura jerárquica.

Después de conectarse a la Tienda, puede obtener una Carpeta, que debe abrirse antes de poder leer los mensajes de ella.

Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[] = folder.getMessages();

El método getFolder (String name) para un objeto Folder devuelve la subcarpeta nombrada. Cierre la conexión de la tienda y la carpeta una vez que haya terminado de leer el correo.

Podemos ver la relación entre la tienda y la carpeta en la siguiente imagen:

Como podemos ver, para cada cuenta de usuario, el servidor tiene una tienda que es el almacenamiento de los mensajes del usuario. La tienda está dividida en carpetas y la carpeta "bandeja de entrada" es la carpeta principal que contiene los mensajes de correo electrónico. Una carpeta puede contener tanto mensajes como subcarpetas.