Enviar emails desde Java con Jakarta Mail
Hola y bienvenidos de nuevo al blog de Espai. Hoy vamos a ver cómo enviar emails desde Java con Jakarta Mail, que es una librería estupenda que nos permitirá automatizar tareas que tengan que ver con el correo electrónico. Ya sin más preámbulos, vamos al lío.
Crear el proyecto Eclipse
Vamos a usar Eclipse como editor, y como partimos desde 0 habrá que crear el proyecto vacío. Podemos hacer click en «Create a Java Project» o File->new -> Java Project.

En este punto, Eclipse nos pregunta como se llamará el proyecto. En mi caso he puesto «Emails» pero puedes usar cualquier nombre, mientras comience con texto y no tenga caracteres especiales como $ o #.

Queremos el proyecto vacío (por el momento, asi que simplemente pulsamos en «Finish».

Vamos ahora a crear la clase que contendrá nuestro código, para eso abrimos el proyecto pulsando en el icono > que hay debajo de «package Explorer».

Creamos una nueva clase, que llamaremos…

…Emails. Aquí dentro irá nuestro código, aunque por el momento Eclipse nos la creará vacía. Pulsamos en «Finish».

Añadir librería Jakarta Mail
Ahora necesitamos añadir la librería de Jakarta Mail, la que realmente hará el envío de los mensajes. Sigue el paso a paso que verás a continuación.
Creamos una nueva carpeta (lib) donde guardaremos la librería.

Copiamos y pegamos el fichero .jar que podrás descargar en la parte inferior del artículo.

El resultado debería ser éste:

Ahora nos falta avisar a Eclipse de que es una librería que necesita utilizar, así:

Si aparece en Referenced Libraries, lo hemos hecho bien.

Configuración de la cuenta de correo
Para enviar los emails, necesitamos una cuenta de correo que nos permita utilizar el servidor SMTP. Google nos ofrece esta posibilidad con un máximo de 100 envíos diarios, pero para pruebas nos será suficiente. En este caso he creado una cuenta que se llama jordi.pruebas.asdfg@gmail.com.
Además, deberemos activar una opción en la configuración para que nos permita enviar correos desde una aplicación externa, para eso vamos a la esquina superior derecha y pulsamos «Gestionar tu cuenta de Google».

Pulsamos en el menú izquierdo «Seguridad»

En la sección «Acceso de aplicaciones poco seguras» pulsamos en «Activar acceso». Aseguraros de usar un email que creéis para pruebas, no uséis el vuestro propio.

Pulsamos en el botón y lo activamos. Ahora ya podemos enviar emails dese nuestra aplicación.

Recibiremos un email de «Alerta de seguridad crítica». No os preocupéis, es Google avisándonos de que hemos activado esta opción. Bueno, preocuparos si no lo habéis hecho vosotros eso si!

Código del programa
Aquí tenemos el código que nos permitirá enviar el email. Podéis descargarlo también en el final del artículo, y pegar el contenido en nuestra clase Emails vacía.
Si os fijáis bien, hay una sección entre la línea 17 y 24 donde se configuran el acceso a nuestra cuenta Google. Necesitaréis cambiar donde pone «from», «username» y «password». Las 2 primeras serán vuestra dirección de email, la que habéis creado para priebas. La tercera es la contraseña para acceder a ese correo, os recomiendo que no uséis la misma contraseña que usáis en el día a día.
El punto donde se envía el email es la línea 46, donde hacemos «e.enviar». Si queréis que aparezca un titulo o mensaje diferente, lo podéis cambiar ahí. Ahora ya podemos ejecutar nuestro programa, con el botón «play» o ctrl+F11.

Resultado final
Y aquí tenemos el resultado! El primer mensaje enviado desde nuestra propia aplicación.
En remitente pone «yo» porque hemos enviado el email a la misma cuenta de pruebas, si queréis podéis probar a enviarlo a una cuenta diferente y veréis que igualmente llega.

Entrando en el mensaje, podemos ver a fecha y hora de envío y el cuerpo del mensaje.

Y hasta aquí el artículo de hoy! Espero que os haya sido interesante, y cualquier duda son bienvenidos los comentarios!
Hasta la próxima!
material para el artículo
Emails.java (click para descargar)
Librería Jakarta Mail (click para descargar)
Adr M
En la imagen subes la libería jakarta pero en la última imagen se ve que usaste javax que fue eliminada para java 9 por eso solo compila en java 8 para abajo.
Kevin Larriega
Me sale este error
SEVERE:
java.lang.Error: Unresolved compilation problems:
Session cannot be resolved to a type
Session cannot be resolved
MimeMessage cannot be resolved to a type
MimeMessage cannot be resolved to a type
InternetAddress cannot be resolved to a type
Message cannot be resolved to a variable
Transport cannot be resolved to a type
MessagingException cannot be resolved to a type
at login.sendEmailControll.enviarEmail(sendEmailControll.java:65)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.zkoss.zk.ui.select.Selectors$ComposerEventListener.onEvent(Selectors.java:687)
at org.zkoss.zk.ui.AbstractComponent.onEvent(AbstractComponent.java:3184)
at org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:3154)
at org.zkoss.zk.ui.AbstractComponent.service(AbstractComponent.java:3096)
at org.zkoss.zk.ui.impl.EventProcessor.process(EventProcessor.java:138)
at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.process0(EventProcessingThreadImpl.java:545)
at org.zkoss.zk.ui.impl.EventProcessingThreadImpl.run(EventProcessingThreadImpl.java:470)
Trabajo con un framework zk, espero que eso no sea el problema
Jordi Escobar Roig
Hola Kevin
ese frameword (zk) no lo he usado nunca. De todas formas el error parece de compilación, creo que tu entorno de desarrollo (Eclipse?) no está reconociendo las librerías de jakarta. Es muy raro que no te reconozca todo eso, Session, MimeMessage, InternetAddress… Todas son de las librerías de Jakarta.
Si quieres probar que no sea el framework (zk) podrías hacer un «main» puro y duro, y usar ahí las librerías de Jakarta Mail.
Bueno espero haberte dado una pista, y gracias por escribir!
Enrique
Hola
Gracias por el código, lo ejecute con una jvm 1.8.0_241 y la librería que compartiste , me da el siguiente error
javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Sabrás que podrá generar este error ?
Desde ya gracias por tu aporte .
Jordi Escobar Roig
Hola Enrique
puede ser por el servidor de correo que estas usando como servidor «saliente», el que envia los mensajes. Yo lo he probado con uno de Gmail, si puedes hazte una cuenta de prueba tipo «pruebas.tomcat@gmail.com» o similar. Eso del TLS tiene que ver con la seguridad de la conexión que se establece entre el cliente (la libreria jakarta) y el servidor (gmail en este caso).
Lo dicho, a ver si con una cuenta de Gmail lo solucionas. Ya nos dirás que tal va, un saludo!
Luis
Me da un error y no encuentro el por que 🙁
java.lang.NoClassDefFoundError: com/sun/activation/registries/LogSupport
Jordi Escobar Roig
Hola Luis
el ejemplo que yo hice usa la versión 1.8 del jdk, con la versión 12 también me dio problemas. En las nuevas versiones han eliminado algunas clases, entre ellas LogSupport y varias más que Jakarta Mail necesita. Por eso te recomentaría que uses la 1.8.
Ya me dirás si te funciona, un saludo
Roman
Muchas gracias Jordi
la librería Javax.mail.jar ya no me funcionaba. daba error
Gracias
Jordi Escobar Roig
Hola Román
He tenido problemas parecidos a tí, me sucedió al instalar la versión 13 del JDK. Si lo pruebas con la 1.8 (que todavía se utiliza, y mucho) creo que te funcionará.
Bueno ya me dirás, y gracias por escribir!
gemma
sin gustarme la programación y reconociendo que muchas cosas no las entiendo porque soy inexperta, es una exposición muy bien explicada.. gracias Jordi
Jordi Escobar Roig
Gracias Gemma! Me alegro que te haya gustado 🙂