Cómo enviar correo electrónico con Java a través de GMail
Menú de navegaciónMenú
Categorías

La mejor forma de Aprender Programación online y en español www.campusmvp.es

Cómo enviar correo electrónico con Java a través de GMail

Imagen ornamental

Muchas aplicaciones que vas a desarrollar necesitarán enviar algún correo electrónico que otro de vez en cuando. Si necesitas hacer muchos envíos es mejor recurrir a servicios especializados, como por ejemplo Sendgrid o Mailgun, pero si lo único que quieres es poder enviar un correo muy de vez en cuando (por ejemplo, para un formulario de contacto en tu web o cuando se produzca un error), entonces puedes recurrir a soluciones más "rupestres" como la que te vamos a contar.

Precisamente por esta necesidad, una de las preguntas más frecuentes que se ven en foros sobre envío de correo es ¿cómo envío correo desde Java usando mi actual cuenta de GMail?.

La manera más sencilla es usando la API de JavaMail, pensada para enviar correo a través de SMTP a través de cualquier servidor.

Lo que ocurre es que GMail es un poco especial para esto, ya que por defecto no permite la conexión directa mediante usuario y clave a sus servidores de envío.

El motivo es que dispone de una API oficial para conectarse mediante la cuenta de Google y autenticar al usuario antes de enviar. Pero si queremos hacer uso del servidor SMTP para un envío directo, todavía podemos hacerlo.

Permitir aplicaciones "menos seguras"

Este eufemismo es el que utiliza Google para referirse a aplicaciones que, en lugar de usar la API de seguridad de Google y sus tokens, utilizan la vieja pareja "usuario-clave" para acceder al servicio.

Es un ajuste que está en la zona de seguridad de tu cuenta de Google, en la parte de abajo del todo de la sección de autenticación, pero existe también un acceso directo a este ajuste en exclusiva:

Interfaz de selección para permitir aplicaciones menos seguras

Si no lo marcas, cuando intentes enviar correo a través del servidor SMTP de GMail obtendrás el error:

"The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required"

Pero una vez cambiado este ajuste ya podrás utilizar sin problema la funcionalidad que te explicamos a continuación.

Nota: marcando esta funcionalidad se supone que tu cuenta está menos segura ya que ciertas aplicaciones no pasarían por la API de Google y sus tokens de autenticación. Y es cierto. Pero por otro lado si pierdes la clave de tu cuenta tendrás un problema de todos modos. Simplemente, si activas esta opción asegúrate de que guardas las credenciales a buen recaudo, y desde luego no las pongas en tu código y las distribuyas con tu aplicación, pues entonces seguro que las pierdes.

Enviar email a través de servidores SMTP con Java

Como decíamos antes, lo primero que tienes que asegurarte de que tienes la API de JavaMail disponible. Si tienes J2EE instalado, entonces no tienes que hacer nada pues ya dispones de dichas clases. En caso de no usar J2EE puedes descargarte los .jar y añadirlos como dependencias a tu proyecto si utilizas un IDE como NetBeans, o bien asegurarte de que los tienes en el classpath en caso de no utilizar IDE alguno.

Una vez hecho podemos definir una función como esta:

private static void enviarConGMail(String destinatario, String asunto, String cuerpo) {
    // Esto es lo que va delante de @gmail.com en tu cuenta de correo. Es el remitente también.
    private String remitente = "nomcuenta";  //Para la dirección nomcuenta@gmail.com

    Properties props = System.getProperties();
    props.put("mail.smtp.host", "smtp.gmail.com");  //El servidor SMTP de Google
    props.put("mail.smtp.user", remitente);
    props.put("mail.smtp.clave", "miClaveDeGMail");    //La clave de la cuenta
    props.put("mail.smtp.auth", "true");    //Usar autenticación mediante usuario y clave
    props.put("mail.smtp.starttls.enable", "true"); //Para conectar de manera segura al servidor SMTP
    props.put("mail.smtp.port", "587"); //El puerto SMTP seguro de Google

    Session session = Session.getDefaultInstance(props);
    MimeMessage message = new MimeMessage(session);

    try {
        message.setFrom(new InternetAddress(remitente));
        message.addRecipient(Message.RecipientType.TO, destinatario);   //Se podrían añadir varios de la misma manera
        message.setSubject(asunto);
        message.setText(cuerpo);
        Transport transport = session.getTransport("smtp");
        transport.connect("smtp.gmail.com", remitente, clave);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
    }
    catch (MessagingException me) {
        me.printStackTrace();   //Si se produce un error
    }
}

Que se encargará de hacer los envíos. Luego podemos llamarla desde cualquier lugar de la siguiente manera:

public static void main(String[] args) {
    String destinatario =  "alguien@servidor.com"; //A quien le quieres escribir.
    String asunto = "Correo de prueba enviado desde Java";
    String cuerpo = "Esta es una prueba de correo...";

    enviarConGMail(destinatario, asunto, cuerpo);
}

Lo que hará que se envíe un mensaje a la dirección especificada con el asunto y el cuerpo que hayamos indicado.

Importante: nunca deberías incluir el nombre de usuario y la clave de la cuenta que usas para enviar, directamente en el código, puesto que el Bytecode es muy fácil de desofuscar y cualquiera podría verlos. En el caso de una aplicación web es mejor que los guardes externamente, en un archivo de configuración en el servidor, lejos del alcance de los visitantes. En una aplicación de escritorio lo mejor sería que solicitases esos datos a cada usuario y los guardases de manera local, pero nunca en el código.

campusMVP campusMVP es la mejor forma de aprender a programar online y en español. En nuestros cursos solamente encontrarás contenidos propios de alta calidad (teoría+vídeos+prácticas) creados y tutelados por los principales expertos del sector. Nosotros vamos mucho más allá de una simple colección de vídeos colgados en Internet porque nuestro principal objetivo es que tú aprendas. Ver todos los posts de campusMVP

No te pierdas ningún post

Únete gratis a nuestro canal en Telegram y te avisaremos en el momento en el que publiquemos uno nuevo.

Archivado en: Lenguajes y plataformas

Agregar comentario