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.
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.
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.
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.
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.
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public void SendMail() { Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "587"); Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(Username, PassWord); } }); 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); Transport.send(message); JOptionPane.showMessageDialog(this, "Su mensaje ha sido enviado"); } catch (MessagingException e) { throw new RuntimeException(e); } } |
Aquí se muestra la imagen de cómo debería quedar:
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í:
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.
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.
Que propiedad del boton es esa que le da esa apariencia lisa? porque normalmente los botones son un poco diferentes!!!
Depende del sistema operativo en el que se ejecuta el software
Tienes que navegar entre las propiedades del button, si mal no recuerdo es border, ya que por defecto los botones se ven algo brillosos por así decirlo.
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
Debes verificar los datos del server de gmail
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();
}
}
}
Agradecido! Funcionó perfectamente, lo estoy integrando a mis proyectos.
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!
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.
quiero saber los nombres de las variables de los botones
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
a mi no me funciono a la hora de mandar el mensaje me manda un error no se porque si tengo la librería
Posiblemente sea tu servidor de mail mal configurado
Quisiera saber de que es la variable «ventana»
un JFrame
En mi caso, no envia el correo y la consola no lanza ningun error
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.
Muchas gracias por el aporte, fácil y útil.
Gracias por adjuntar el proyecto, hace una gran diferencia!