JavaMail y Gmail

Tras años creando aplicaciones Java para clientes ejecutándose sobre servidores poco o nada atendidos te das cuenta de lo importante que es la gestión de los registros (logs) de una aplicación. Especialmente cuando hay errores, por supuesto. Con el tiempo he ido desarrollando un mecanismo para recoger cualquier error y la máxima información de estado y enviarlo todo en un email a una dirección de correo de recogida de errores. Hay que ir con cuidado ya que la información que se envíe en este correo electrónico viajará muy probablemente sin protección o encriptación (que por otro lado sería una buena mejora).

Esta explicación viene para documentar un ejemplo de como utilizar una cuenta de gmail para enviar correos automatizados desde cualquier servidor y evitar problemas de relay, dominios, IPs fijas, etc.

Para ello partimos de la utilización de JavaMail en una aplicación Java cualquiera. La idea es enviar el mensaje utilizando directamente el servidor SMTP de Gmail mediante la validación con un usuario y contraseña. No muy seguro, pero para eso podemos utilizar una cuenta creada sólo para ese efecto.

public void run() throws MessagingException {  
       // init
       Properties props = new Properties();
       props.setProperty("mail.smtp.host","smtp.gmail.com");
       props.setProperty("mail.smtp.port","587");
       props.setProperty("mail.smtp.starttls.enable","true");
       props.setProperty("mail.smtp.auth","true");
       Session session = Session.getInstance(props, null);

       // message simple
       MimeMessage message = new MimeMessage(session);
       message.setSubject("Test Message");
       message.setFrom(new InternetAddress("remitente@dominio.com"));
       message.addRecipient(Message.RecipientType.TO, new InternetAddress("destinatario@otro.com"));
       message.setText("Test Message");

       // envio el mensaje estableciendo una conexión autentificada
       Transport t = session.getTransport("smtp");
       try {
           t.connect("remitente@dominio.com", "*****");
           t.sendMessage(msg, msg.getAllRecipients());
       } finally {
           t.close();
       }
   }

Este es el código más simplificado, sin gestión de errores ni concurrencia ni nada. Como parte de los artículos sobre Base ya publicaré código más elaborado.