domingo, 13 de abril de 2008

Usando Commons Email para Gmail y OpenCms

Este es un ejemplo sencillo de cómo usar la librería Commons Email para Gmail o Google Apps, y OpenCms.

Primero, para usar Commons Email con Gmail en general basta con concer los parámetros del SMTP de Gmail. El ejemplo que pongo a continuación es un fragmento de una aplicación en JSE-Swing que hice para una peque especial ^_^ . Lo que hace la aplicación es mandar un correo desde una cuenta de Sitio Libre (con Google Apps) a otra cuenta de Sitio Libre que a su vez está sincronizada con mi Blackberry, así que es una manera, veámoslo así, de enviar "SMS's gratuitos" colgándonos de la funcionalidad del Blackberry.

Previamente se carga un archivo properties con el nombre de usuario, el password y la cuenta de destino del email. El textArea donde viene el mensaje lleva por nombre jTextArea1. Las partes principales del envío del correo son:

SimpleEmail se = new SimpleEmail();

se.setTLS(true); //Gmail requiere TLS para el login

se.setSmtpPort(587);

se.setHostName("smtp.gmail.com");

se.setAuthentication(p.getProperty("remitente.usuario"), p.getProperty("remitente.password"));

se.setMsg(jTextArea1.getText());

InternetAddress ia = new InternetAddress();

ia.setAddress(p.getProperty("destino.direccion"));

Collection c = new ArrayList();

c.add(ia);

se.setTo(c);

se.setSubject("El subject va aqui...");

se.send();


Y yap. Como siempre disculpen el formato pero es culpa del pinche blogger. Si algo truena, nos mandará una EmailException así que tenemos que capturarla o aventarla y manejarla. ¿Por qué el InternetAddress y la Colección? El método setTo de Email/SimpleEmail solo acepta una colección, que debe contener elementos tipo InternetAddress.

Es importante destacar que en este caso, el Commons Email que utilizamos para poder ponerle TLS es la versión 1.1 . La 1.0 no tiene esta funcionalidad y eso puede hacernos ruido cuando queremos enviar un mail mediante OpenCms (que al menos en la versión 7.0.3, usaba el 1.0 para crear los CmsSimpleEmail y CmsHtmlEmail). A eso iré en un rato, no sin antes recordarles que para que Commons Email funcione bien, es necesario tener en nuestro classpath el mail.jar de Sun y el Java Activation Framework si nuestra JDK es menor a 1.6 .

Las personas observadoras podrán constatar que el portal de Polo Polo Online usa Google Apps también, es algo que queremos dejar de hacer pero por el momento seguimos haciéndolo. Al principio estuve en un gran problema al ver que la versión de OpenCms 7.0.3 no usaba Commons Email 1.1 y por ende no existía una forma rápida de usar el setTLS. Sin embargo si actualizamos todas las librerías anteriores, podemos jugar con el mecanismo de herencia y polimorfismo de Java para lograrlo.

Ok entonces, si el método por cualquier razón no es visible desde la subclase, sino solo desde la superclase, ¿qué hacemos? Sencillo. Iniciamos el objeto declarando el tipo de la superclase, y lo instanciamos como la subclase. De esta forma no necesitaremos la autenticación ni el host (ya que éstos están provistos por el archivo de configuración de OpenCms, que carga si no me equivoco el constructor de Cms****Mail), únicamente el puerto SMTP y el TLS deberán ser llamados a mano. Ejemplo:


SimpleEmail csm = new CmsSimpleMail();

csm.setTLS(true);

csm.setSmtpPort(587);

csm.addTo(cmsuser.getEmail());

csm.setSubject("Polo Polo Online - Activa tu cuenta!");

csm.setMsg("Mensaje de activacion de cuenta");

csm.send();


Y ya. Chequen también otra cosa: dado que el método addTo del CmsSimpleEmail no requiere forzosamente una colección, sino que también puede trabajar con direcciones en String, no es necesario crear una nueva colección al mandarlo llamar. ¿Vieron que no puse ni host, ni autenticación? Estos datos son cargados automáticamente del archivo de configuración de OpenCms a menos que los pongamos de forma literal para, por ejemplo, distribuír la carga en los correos que se envían haciéndolo desde diferentes cuentas - recuerden que Google Apps por defecto solo deja enviar 500 correos al día - .

Espero que a alguien le sean de utilidad estos datos. Cualquier duda pueden poner un comment.

Saludos,

Posts relacionados