Panama Hitek Logo
Panama Hitek Logo

JavaMail: Enviar correos electrónicos desde Java

Para este post estaremos estudiando el uso de la librería JavaMail en un sencillo proyecto con una aplicación que contará con un par de ventanas desde las cuales se escribirá un mensaje y será enviado a una dirección de correo electrónico.

El lenguaje de programación Java es, sin duda, uno de los más completos y poderosos del mundo. Podríamos asegurar que, cualquier posibilidad que nos imaginemos es posible lograrla en Java.

Hoy traigo para ustedes la librería JavaMail (click para descargar), la cual permite enviar y recibir correos electrónicos desde Java.

Lo que haremos será crear un proyecto con una clase y dos frames, en los cuales se colocará la ventana «LogIn» donde se introducirá el correo electrónico y la contraseña del correo electrónico que se va a usar (preferiblemente, Gmail) y la ventana donde estarán los campos para el destinatario, asunto y mensaje.

Sin título-2

Sin título-3 copia
Ventana LogIn
JavaMail
Ventana que contendrá el mensaje a enviar

Ahora vamos con la programación. Primero la clase JavaMail. Aquí solo se necesita instanciar la ventana LogIn para que cuando se inicie la ejecución lo primero que suceda es que se pida el usuario y la contraseña de lo que será la cuenta que enviará el correo electrónico.

Netbeans

En la ventana LogIn, al presionar el botón Aceptar se guardará el contenido del jTextField y del jPasswordField donde está el usuario y la contraseña, respectivamente.

Sin título-4

 

El botón Cancelar hará que la ventana se cierre y se pare la ejecución.

Se ha instanciado el jFrame con el contenido del mensaje a través del objeto ventana, lo que permite llamar las variables Username y PassWord, que fueron declaradas como variables públicas y estáticas. Veamos la declaración de variables y lo que necesitamos importar desde la librería JavaMail a la clase Window.

Sin título-5

 

Vemos que solo se necesita declarar Username y PassWord como variables públicas y estáticas ya que serán las únicas cuyo valor será modificado por otras clases. Las otras variables contendrán el mensaje a enviar, el destinatario y el «asunto» del mensaje.

Ahora veamos la programación de los botones y algunas propiedades que se deben setear para que el TextArea funcione como queremos.

Sin título-6

 

Aquí es donde se empieza a utilizar la librería JavaMail. Vamos con el método SendMail. Es el que hace posible que se envíe el correo. Basta con copiar y pegar el siguiente código.

 

Aquí se muestra la imagen de cómo debería quedar:

Sin título-8

Con esto estamos listos para ejecutar la aplicación y enviar correos electrónicos.

Si desea descargar el archivo que contiene el proyecto de Netbeans utilizado para este post, lo puede descargar directamente de aquí:

Descargar Proyecto Netbeans

Por último, un video donde se muestra el programa funcionando. 

Si queda alguna duda sobre el funcionamiento de este proyecto, no duden en preguntar en los comentarios.

Saludos.

 

Antony García González
Antony García González
Ingeniero Electromecánico, egresado de la Universidad Tecnológica de Panamá. Miembro fundador de Panama Hitek. Entusiasta de la electrónica y la programación.

Posts relacionados

20 COMENTARIOS

  1. hola que tal, estoy haciendo un sistema y utilice su código para enviar correos, pero al presionar el botón enviar me marca el siguiente error:

    Exception in thread «AWT-EventQueue-0» java.lang.RuntimeException: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 587;

    nested exception is:

    java.net.SocketException: Permission denied: connect

    por favor necesito terminarlo, espero su respuesta gracias.

  2. el proyecto sale sin errores pero cuando envío el correo a una cuenta de gmail me saltan muchos errores, me dice que el puerto no es el correcto

  3. Cordial saludo!

    Tengo problema con este programa en java, el cual me genera unos errores en el archivo PacienteControl.java, si alguien me puede ayudar, le agradecería muchísimo..!

    package controlador;

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

    public class PacienteControl implements ActionListener
    {
    vista.RegPacienteInternalFrame pacienteVista;
    modelo.Paciente pacienteModelo;
    modelo.GestorPaciente gestorPacienteModelo;

    public PacienteControl (vista.RegPacienteInternalFrame pacienteVista)
    {
    this.pacienteVista = pacienteVista;
    gestorPacienteModelo= new modelo.GestorPaciente();

    }

    @Override
    public void actionPerformed(ActionEvent e) {
    if(e.getSource().equals(pacienteVista.RegistrarBtn))
    {
    String identificacion=pacienteVista.IdentificacionTxt.getText();
    String nombres=pacienteVista.NombresTxt.getText();
    String apellidos=pacienteVista.ApellidosTxt.getText();
    SimpleDateFormat formato = new SimpleDateFormat («dd/MM/yyyy»);
    String fechaNacimiento=formato.format(pacienteVista.FechaNacimientoDtc.getDate());
    String sexo=null;

    if(pacienteVista.MasculinoOpt.isSelected())
    sexo=»m»;
    else
    sexo=»f»;
    pacienteModelo=new modelo.Paciente(identificacion,nombres, apellidos,fechaNacimiento, sexo);
    gestorPacienteModelo.registrarPaciente (pacienteModelo);
    }
    if(e.getSource().equals(pacienteVista.NuevoBtn))
    {
    pacienteVista.IdentificacionTxt.setText(null);
    pacienteVista.NombresTxt.setText(null);
    pacienteVista.ApellidosTxt.setText(null);
    pacienteVista.FechaNacimientoDtc.setDate(null);
    pacienteVista.MasculinoOpt.setSelected(false);
    pacienteVista.FemeninoOpt.setSelected(false);
    pacienteVista.IdentificacionTxt.requestFocus();

    }
    }
    }

  4. Hola!, tengo una duda, tengo un sitio que manda correos electrónicos , mi pregunta es al momento de enviar el correo pido al usuario capturar su CORREO y CONTRASEÑA, habría forma de autentificar estos datos antes de enviar el correo en si?.
    Me gustaría que al momento de ya capturar todo y empieza a funcionar la clase, y detectara que el CORREO y/o CONTRASEÑA, no son los correctos devuelva un error! y no siga su proceso!

  5. La duda es la siguiente: como verifico si me contestan el correo, porque se pierde trazabilidad, es decir yo envio el email ejecuto el saveChange para poder recuperar el Message-id, pero el Message-id que obtengo del header es distinto al que llega a la cuenta de destino con lo que aunque me respondan pierdo la trazabilidad porque soy incapaz de relacionar la respuesta con el correo original.

    ejemplo de message-id
    y llega algo como esto

    es decir coincide a la derecha del @ pero a la izquierda lo cambia, con lo que no tengo forma de saber a cual me contesta porque he perdido el seguimiento, porque modifica el message-id? (no es el servidor de destino, porque tanto a gmail como a hotmail llega el mismo message id, puede ser que el servidor smtp este haciendo algo que no debe? de ser asi, al enviar lo realizco mediante Transport.send(message) es formato mime multipart

    Y se supone que al hacer el send lo hace mi servidor smtp con lo que el message id es el que el me retorna (guarda en el mensaje cuando se llama a saveChange.

    • Bueno, debo decir que cuando escribí este post no profundicé demasiado en el tema y el API tampoco estaba tan trabajada como lo está hoy. Las cosas han cambiado, el propio lenguaje Java ha cambiado y ahora quizás es mucho más fácil hacer cosas que antes. Habría que investigar un poco y talvez actualizar este post o escribir uno nuevo.

  6. Si quisiera enviar un correo pero es de tipo empresarial, osea, a través de outlook, que debo cambiar en el codigo ya que según estuve leyendo el puerto puede ser el mismo pero aun así no me funciona. ya intenté cambiando la linea que contiene el host pero no me funciona

  7. hola, me tiro un error de:
    Exception in thread «AWT-EventQueue-0» java.lang.NoClassDefFoundError: javax/activation/DataHandler
    at javamail.Window.SendMail(Window.java:37)
    at javamail.Window.jButtonEnviarActionPerformed(Window.java:189)
    at javamail.Window.access$000(Window.java:13)
    at javamail.Window$2.actionPerformed(Window.java:97)
    la linea 37 es justo despues del try en lo que es el Mime:
    try {

    Message message = new MimeMessage(session);
    message.setFrom(new InternetAddress(Username));
    message.setRecipients(Message.RecipientType.TO,
    InternetAddress.parse(To));
    message.setSubject(Subject);
    message.setText(Mensage);
    Lo q busque del error NoClassDefFoundError es como q compila pero cuando lo ejecuto no encuentra el archivo de clase.Prove cambiando las api JavaMail 15 por casa y 16 pero sigue el mismo error.
    Tambien descargue el que subiste pero me sigue tirando el mismo error.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí

Post relacionados