10 octubre 2016

API JavaMail para enviar correo Gmail via SMTP en Java EE

En este nuevo artículo, explico cómo desarrollar una aplicación web sencilla en la plataforma Java EE 7 con el IDE Netbeans 8.1, el Framework JSF y la API JavaMail que nos permitirá enviar correo electrónico en Java con el protocolo de red SMTP (protocolo para transferencia simple de correo) utilizado para el intercambio de mensajes de correo electrónico entre computadoras u otros dispositivos utilizando el TLS (Transport Layer Security) que proporciona comunicación criptográfica de forma segura y autenticada.


La API JavaMail es una plataforma independiente que contienen un paquete que ofrece una interfaz de nivel de aplicación utilizados para enviar y recibir correo electrónico, sea por SMTP que se utiliza para enviar Email, POP3 (Protocolo de oficina correo) es el estándar para la recepción de mensajes de correo electrónico, IMAP (Protocolo de acceso a mensajes de Internet) es una alternativa a POP3. Maneja una interfaz de proveedor de servicios (SP) que habla lenguajes específicos de protocolos.

Configuración del entorno

Tenemos que descargar e instalar los softwares siguientes:

Software
Link de Descarga
Netbeans 8.1
https://netbeans.org/downloads/8.1/
GlassFish 4.1
https://glassfish.java.net/download.html
Java SE 7
http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html

El Primer paso, creamos un nuevo proyecto en Netbeans, “New Project”=> Categories =>“Maven” y Project=> “Web Application” como se muestra en la (Figura 1).

Figura 1 Maven Web Application

Presionamos Siguientes y aparecerá otra pantalla como se muestra en la (Figura 2)

Figura 2 Nombre y Ubicación

Ingresamos del nombre y la ubicación de la aplicación, para este caso el nombre del proyecto se llamara “JavaMails”.

Las siguientes propiedades de Maven se enumeran:
  •  Artefacto Id: Esto no se puede cambiar. Es el nombre de su proyecto.
  •  ID de grupo: Esto se puede editar según sea necesario. Esto establece el paquete básico Para el proyecto.
  • Versión: Esto no tiene que ser cambiado.
  • Proyecto: Esta es la última propiedad que vamos a utilizar para establecer la raíz paquete para todas las clases de Java en el proyecto.
Ahora que nos hemos fijado el nombre y la ubicación del proyecto, haga clic en Siguiente. Esto nos lleva al cuadro de diálogo Configuración. Aquí es donde nos fijamos el servidor de aplicaciones y Java Enterprise Edition (EE) versión que vamos a utilizar para el proyecto, que para este ejemplo utilizamos el servidor de GlassFish Server que trae por defecto el IDE de Netbeans y la versión del Java EE 7 Web como se muestra en la (Figura 3).


Figura 3 Configuración

Una vez que hemos establecido la configuración del proyecto, podemos finalizar la creación de la misma. NetBeans nos presenta con una vista del proyecto que contiene nuestro proyecto recién creado.

Ahora que hemos creado con éxito el proyecto, tenemos que cambiar el proyecto propiedades para que añada el framework JSF.

Agregamos el archivo de JSF Faces Configuración, presionamos clic derecho sobre el proyecto como se muestra en la  (Figura 4) “New”=> “JSF Faces Configuration”.

Figura 4 New JSF Faces Configuración

En la (Figura 5) Ingresamos del nombre que le vamos a colocar al archivo JSF Faces Configuración, para este caso dejamos el nombre por defecto “faces-config” y presionamos el botón Terminar.

Figura 5 New JSF Faces Configuración

Verificamos que se encuentre en nuestro proyecto el Framework Java Server Faces, presionamos clic derecho en nuestro proyecto y seleccionamos propiedades la opción Frameworks como se muestra en la (Figura 6).

Figura 6 Propiedades del Proyecto Framework

El siguiente paso es dirigirnos al explorador del proyecto y ubicar el archivo “POM.XML” y agregamos esta dependencia como se muestra en la (Figura 7) la API JavaMail proporciona clases que modelan un sistema de correo. El paquete javax.mail define las clases que son comunes a todos los sistemas de correo. El paquete javax.mail.internet define las clases que son específicos de los sistemas de correo basados ​​en estándares de Internet tales como MIME, SMTP, POP3 e IMAP. E incluye el paquete javax.mail y sub-paquetes.

Figura 7 Agregar Dependencia de JavaMail a pom.xml

Para agregar el archivo de JSF Managed Bean, presionamos clic derecho sobre el proyecto como se muestra en la  (Figura 8) “New”=> “JSF Managed Bean”.

Figura 8 New JSF Managed Bean

En la (Figura 9) Ingresamos del nombre que le vamos a colocar al archivo JSF Managed Bean, para este el nombre que utilizaremos “emailJSFManagedBean”, y en el campo Scope dejamos el valor por defecto que para este caso “request” y presionamos el botón Terminar.

Figura 9 Nombre del archive y ubicación

Ahora, para aquellos de ustedes que están familiarizados con Contextos JSF y la inyección de dependencias (CDI), las anotaciones no será un misterio. Para aquellos de ustedes que no están, voy a explicar brevemente lo siguiente:
  • @ManagedBean: Esto le dice al servidor de aplicaciones que los casos de este Bean se pueden denominar con el nombre que figura en el atributo de valor de la anotación. Esto significa que podemos usar el nombre en las páginas JSF para acceder a las instancias de mágicamente nuestra Bean.

La clase emailJSFManagedBean, desde JSF 2.0 en adelante, Managed Bean pueden ser fácilmente registrado de acuerdo con las anotaciones.  La anotacion @RequestScope que identifica el Managed bean  como un recurso que existe sólo en el scope del request. En otras palabras, El bean existe para la duración de una sola petición HTTP para la interacción del Usuario con la aplicación web. En el siguiente paso declaramos ochos (8) variables que se describirán en la siguiente Tabla 1, en el siguiente paso crearemos una nueva instancia de emailJSFManagedBean como se muestra en la (Figura 10).


NOMBRE DE LA VARIABLE
DESCRIPCIÓN
To
Quien enviara el correo
From
Para quien será remitido el correo
Subject
El asunto o motivo del correo
Descr
La descripción del correo electrónico
Username
Usuario del correo
Password
Contraseña del correo
Smtp
Protocolo
port
Puerto que por defecto es 587 para habilitar los correos Gmail
Tabla 1 Descripción de las variables

Figura 10 Declaración de variables y creación de la nueva instancia

Después de tener las variables declaradas privada, generamos los métodos de acceso “get y set” para cada una de las variables que conformaran los componentes de la web. Crearemos dos (2) métodos ValidateEmail() que se encargara de validar las direcciones de emails en los campos To, From y Username como se muestra en la (Figura 11) que son enviados por el usuario en aplicaciones web.

Figura 11 Método ValidateEmail

Este método recibe tres parámetros:
  • El contexto de la aplicación JSF, con el fin de pasar los mensajes de error desde el bean administrado a la interfaz de usuario.
  • El identificador UIComponent toValidate del componente web que se llama al método, que, en este caso, es un método de campo de entrada de texto, toma la entrada del usuario como argumento.
  • El valor de la variable, que contiene la dirección de correo electrónico que necesita ser validado.
Después el método se encarga de:
  • Comprobar si el valor es null o vacío. si el valor es null o vacío, el método establece la propiedad válida del componente false y establece el mensaje de error de E-mail que se requiere. 
  • En el caso que no sea null o vacio, el método comprueba si los caracteres “@”y el punto (.) están contenidos en el valor. En el caso que no estén incluido, el método establece la propiedad válida del componente “false” y establece el mensaje de error de “E-mail no es válido”.


El segundo método es submitEmail() como se muestra en la (Figura 12) para este caso no recibe ningún parámetro. Se encarga de envía un correo electrónico. Si la transmisión de correo electrónico es correcta, el método devuelve emailOk  que muestra la pagina emailOk.xhtml como se muetra en la (Figura 16)  página en el navegador en el caso contrario nos devuelve emailFal que muestra la pagina emailFal.xhtml como se muestra en la (Figura 17).

Figura 12 Método submitEmail

Enviar un email usando JavaMail, primero iniciamos una instancia de la session email con la clase Session, la sesión email es el punto inicial para la API JavaMail, Se utiliza la clase java.util.properties para obtener información, como por ejemplo el servidor de correo electrónico, el usuario y la contraseña, que puede ser compartido en todo el resto de la aplicación. En este caso, creamos una instancia predeterminada de la clase Session:

session = Session.getInstance(props, new javax.mail.Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

En segundo lugar, aunque la sesión, producimos el email usando la clase de Message. Sin embargo, considerando que Message es una clase abstracta, elegimos la subclase MimeMessage, nos permite crear mensajes que entienden tipo MIME, como se define en las diferentes normas que definen RFCs. El mensaje es construido con la sesión con un argumento:

message = new MimeMessage(session);

Entonces, enviamos el email por manipulación de un tipo de objeto Transport. El mensaje se envía a través del protocolo de transporte SMTP. La transmisión está a cargo de la clase de Transport y el objeto crea una instancia de la siguiente forma:

Transport transport = session.getTransport("smtp");

a continuación, el objeto de transporte intenta conectarse a la SMTP servidor utilizando las credenciales sugeridas (la dirección del servidor SMTP, el número de puerto que acepta conexiones SMTP, el usuario y la contraseña) para pasar la autenticación en el servidor.

transport.connect(this.smtp, this.port, this.username, this.password);

Si la conexión es aceptada por el servidor SMTP, el email se envía a través del comnado send. Por último, se cierra el servicio de transporte al invocar el comando close:

transport.sendMessage(message, message.getAllRecipients());
transport.close();

En este paso vamos adicionar a nuestro Proyecto las páginas que vamos a utilizar para este ejemplo serán cuatro (4) paginas pero comencemos por email “New File”=> “XHTML como se muestra en la (figura 13)

Figura 13 Creación de pagina JSF

En el siguiente paso agregaremos el nombre de la página y presionamos el botón terminar como se muestra en la (figura 14).

Figura 14 Nombre y ubicación de la página XHTML

Estos pasos lo repetimos para crear las paginas “emailOk” y “emailFal” como se muestra en la (figura 16) y (figura 17).

Figura 15 Página para envió de email

Figura 16 Pagina confirmación de envió exitoso

Figura 17 Página de envió fallido del email

Descarga de proyecto


Referencias:

3 comentarios:

  1. Hola Geovanny
    Muchas gracias por tu aporte me ayudo mucho para mi tarea pero tengo un problema. Tengo un web Aplicattion el cual hace un registro de libros en una base de datos y los lista y deseo que al guardar un nuevo libro en la base de datos se envie un mail. puedo adaptarlo para que lo haga ? y como lo haria?. Me ayudarias mucho. Gracias de antemano

    ResponderBorrar
  2. Desde eclipse como le doy en New JSF Managed Bean ???

    ResponderBorrar
  3. s gracias por tu aporte me ayudo mucho para mi tarea pero tengo un problema. Tengo un web Aplicattion el cual hace un registro de libros en una base de datos y los lista y deseo que al guardar un nuevo libro en la base de datos se envie un mail. puedo adaptarlo para que lo haga ? y como lo h noticiasdesanxenxo.es/biografia-de-wooyoung/

    ResponderBorrar