Como mandar un email desde JAVA

En alguna ocasion  es necesario mandar un mail desde nuestro programa  desarrollado en JAVA ya sea con algun archivo adjunto o simplemente con un mensaje determinado.

Para esto existe una libreria llamada javamail, esta nos facilita mucho el trabajo por que trae las herramientas necesarias para enviar y recibir correo desde cualquier aplicacion en JAVA. sin embargo esta gran herramienta no viene incluida  con JAVA asi que toca  descargarla e instalar en el IDE o  a traves de la variable CLASSPATH (modo consola).

Para instalar esta libreria en Netbeans hacemos el siguiente procedimiento:

  1. Ubicamos la imagen, y damos click derecho, add library.
  2. Damos click en manage library
  3. Click en New Libray
  4. Le damos un nombre a nuestra nueva libreria
  5. Por ultimo damos click donde dice add JAR/folder y buscamos el jar de nuestra libreria en este caso el jar que descargamos de JavaMail.
  6. Listo, ya tendremos nuestra libreria instalada.

Algunas Aclaraciones

  • A la hora de ejecutar nuestro programa  debe tener instalada la libreria.
  • Muchos pensaran que de acuerdo al punto anterior, seria un programa muy ineficiente, sin embargo no es asi, ya que al generar el .JAR nuestro ide crea  una carpeta  llama lib que contiene todas las librerias que hayamos usado, eso si  donde se vaya a ejecutar nuestro JAR debe ir esta carpeta.
  • Otra opcion es que nuestro ejecutable lleve embebido la libreria,  esto ocasionaria un aumento en el tamaño. pero   seria totalmente portable nuestra aplicacion.

Implementacion

Teniendo nuestra libreria instalada para poder trabajar, empezaremos creando una nueva clase  en la cual  haremos todo el proceso de conección  y envio. antes de continuar debemos  tener unos datos claros:

  • Un servidor smtp. (Si usa gmail o hotmail, necesita un poco mas de trabajo, por que estos se conectan haciendo uso de SSL/TLS (Secure Sockets Layer), como todos saben este protocolo se basa en certificados digitales, asi que antes de conectarse se debe obtener el certificado).
  • Una cuenta en este servidor smtp (Login y Password)
  • El puerto del servidor smtp, por defecto es el 25, sin embargo por seguridad hay veces se cambia.

Empezamos con nuetsra clase primero importamos las librerias necesarias

import javax.activation.DataHandler;  //para enviar imagen adjunta
import javax.activation.FileDataSource; //para enviar imagen adjunta
import java.util.Properties;
import javax.mail.Message;
import javax.mail.BodyPart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart; //para enviar imagen adjunta
import javax.mail.internet.MimeBodyPart; //para enviar imagen adjunta

Ahora necesitamos tener los datos de la sesion para loguearnos en el servidor , para esto hacemos uso de la clase properties, ya que esta nos permite guardar parejas, es decir, asignandoles nombres y valor:

Properties datos= new Properties();
datos.setProperty(“mail.smtp.host”, “ip_servidor_smtp”);
datos.setProperty(“mail.smtp.starttls.enable”, “true”); //si usa TLS o no
datos.setProperty(“mail.smtp.port”, “puerto_del_servidor”);
datos.setProperty(“mail.smtp.user”, “usuario”);
datos.setProperty( “mail.smtps.auth “, “true “);
datos.put(“mail.debug”, “true”);  //para que nos muestre en detalle el proceso
datos.put(“mail.smtp.socketFactory.port”, “puerto_del_servidor”);

Teniendo los datos Nombres-valor listos creamos la sesion:

Session session = Session.getDefaultInstance(datos);
session.setDebug(true);

El siguiente paso es crear nuestro email, es decir el mensaje que va ir en el:

MimeMessage mensaje = new MimeMessage(session);
mensaje.setFrom(new InternetAddress(“usuario_server@dominio”)); //remitente
mensaje.addRecipient(Message.RecipientType.TO, new InternetAddress(“mamita@gmail.com”)); //destinatario
mensaje.setSubject(“Hola”);
mensaje.setText(“Un saludo desde RinconInformatico”);

Ya tenemos nuestro correo creado de forma correcta, solo nos queda mandarlo, para esto utilizamos utilizamos la clase Transport asi:

Transport t = session.getTransport(“smtp”);
t.connect(“usuario”, “password”);
t.sendMessage(message, message.getAllRecipients());

Hasta esta parte hemos ya hemos enviado el correo, un correo sencillo con solo texto, por ultimo debemos cerrar la conexion:

t.close();

Mandar Email con archivo adjunto

Hemos aprendido como mandar un mensaje  solo con texto, pero si lo que queremos es  mandar un correo con una imagen adjunta u otro archivo, debemos adiccionar  mas instrucciones. La sesion no cambia,   hacemos lo mismo que  se menciono arriba respecto a la sesion, sin embargo a la hora de componer el mensaje es donde viene el cambio:

BodyPart texto = new MimeBodyPart();
texto.setText(“hola adjunta esta la imagen”);
BodyPart archivo = new MimeBodyPart();
archivo.setDataHandler(new DataHandler(new FileDataSource(“imagen.jpg”)));

Hay que tener en cuenta que para poder enviar el archivo en este ultima linea se debe poner la ruta absoluta del archivo que se desea adjuntar, yo recomiendo  dejarla asi, de esta forma el buscara exactamente en la misma parte donde se ejecuto el JAR.

Tenemos  las dos partes de nuestro  correo: el texto y el adjunto, el siguiente paso es  unir las dos partes para poder enviarlo:

MimeMultipart correo = new MimeMultipart();
correo.addBodyPart(texto);
correo.addBodyPart(archivo);

Por ultimo construimos el correo con las dos partes:

MimeMessage mensaje = new MimeMessage(session);
mensaje.setFrom(new InternetAddress(“usuario_server@dominio”)); //remitente
mensaje.addRecipient(Message.RecipientType.TO, new InternetAddress(“mamita@gmail.com”)); //destinatario
mensaje.setSubject(“Hola”);
mensaje.setContent(correo);

Notese que la ultima linea no es el mensaje con setText, como en el anterior ejemplo, ya se le envia el correo con el adjunto que habiamos creado. Para enviarlo es de la misma forma usando la clase transport.

Para los que necesiten, en este link (Por razones de seguridad  no deje los datos del servidor smtp), pueden descargar un ejemplo que realice para un trabajo en esta semana de finales. Como pueden ver mandar email y recibir email es  algo muy sencillo con JavaMail, pero  no por ser sencillo es menos potente, con estas herramientas  se pueden hacer proyectos muy interesantes, he estado trabajando en algo, y creo que para estas vacaciones sacare una beta para  que ustedes lectores me den sus opiniones.

One Comment