Como enviar un email en Java con la API JavaMail

Como enviar un correo electronico con Java usando la API JavaMail. Desde hace tiempo estaba pensado en exponer algo respecto a este tema y por fin me decidi a hacerlo. El ejemplo en si es muy sencillo pero util si lo necesitas usar inmediatamente.

Herramientas que necesitas

Necesitas principalmente dos cosas:

  • Libreria JavaMail.
  • libreria JAF ( JavaBeans Activation Framework ).

Como observas, te e puesto un link a la pagina de descarga de cada libreria, esa es la que he utilizado y que a la fecha me ha funcionado. Lo que debes hacer es bajarte los .zip, poner todos los archivos .jar juntos y agregarlos a la variable de entorno CLASSPATH de tu sistema operativo. Si no te quieres molestar en entrar a la pagina a continuacion yo ya los he bajado y a continuacion te dejo el link de descarga directa de la libreria JavaMail que contiene los JAR: dns.jar, imap.jar, mail.jar, mailapi.jar, pop3.jar, smtp.jar, la libreria JAF contiene un unico jar activation.jar.

Sigamos con lo interesante…

El codigo fuente

A continuacion pego el codigo fuente para el envio de el correo electronico que por cierto es muy corto. Sino fuera por la sencilla GUI que e creado….

/*
	Descripcion: Sencillo ejemplo de como enviar un Email con la libreria JavaMail
			a travez de una interfaz grafica.
	Author: Gonzalo Silverio    gonzasilve@gmail.com
	Archivo:  FrmVentanaMail.java
	Fuente:		https://gonzasilve.wordpress.com/
 **/
 
import javax.swing.*;
import java.awt.*;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import java.util.Properties;

//Para manejo de JavaMail
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class FrmVentanaMail extends JFrame {

	//Para el cuadro de dialogo de Opciones
	JPanel pnlServidor;
	JPanel pnlBotones;
	JPanel pnlRemitente;
	JPanel pnlPasswordRemitente;
	JPanel pnlDestino;
	JPanel pnlAsunto;
	JPanel pnlMensaje;
	
	JLabel lblServidor; 	JTextField jtfServidor;
	
	JLabel lblRemitente; 	JTextField jtfRemitente;	JPasswordField jpfPasswordRemitente;
	JLabel lblDestino; 	JTextField jtfDestino;
	JLabel lblAsunto; 	JTextField jtfAsunto;
	JLabel lblMensaje; 	JTextArea jtaMensaje;
	
	JButton btnEnviar;
	JButton btnCancelar;
	
	public FrmVentanaMail(String strTitulo, int i_ancho, int i_alto ) {
		this.setTitle(strTitulo);
    this.setSize(i_ancho,i_alto);    
    this.setLocationRelativeTo(null);

		this.setResizable(false);
		
		Box boxPrincipal = Box.createVerticalBox();
		crearCamposVentana();
		crearBotones();
		boxPrincipal.add(Box.createVerticalStrut(15));
		boxPrincipal.add(pnlServidor);
		boxPrincipal.add(Box.createVerticalStrut(15));
		boxPrincipal.add(pnlRemitente);
		boxPrincipal.add(Box.createVerticalStrut(15));
		boxPrincipal.add(pnlDestino);
		boxPrincipal.add(Box.createVerticalStrut(15));
		boxPrincipal.add(pnlAsunto);
		boxPrincipal.add(Box.createVerticalStrut(15));
		boxPrincipal.add(pnlMensaje);
		boxPrincipal.add(Box.createVerticalStrut(15));
		boxPrincipal.add(pnlBotones);
		
		add(boxPrincipal);
		
		btnCancelar.addActionListener( new ActionListener() {			
				public void actionPerformed(ActionEvent evt) {
					//dispose();
					System.exit(0);
				}
			}
		);
		
		btnEnviar.addActionListener( new ActionListener() {			
				public void actionPerformed(ActionEvent e) {
					if(enviarEmail() ) {
						JOptionPane.showMessageDialog(null,"Mensaje enviado!");
						jtaMensaje.requestFocus(true);
					} else {
						JOptionPane.showMessageDialog(null,"Por el momento NO SE PUDO ENVIAR el mensaje.");
					}
					
				}			
			}			
		);
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);	
	}
	
	private void crearCamposVentana() {
		Box boxServidor =  Box.createHorizontalBox();
		lblServidor = new JLabel("Servidor");
		jtfServidor = new JTextField("smtp.gmail.com",15);		
		boxServidor.add(Box.createHorizontalStrut(15));
		boxServidor.add(lblServidor);
		boxServidor.add(Box.createHorizontalStrut(20));
		boxServidor.add(jtfServidor);
		pnlServidor = new JPanel(new FlowLayout(FlowLayout.LEFT));
		pnlServidor.add(boxServidor);
		
		//Remitente
		Box boxRemitente =  Box.createHorizontalBox();
		lblRemitente = new JLabel("<html><font color='#0000FF'>Remitente</font></html>");
		jtfRemitente = new JTextField("gonzasilve@gmail.com",15);
		jpfPasswordRemitente =  new JPasswordField(15);
		jpfPasswordRemitente.setToolTipText("Escriba el password de este remitente");
		boxRemitente.add(Box.createHorizontalStrut(15));
		boxRemitente.add(lblRemitente);
		boxRemitente.add(Box.createHorizontalStrut(20));
		boxRemitente.add(jtfRemitente);
		boxRemitente.add(Box.createHorizontalStrut(5));
		boxRemitente.add(jpfPasswordRemitente);
		pnlRemitente = new JPanel(new FlowLayout(FlowLayout.LEFT));
		pnlRemitente.add(boxRemitente);
	
		//Destino
		Box boxDestino =  Box.createHorizontalBox();
		lblDestino = new JLabel("<html><font color='#0000FF'>Destino</font></html>");
		jtfDestino = new JTextField("gonzasilve@hotmail.com",15);
		jtfDestino.setToolTipText("Puede escribir varios destinatarios separados con coma");
		boxDestino.add(Box.createHorizontalStrut(15));
		boxDestino.add(lblDestino);
		boxDestino.add(Box.createHorizontalStrut(20));
		boxDestino.add(jtfDestino);
		pnlDestino = new JPanel(new FlowLayout(FlowLayout.LEFT));
		pnlDestino.add(boxDestino);			
			
		//Asunto
		Box boxAsunto =  Box.createHorizontalBox();
		lblAsunto = new JLabel("<html><font color='#0000FF'>Asunto</font></html>");
		jtfAsunto = new JTextField("Test JavaMail",15);		
		boxAsunto.add(Box.createHorizontalStrut(15));
		boxAsunto.add(lblAsunto);
		boxAsunto.add(Box.createHorizontalStrut(20));
		boxAsunto.add(jtfAsunto);
		pnlAsunto = new JPanel(new FlowLayout(FlowLayout.LEFT));
		pnlAsunto.add(boxAsunto);		
			
		//Mensaje
		Box boxMensaje =  Box.createHorizontalBox();
		lblMensaje = new JLabel("<html><font color='#0000FF'>Mensaje</font></html>");
		jtaMensaje = new JTextArea("Mensaje desde JavaMail",5,30);
		jtaMensaje.setLineWrap(true);
		JScrollPane jspScrollMsg = new JScrollPane(jtaMensaje);

		jtaMensaje.setAutoscrolls(true);
		boxMensaje.add(Box.createHorizontalStrut(15));
		boxMensaje.add(lblMensaje);
		boxMensaje.add(Box.createHorizontalStrut(20));
		boxMensaje.add(jspScrollMsg);
		pnlMensaje = new JPanel(new FlowLayout(FlowLayout.LEFT));
		pnlMensaje.add(boxMensaje);
	}
	
	private void crearBotones() {
		btnEnviar = new JButton("Enviar email");
		btnCancelar = new JButton("Cancelar");
		Box boxBotones = Box.createHorizontalBox();
		boxBotones.add(btnEnviar);
		boxBotones.add(Box.createHorizontalStrut(25));
		boxBotones.add(btnCancelar);
		boxBotones.add(Box.createHorizontalStrut(25));
		pnlBotones = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		pnlBotones.add(boxBotones);
				
	}
	
	private void mostrar() {
		setVisible(true);
	}
	
	//Devuelve true en caso de que se envie el email de manera correcta, o
	//devuelve false si no se pudo enviar el email
	private boolean enviarEmail() {
    try
    {
        // Propiedades de la conexión
        Properties props = new Properties();
        props.setProperty("mail.smtp.host",  "smtp.gmail.com");
        props.setProperty("mail.smtp.starttls.enable", "true");
        props.setProperty("mail.smtp.port", "587");
        props.setProperty("mail.smtp.auth", "true");

        // Preparamos la sesion
        Session session = Session.getDefaultInstance(props);
				
	//Recoger los datos
	String str_De 		= jtfRemitente.getText();
	String str_PwRemitente 		= jpfPasswordRemitente.getText();				
	String str_Para 	= jtfDestino.getText();
	String str_Asunto = jtfAsunto.getText();
	String str_Mensaje = jtaMensaje.getText();
	//Obtenemos los destinatarios
	String destinos[] = str_Para.split(",");
				
        // Construimos el mensaje
        MimeMessage message = new MimeMessage(session);
        
        message.setFrom(new InternetAddress( str_De ));

	//Otra forma de especificar las direcciones de email 
	//a quienes se enviar el correo electronico
	//Forma 1
        //Address [] receptores = new Address []{
	//      new InternetAddress ("fuerenio@gmail.com"),
	//      new InternetAddress ("gonzasilve@gmail.com")
	//  };
	//Forma 2
	//  Address [] receptores = new Address []{
	//      new InternetAddress ( str_De )
	// };
	//Forma 3
        Address [] receptores = new Address [ destinos.length ];
        int j = 0;
	while(j<destinos.length){					
		receptores[j] = new InternetAddress ( destinos[j] ) ;					
		j++;				
	}

        
        //receptores.
        message.addRecipients(Message.RecipientType.TO, receptores);        
        message.setSubject( str_Asunto );        
        message.setText( str_Mensaje );
            
        // Lo enviamos.
        Transport t = session.getTransport("smtp");
        t.connect(str_De, str_PwRemitente);
        t.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
				
        // Cierre de la conexion.
        t.close();
        return true;
    }
    catch (Exception e)
    {
        e.printStackTrace();
        return false;
    }		
	}
	
	public static void main(String gonzi[]) {
		FrmVentanaMail prueba1 = new FrmVentanaMail("Envio de email con JavaMail", 500, 400);
		prueba1.mostrar();
	}
	
}

En si no hay mucho que explicar, el metodo mas importante de la clase anterior es enviarEmail() pues es el que toma los datos de las cajas de texto y los configura como parametros para JavaMail y envia el mensaje escrito, usando el email remitente a los emails destino. Si observas éste devuelve un valor booleano para poder determinar el mensaje que se le muestra al usuario despues de que pulsa el boton Enviar email.

Pantallas del ejemplo

A continuación la pantalla que se dibuja al ejecutar el código anterior (e rellenado algunos campos):
GUI para enviar email con JavaMail

Si el email se envió correctamente aparece el siguiente mensaje:
Envio exitoso con JavaMail

El email que le llega al email destino es el siguiente:
Email recibido, fue enviado desde JavaMail

En caso de dudas, ó si te gusto el ejemplo te invito a que me dejes un comentario (me motivas a escribir mas). Si gustas tener el codigo por fa, dejame un comentario y te lo envio a la brevedad.

Hasta pronto.

Acerca de gonzasilve
Freelance Web Developer.

37 Responses to Como enviar un email en Java con la API JavaMail

  1. estefany dice:

    hola q tal:
    Estuvo muy interesante la explicación que diste me intereso tanto que quisiera tener el programa te envió mi correo nifaluna@hotmail.com porfavor.

    Saludos

  2. buenas tardes, tendras idea de porque el codigo funciona perfectamente con la red de mi casa pero no con la del trabajo?
    En el trabajo desactive firewall y antivirus y aun no funciona.
    Uso telnet smtp.gmail.com 465 y me comenta que no es posible establecer conexion. Que puedo hacer para acceder a ese puero su ya lo abri en el firewall tambien y nada?

  3. paul zarsa dice:

    paulzarsa@gmail.com xfa me podrias pasar tu codigo

  4. paul zarsa dice:

    pásame tu código xfabor

  5. Darwin Gonzalez dice:

    Podrias pasarme el codigo lo necesito de urgencia Gracias mi correo: futudarwin92@hotmail.com

  6. Nayeli López Juarez dice:

    Me agrado tu código, es muy interesante, podrías enviármelo ileyan_480@hotmail.com… Gracias!

  7. Aida dice:

    Si me pudiera sproporcionar el poryecto te lo agradeceria mucho, ya lo cree pero me marca unos errores, si pudieras enviarmelo al correo lily_james31@hotmail.com

  8. Ricard dice:

    Hola Gonzalo, me parece muy bueno tu ejemplo, ¿podrías envirme el código por email? te lo agradeceria muchíssimo 😉

  9. Felipe dice:

    Hola. Muy buen ejemplo. ¿Me puedes mandar el proyecto completo para adaptarlo a un programa que tengo entre manos? Muchas gracias maestro.
    lipevsc@hotmail.com

  10. Laura dice:

    Super!! que buen ejemplo…muchísimas gracias.

  11. Luis Guacán dice:

    Muy bueno, me puedes compartir tu codigo y si tienes mas informacion mucho mejor.
    rg.alfa@gmail.com

  12. edwin dice:

    hola necesito el codigo para una materia de recuperacion de informacion me gustaria me enviaras el codigo gracias mi email es: edu.escobedo88@gmail.com gracias

  13. raquel dice:

    oye si me podrias mandar tu codigo.. oye y me marca un error en la paqueteria email.. porque agradeceria tu respuesta

  14. Gerbihc dice:

    Hola buenas días o como sea tu ejemplo se ve muy practico e interesante, me interesaría ver si podrías enviar tu proyecto del código para probarlo y analizarlo mas afondo por favor me lo puedes enviar a: gerbihc@gmail.com

    se agradecería demasiado

  15. Kary dice:

    Hola, me gustaría que me puedas ayudar, me marca un error al intentar conectarme con el servidor SMTP,

  16. Mario dice:

    Muy practico el envio de correo, buenisimo…
    por fa ayudame con el codigo

  17. Ariel Meneses Garcia dice:

    Hola buenos dias 😀 , se ve muy facil y sencillo de crear , lo vere y probare hoy mismo , te escribo par felicitarte por ayudarnos a los que vamos empezando . Ojala me envies este ejemplo a mi correo 🙂 .. ariel_lldm@hotmail.com . Gracias

  18. Rmbeltran dice:

    Parceros del foro ayudenme, yo ejecuto ese codigo y no me muestra el cuadro de dialogo para digitar, solo aparece la interface en blanco

  19. Miguel Dominguez dice:

    Muy bueno tu codigo, algo asi era lo que andaba buscando, si puedes mandarme el codigo a mi correo te lo agradeceria…. chabelosclub@hotmail.com

  20. Michael C. Trujillo Salinas. dice:

    Muy bueno, no se que es lo que estoy haciendo de malo acá en mi programa, todo esta igual al tuyo, ya que vengo revisando muchas paginas, pues lo que quiero es enviar correos desde una agenda que quiero hacer en java avisándome el cumpleaños de alguien en ese día. me parece que me falta algo pero no se que, bueno; buena suerte.

  21. eddy millan dice:

    muy interesante yo intente envio de correos en una aplicacion y solo me salen si son a gmail 😦
    en todo caso si puedes me envias el codigo haber que estoy haciendo mal
    emillan2@hotmail.com
    aproposito muy buen aporte gracias bro.

  22. Franklin Moya dice:

    Excelente codigo me podrias facilitar para ver si puedo implementarlo en zk framework

  23. Edwin León dice:

    Que mas amigo apóyame con el código, mi correo edwin_enrique88@hotmail.com

  24. onet dice:

    Gracias por el aporte, es muy bueno. Talvez me puedas enviar el código, mi correo es onel.turcios@gmail.com, t lo agradecería mucho

  25. jupaprada dice:

    bueno pos no he probado el codigo se ve interesante. pero tengo una pregunta. sirve para inplementarlo desde struts2 and spring? si es así podría regalarme el copdigo? de ante mano muchas gracias.
    juanpasto96prada@hotmail.com
    JUAN PALO PRADA

  26. brenda dice:

    hola me entereza muchisimo que me envies tu codigo. se puede???

  27. esta buenisimo, pero podrias enviar el codigo?? Gracias

  28. Olga dice:

    Hola Gonzalo esta muy padre el código tienes alguno donde también traiga adjuntos? O donde consultes desde una base de datos las direcciones?

    Saludos y Gracias por la información si me puedes enviar este código te agradeceré bastante.

    • gonzasilve dice:

      Nop por el momento no tengo algun ejemplo pero gracias por la sugerencia. Tratare de implementar esas dos opciones.

      Te acabo de enviar este ejemplo que espero te sirva,

      Saludos!

  29. Andres dice:

    hey!! excelente tu codigo… desearia que me lo enviaras…me ayudarias mucho si llego a adaptarlo a mi proyecto…gracias de antemano

    • gonzasilve dice:

      Andres, te lo envie hace unos segundos; espero te sirva

      Saludos!

  30. luis angel dice:

    mandame el codigo paro y sirve en eclipse?

    • gonzasilve dice:

      Ok te Luis, te lo acabo de mandar,

      Saludos.

  31. Byron Illapa dice:

    Buenas Tardes sabes este codigo esta bien ser aposible que puedas enviarme el codigo del proyecto a fin de probarlo y adecuarlo ami solución.
    Gracias de Antemano…
    brodrigo8@hotmail.es

    • gonzasilve dice:

      Te lo enviare el fin de semana pues lo tengo en otra parte distinta a donde estoy.

      por lo pronto te mando Saludos.

  32. arturo dice:

    hola. estupendo codigo. es lo que necesitaba para terminar mi programa de encriptacion de mail. gracias. como puedo hacer para enviarlo desde hotmail?. porq solo se puede de gmail. responde porfavor

    • gonzasilve dice:

      ..te dejo un enlace la verdad no e investigado como hacerlo con hotmail. Saludos!

      http://stackoverflow.com/questions/3069966/connect-to-hotmail-with-javamail

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: