Un primer vistazo a Groovy

Actualmente en todo el mundo los lenguajes dinámicos o ágiles han logrado alcanzar mucha popularidad tanto en las empresas como para los desarrolladores (aunque en Chile y en general en Latino América, a nivel empresarial aún no son muy valorados).


Groovy me ha llamado poderosamente la atención ya que es un lenguaje nacido con la misión de llevarse bien con Java, vivir en la máquina virtual y soportar los tipos de datos estándar pero añadiendo características dinámicas y sintácticas presentes en lenguajes como Python, Smalltalk o Ruby.

El código fuente de Groovy compila a bytecodes igual que Java (generando archivos .class que podemos ejecutar directamente desde la máquina virtual), lo que permite instanciar objetos Java desde Groovy y viceversa.

La sintaxis de Groovy es bastante similar a la de Java, por lo que la curva de aprendizaje es muy alta para los desarrolladores que se familiarizan con él.

La mayoría de las cosas que hacemos con Java puede hacerse en Groovy, por ejemplo:
  • Definición de packages
  • Definición de clases (pero no internas) y métodos
  • Estructuras de control, excepto el bucle for( ; ; )
  • Control de excepciones
  • Operadores, expresiones y asignaciones
  • Literales con algunas variaciones
  • Instanciación, referencia y de-referencia de objetos, llamadas a métodos
Y algunas mejoras sintácticas que incluye Groovy:
  • En Groovy todo es un objeto
  • Facilidad en el manejo de objetos, a través de nuevas expresiones y sintaxis
  • Diversas formas para declarar literales
  • Control de flujo avanzado mediante nuevas estructuras
  • Nuevos tipos de datos con operaciones y expresiones específicas
  • Brevedad, el código Groovy es mucho más breve que el de Java

Y como es habitual y para finalizar esta entrada, veamos como sería el código del típico "Hola Mundo" en Groovy:

//Hola Mundo en Groovy
def mundo = "Mundo"
println "Hola $mundo!"
//Fin

A primera vista vemos que:
  • Se pueden escribir script en los que no hay clases (en realidad la hay pero no necesitamos declararla)
  • No hay ';' al final de cada línea. En Groovy es opcional
  • La palabra reservada def permite declarar variables de tipo dinámico. También se pueden crear variables de tipo estático (ejemplo: Integer)
  • Los comentarios son igual que en Java (// o /**/)
  • print y println son equivalentes a System.out.print y System.out.println
  • El parámetro de la función println no va entre paréntesis, es opcional

ver post completo...

Hola a todos, a muchos desarrolladores se nos hace indispensable poder implementar un módulo de envío de mail en los sistemas que desarrollamos. Dependiendo del lenguaje está la complejidad o simplicidad de la codificación de éste y como muchos sabemos, Java no siempre es un precursor de lo simple.

Es por esto que quiero publicar y facilitarles a todos una clase Mail.java que permite realizar envío de correos a través de Google Apps y mediante un servidor de correos común y corriente.

El código funciona implementando la API de SUN JavaMail (así que descarguen el JAR con la API sino nunca podrán enviar correos) y proporciona 2 métodos. Uno llamado 'enviaGoogleApp' que permite enviar el correo a través de una cuenta de Google Apps y otro llamado 'envia' que envía correos a través de un servidor de correo definido.

El código de ambos métodos es idéntico, sólo cambia la forma de autenticarse en el servidor.

Los métodos de la clase Mail sólo requieren los siguientes datos:
1) Emisor del mensaje.
2) Asunto del correo.
3) Receptor(es) del correo.
4) mensaje del correo (en formato HTML o ASCII)
5) Archivos adjuntos.

Con una leve modificación y añadiendo 2 parámetros más se pueden añadir:
1) Receptores a quienes se copia el correo.
2) Receptores a quienes se les envía copia oculta.

El código es el siguiente:


package util.mail;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class Mail {
 
 private class SMTPAuthenticator extends Authenticator {
  private String dEmail;
  private String dPassword;
  
  public SMTPAuthenticator(String email, String password){
   dEmail = email;
   dPassword = password;
  }
  
  public PasswordAuthentication getPasswordAuthentication(){
   return new PasswordAuthentication(dEmail, dPassword);
  }
 }
 
 /**
  * Función que permite enviar un correo electrónico con archivos adjunto.
  * <br>El contenido del correo puede estar en formato HTML.
  * @param emisor Correo de quién emite el correo
  * @param asunto Asunto del e-mail
  * @param receptores Correos de los receptores del e-mail
  * @param mensaje Mensaje del e-mail
  * @param adjuntos Ruta de archivos adjuntos en el e-mail
  * @return TRUE si el mail fue enviado con éxito, FALSE en caso contrario
  */
 public boolean enviaGoogleApp(String emisor, String asunto, List<String> receptores, String mensaje, List<String> adjuntos){
  boolean envioExitoso = true;
  String emailGetCursos = "cuenta.googleapps@algo.cl";
  String password = "password.de.cuenta.googleapps";
  Properties props = new Properties();
  props.put("mail.smtp.user", emisor);
  props.put("mail.smtp.host", "smtp.gmail.com");
  props.put("mail.smtp.port", "465");
  props.put("mail.smtp.starttls.enable", "true");
  props.put("mail.smtp.auth", "true");
  props.put("mail.smtp.socketFactory.port", "465");
  props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
  props.put("mail.smtp.socketFactory.fallback", "false");
  
  try{
   
   Authenticator auth = new SMTPAuthenticator(emailGetCursos, password);
   Session session = Session.getInstance(props, auth);

   MimeMessage message = new MimeMessage(session);
   InternetAddress[] dest = new InternetAddress[receptores.size()];
   for (int i=0;i<dest.length;i++){
    dest[i] = new InternetAddress( receptores.get(i) );
   }
   
   //Se define quién es el emisor del e-mail
      message.setFrom(new InternetAddress(emisor));
      InternetAddress[] replyTo = new InternetAddress[1];
      replyTo[0] = new InternetAddress( emisor );
      message.setReplyTo( replyTo );
   //Se definen el o los destinatarios
   message.addRecipients(Message.RecipientType.TO, dest);
   //message.addRecipients(Message.RecipientType.CC, dest);
   //message.addRecipients(Message.RecipientType.BCC, dest);

      
   //Se defina el asunto del e-mail
      message.setSubject(asunto);
 
      //Se seteo el mensaje del e-mail
      MimeBodyPart messageBodyPart = new MimeBodyPart();
      messageBodyPart.setContent(message,"text/html");
            
      Multipart multipart = new MimeMultipart();
      multipart.addBodyPart(messageBodyPart);
            
      //Se adjuntan los archivos al correo
      if( adjuntos!=null && adjuntos.size()>0 ){
         for( String rutaAdjunto : adjuntos ){
             messageBodyPart = new MimeBodyPart();
             File f = new File(rutaAdjunto);
             if( f.exists() ){
                DataSource source = new FileDataSource( rutaAdjunto );
                messageBodyPart.setDataHandler( new DataHandler(source) );
                messageBodyPart.setFileName( f.getName() );
                multipart.addBodyPart(messageBodyPart);
             }
         }
      }
      
      //Se junta el mensaje y los archivos adjuntos
      message.setContent(multipart);
      
      //Se envía el e-mail
      Transport.send( message );
  }
  catch (Exception e) {
   envioExitoso = false;
  }
  finally{
   //Se eliminan del servidor los archivos adjuntos
   if( adjuntos!=null && adjuntos.size()>0 ){
    for( String rutaAdjunto : adjuntos ){
     try{
      File arch = new File(rutaAdjunto);
         arch.delete();
     }
     catch (Exception e) {}
    }
   }
  }
  return envioExitoso;
 }
 
 /**
  * Función que permite enviar un correo electrónico con archivos adjunto.
  * <br>El contenido del correo puede estar en formato HTML.
  * @param emisor Correo de quién emite el correo
  * @param asunto Asunto del e-mail
  * @param receptores Correos de los receptores del e-mail
  * @param mensaje Mensaje del e-mail
  * @param adjuntos Ruta de archivos adjuntos en el e-mail
  * @return TRUE si el mail fue enviado con éxito, FALSE en caso contrario
  */
 public boolean envia(String emisor, String asunto, List<String> receptores, String mensaje, List<String> adjuntos){
  boolean envioExitoso = true;
  try{
      Properties props = System.getProperties();
 
      //Se define el servidor de correos
      props.put("mail.smtp.host", "ip.servidor.de.correos");
   props.put("mail.smtp.port", "puerto.servidor.de.correo (por defecto 25)");
 
      //Se obtiene sesión desde el servidor de correos
      Session session = Session.getInstance(props, null);
   session.setDebug(true);
   
      MimeMessage message = new MimeMessage(session);
   InternetAddress[] dest = new InternetAddress[receptores.size()];
   for (int i=0;i<dest.length;i++){
    dest[i] = new InternetAddress( receptores.get(i) );
   }
   
   //Se define quién es el emisor del e-mail
      message.setFrom(new InternetAddress(emisor));
      InternetAddress[] replyTo = new InternetAddress[1];
      replyTo[0] = new InternetAddress( emisor );
      message.setReplyTo( replyTo );
   //Se definen el o los destinatarios
   message.addRecipients(Message.RecipientType.TO, dest);
   //message.addRecipients(Message.RecipientType.CC, dest);
   //message.addRecipients(Message.RecipientType.BCC, dest);
      
   //Se defina el asunto del e-mail
      message.setSubject(asunto);
 
      //Se seteo el mensaje del e-mail
      MimeBodyPart messageBodyPart = new MimeBodyPart();
      messageBodyPart.setContent(message,"text/html");
            
      Multipart multipart = new MimeMultipart();
      multipart.addBodyPart(messageBodyPart);
            
      //Se adjuntan los archivos al correo
      if( adjuntos!=null && adjuntos.size()>0 ){
         for( String rutaAdjunto : adjuntos ){
             messageBodyPart = new MimeBodyPart();
             File f = new File(rutaAdjunto);
             if( f.exists() ){
                DataSource source = new FileDataSource( rutaAdjunto );
                messageBodyPart.setDataHandler( new DataHandler(source) );
                messageBodyPart.setFileName( f.getName() );
                multipart.addBodyPart(messageBodyPart);
             }
         }
      }
      
      //Se junta el mensaje y los archivos adjuntos
      message.setContent(multipart);
      
      //Se envía el e-mail
      Transport.send( message );
  }
  catch (Exception e) {
   envioExitoso = false;
  }
  finally{
   //Se eliminan del servidor los archivos adjuntos
   if( adjuntos!=null && adjuntos.size()>0 ){
    for( String rutaAdjunto : adjuntos ){
     try{
      File arch = new File(rutaAdjunto);
         arch.delete();
     }
     catch (Exception e) {}
    }
   }
  }
  return envioExitoso;
 }
 
 public static void main(String[] args) {
  List<String> receptores = new ArrayList<String>();
  receptores.add("mail.de.alguien@gmail.com");
  String emisor = "test@test.cl";
  String asunto = "Correo de prueba";
  String mensaje = "Este es un correo de <font color='red'><b>PRUEBA</b></font>";
  List<String> archivos = new ArrayList<String>();
  Mail m = new Mail();
  //m.envia(emisor, asunto, receptor, mensaje, null);
  m.enviaGoogleApp( emisor, asunto, receptores, mensaje, archivos);
 }
 
}

ver post completo...

top