JavaMail: Envía e-mails desde tu proyecto Java

25
153226

1. Introducción

JavaMail se trata de una librería desarrollada por SUN encaminada al envío de correos electrónicos directamente desde tu aplicación Java. El uso de ésta librería es muy sencillo pero detallaremos paso a paso como realizar la instalación y uso de ella.

2. Instalación

En primer lugar debemos realizar la descarga de la librería desde aquí.

La instalación de la librería para poder hacer uso de ella en nuestro proyecto se puede realizar de 2 maneras diferentes, o bien la importamos desde el entorno de desarrollo que estemos usando (en mi caso “Eclipse”) o bien modificamos el CLASSPATH del sistema.

  1. Importación de la librería con Eclipse:
    1. Accedemos a las propiedades del proyecto (Boton derecho → propiedades).
    2. Seleccionamos en el arbol de la izquierda la opción “Java Build Path”y la pestaña “libraries”.
    3. Entramos en la opción “Add external JARs”, buscamos el archivo “mail.jar” que se incluye dentro del archivo que nos acabamos de bajar.
  2. Importación de la librería en el CLASSPATH:

Abrimos una consola de comandos y tecleamos “set CLASSPATH=%CLASSPATH%;C:\javamail\mail.jar“ (sustituyendo la ruta por la vuestra correspondiente).

3. Clases y métodos básicos usados

  • Clase Properties: Ésta clase es la encargada de almacenar las propiedades de la conexión que vamos a establecer con el servidor de correo Saliente SMTP.
    • Método Put: Mediante éste método asignaremos las propiedades que necesitamos, como son:
      • Servidor SMTP.Valor booleano de habilitación
      • TLS.
      • Puerto SMTP
      • E-mail emisor del mensaje
      • Usuario de acceso al servidor
      • SMTP
      • Valor booleano de contraseña
      • requerida.
    • Método Get:Obtenciónde los parámetros anteriores ya guardados.
  • Clase Session: Será la clase encargada de manejar la sesión de usuario
    • Método GetDefaultInstance: e introduciremos la variable de la clase Properties que nos hemos creado anteriormente y ésta nos creará una sesión para dichas propiedades.
    • Método GetTransport: Indicaremos a éste método el protocolo de transporte a utilizar (en nuestro caso smtp).
  • Clase MimeMessage: Aquí formaremos el mensaje que deseamos enviar.
    • Constructor: Se le introduce al constructor la sesión sobre la que vamos a enviar el mensaje
    • Método SetFrom:Recibe como parámetro la dirección del emisor del mensaje de tipo InternetAddress.
    • Método AddRecipient: Recibe 2 parámetros, por un lado el tipo de receptor que vamos a especificar descritos en la clase Message.RecipientType (TO,CC,BCC). Como segundo parámetro le pasaremos igual que en el método anterior, una variable de la clase InternetAddress con la dirección del receptor.
    • Método SetSubject: Introducimos el asunto del mensaje como único parámetro
      en forma de String.
    • Método SetText: De igual forma que en el método anterior, introducimos el texto del mensaje en forma de String.
  • Clase Transport: Define los parámetros del protocolo de transporte. Para empezar, inicializaremos la variable obteniendo el tipo de protocolo de transporte de la clase session explicada anteriormente.
    • Método Connect: Se encarga de establecer la conexión con el servidor, introduciendo el nombre de usuario y contraseña (si es requerida).
    • Método SendMessage: Envía el mensaje que hemos creado anteriormente a los destinatarios especificados.
    • Método Close: Cierra la conexión.

4. Ejemplo básico

package com.autentia.training.javamail;

import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class EmailSenderService {
	private final Properties properties = new Properties();
	
	private String password;

	private Session session;

	private void init() {

		properties.put("mail.smtp.host", "mail.gmail.com");
		properties.put("mail.smtp.starttls.enable", "true");
		properties.put("mail.smtp.port",25);
		properties.put("mail.smtp.mail.sender","emisor@gmail.com");
		properties.put("mail.smtp.user", "usuario");
		properties.put("mail.smtp.auth", "true");

		session = Session.getDefaultInstance(properties);
	}

	public void sendEmail(){

		init();
		try{
			MimeMessage message = new MimeMessage(session);
			message.setFrom(new InternetAddress((String)properties.get("mail.smtp.mail.sender")));
			message.addRecipient(Message.RecipientType.TO, new InternetAddress("receptor@gmail.com"));
			message.setSubject("Prueba");
			message.setText("Texto");
			Transport t = session.getTransport("smtp");
			t.connect((String)properties.get("mail.smtp.user"), "password");
			t.sendMessage(message, message.getAllRecipients());
			t.close();
		}catch (MessagingException me){
                        //Aqui se deberia o mostrar un mensaje de error o en lugar
                        //de no hacer nada con la excepcion, lanzarla para que el modulo
                        //superior la capture y avise al usuario con un popup, por ejemplo.
			return;
		}
		
	}

}

Rub�n

Consultor Tecnol�gico

mailto:rgomez@autentia.com

25 COMENTARIOS

  1. Hola yo tube que cambiar la linea de codigo donde dice
    properties.put(\\\»mail.smtp.host\\\», \\\»mail.gmail.com\\\»);
    por
    properties.put(\\\»mail.smtp.host\\\», \\\»smtp.gmail.com\\\»);

    Saludos muy bueno el tutorial

  2. El asunto no me lo cambia. Me lo envia sin asunto siempre. Y tampoco puedo darle formato, como añadir algun salto de linea. AYUDA por favor

    Gracias

  3. Hola buenas recien estuve probando esta alternativa como solucion a las seguridades q ha implementado hotmail para recibir correos electronicos parece que ya no acepta mails de direcciones q no resuelvan direccion inversa como es mi caso ya que lo hago desde mi hogar con una ip dinamica y sin DNS hasta ahora todo bonito con este codigo el unico detalle; es que quisiera saber es por ke el mail.smtp.mail.sender no es entendido en el message.setFrom(new InternetAddress((String)properties.get(\\\»mail.smtp.mail.sender\\\»))); ya que el nombre que le asigno lo ignora y pone directamente el user…. en el remitente del mensaje q envio

    hasta ahora lo he difinido asi:
    INIT
    properties.put(\\\»mail.smtp.mail.sender\\\»,\\\»Jose\\\»);
    properties.put(\\\»mail.smtp.user\\\», \\\»jrivas02051985@gmail.com\\\»);

    y en el SENDMAIL
    message.setFrom(new InternetAddress((String)properties.get(\\\»mail.smtp.mail.sender\\\»))); ummm no lo toma en cuenta al momento de tomar el mensaje manda con el dato del user defrente… bueno espero poder obtener una respuesta de antemano gracias y ke pasen un buen dia

  4. Como estas Ruben muy bueno eltutoria desearia saber si me puedes ayudar como aplicar este codigo en netbean hay algun problema o la libreria es totalmente compatible…

  5. Hola, oye una pregunta, se podria hacer con algun otro servidor que no sea gmail???
    en dado caso de que si se pueda, como seria….. te lo agradeceria mucho si me ayudas con eso

    • Muy buen tutorial.

      Genere un gestor de envío de mail, mediante el uso de tareas programadas que envían diferentes tipos de mails, usando templates, pero muy buena pregunta la de Ingrid ya que guardo en una DB logs sobre mail enviado, tipo de template, remitente, destinatario, etc, sin embargo me seria útil saber cuando se envío correctamente o si el destinatario ya lo ha recibido para guardar esta información en mi tabla de logs

  6. hola alguien sabe como hacerle para cancelar el envio de email cuando se cumpla cierto tiempo de espera y no se ha enviado y avisarle al usuario??

  7. Hola, alguien sabe si es posible verificar de que el servidor tiene el mensaje enviado?, se me ocurre hacerle un query para saber si el mensaje está ahi. O si existe algún código para ello?. Saludos.

  8. codigo de la clase

    /*
    * To change this license header, choose License Headers in Project Properties.
    * To change this template file, choose Tools | Templates
    * and open the template in the editor.
    */
    package modelo;

    import java.util.Properties;
    import javax.mail.Message;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;

    /**
    *
    * @author erika franco
    */
    public class Email {

    public boolean enviarcorreo(String de, String clave,String para,String mensaje,String asunto){
    boolean enviado = false;
    try{

    String host=»smtp.gmail.com»;

    Properties prop=System.getProperties();

    prop.put(«mail.smtp.starttls.enable»,»true»);
    prop.put(«mail.smtp.host»,host);
    prop.put(«mail.smtp.user»,de);
    prop.put(«mail.smtp.password»,clave);
    prop.put(«mail.smtp.port»,587);
    prop.put(«mail.smtp.auth»,»true»);

    Session session=Session.getDefaultInstance(prop,null);
    MimeMessage message= new MimeMessage(session);

    message.setFrom(new InternetAddress(de));

    message.setRecipient(Message.RecipientType.TO, new InternetAddress(para));
    message.setSubject(asunto);
    message.setText(mensaje);

    System.out.print(message);

    Transport transport=session.getTransport(«smtp»);
    transport.connect(host,de,clave);

    transport.sendMessage(message, message.getAllRecipients());
    transport.close();
    enviado=true;
    System.out.print(enviado);

    }catch (Exception e){
    e.printStackTrace();

    }
    return enviado;

    }

    }

    codigo del resultado de la jsp del formulario index jsp

    <%
    Email email=new Email();
    String de=request.getParameter("de");
    String clave=request.getParameter("clave");
    String para=request.getParameter("para");
    String mensaje=request.getParameter("mensaje");
    String asunto=request.getParameter("asunto");

    boolean resultado= email.enviarcorreo(de, clave, para, mensaje, asunto);

    if(resultado){
    out.print("cooreo electronico correctamente enviado"+"nn"+" volver al index»);

    }else{
    out.print(«cooreo electronico no enviado»+»nn»+» volver al index»);

    }

    %>

  9. como puedo enviar mi correo con imagenes sin que me salga el mensaje de «Haga click para descargar imagenes. Para ayudarle …..» como si fuera un correo peligroso.

    Muchas

  10. Hola, muy buenas!!

    Estoy usando un código muy parecido a este para enviar mails desde un programa generado en Eclipse. Desde Eclipse funciona perfectamente, pero a la hora de ejecutar un .JAR con este programa me sale un error diciendo que el Provider es null.
    Agradeceria que alguien me ayudase ya que es un programa para mi trabajo, un saludo!!

  11. una consulta……necesito enviar notificaciones al correo de productos que se estan agotando….en que me puedo basar…para establecer el tiempo….de envio…cada que tiempo se puede enviar las notificaciones

  12. Que tal con todos, agradecería si me ayudan a agregar un archivo adjunto y si es posible agregar una imagen o una firma al mail, porfavor

  13. Hola, alguien puede ayudarme a corregir el error que me ha salido al implementar esta clase:

    ERROR: Could not convert socket to TLS
    …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.cer
    tpath.SunCertPathBuilderException: unable to find valid certification path to requested target

  14. hola una duda se puede cargar una imagen en el correo que envía el código? para ser mas exactos quiero mandar un correo el cual ya logre enviar, pero quiero que al momento de leerlo el usuario este tenga un formato especifico que tenga logo de la empresa mínimo

  15. mi correo se envia bien cuando uso eclipse. icluso usando puerto25. Mismo codigo que rubén. pero colgué mi proyecto en «hostignition», desde ahí el correo se envia pero no se recibe.He probado con diferentes puertos, 25, 587, 465 … Alguien tiene una pista de porque pasa esto ?
    Gracias.
    Marc Renobell.

  16. Hola soy un iniciado en esto de la programación y mi conocimiento es algo escaso peor en continuo crecimiento. He cogido este código para entenderlo y vamos trastear con él.
    Sabrías decirme por que me estará rompiendo en esta línea:
    t.connect((String)properties.get(«mail.smtp.user»), «***********»);

    En el control de excepcione he puesto:
    System.out.println(me.getMessage());

    Al ejecutar salta un mensaje que dice: null

    Y bueno gracias por tu magnifico trabajo

  17. la verdad que me tira un error de smtp, si alguiem me puede ayudar , para enviar el codigo

    Gracias

    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
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1907)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:666)
    at javax.mail.Service.connect(Service.java:295)
    at javax.mail.Service.connect(Service.java:176)
    at javax.mail.Service.connect(Service.java:196)

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad