jueves, 28 de junio de 2012

Envio de correo electronico con JavaMail

En esta entrada mostrare la forma de mandar un correo electronico usando una cuenta de gmail y utilizando la libreria JavaMail, utilizare interfaces e implementaciones:

Antes que nada, se deben descargar el API

La interfaz:

public interface MailServices {
   
    public void enviar(String mailReceptor, String asunto, String cuerpo) throws ScaseMailException;
   
}


La implementación:

public class MailServicesImpl implements MailServices {

    final String miCorreo = "cuenta@gmail.com";
    final String miContraseña = "xxxxxxxx";
    final String servidorSMTP = "smtp.gmail.com";
    final String puertoEnvio = "465";
    String mailReceptor = null;
    String asunto = null;
    String cuerpo = null;

    @Override
    public void enviar(String mailReceptor, String asunto, String cuerpo) throws ScaseMailException {

        try {
            this.mailReceptor = mailReceptor;
            this.asunto = asunto;
            this.cuerpo = cuerpo;

            Properties props = new Properties();
            props.put("mail.smtp.user", miCorreo);
            props.put("mail.smtp.host", servidorSMTP);
            props.put("mail.smtp.port", puertoEnvio);
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.auth", "true");
            props.put("mail.smtp.socketFactory.port", puertoEnvio);
            props.put("mail.smtp.socketFactory.class",
                    "javax.net.ssl.SSLSocketFactory");
            props.put("mail.smtp.socketFactory.fallback", "false");

            Authenticator auth = new autentificadorSMTP();
            Session session = Session.getInstance(props, auth);

            MimeMessage msg = new MimeMessage(session);
            msg.setText(cuerpo);
            msg.setSubject(asunto);
            msg.setFrom(new InternetAddress(miCorreo));
            msg.addRecipient(Message.RecipientType.TO, new InternetAddress(
                    mailReceptor));
            Transport.send(msg);
        } catch (Exception e) {
            throw new ScaseMailException(e.toString(), e.getMessage());
        }
    }
   

    private class autentificadorSMTP extends javax.mail.Authenticator {

        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(miCorreo, miContraseña);
        }
    }
}



Excepciones personalizadas en Java

Una excepción en Java es un error que se genera en tiempo de ejecución dentro de una aplicación, existen diferentes tipos de excepciones de las que podemos hacer uso o personalizar la propia, para que nos serviria esto?, pues podemos tratar como una excepcion todo aquello que se salga del flujo normal de nuestra aplicación o aquello que no cumpla con la logica del negocio.

Para esto declaramos una clase que extienda de la clase Exception (esta es la clase mas general de las excepciones):

public class JvieraMailException  extends Exception {
   
    private String descripcion;
   
    public JvieraMailException(String mensaje)
    {
        super(mensaje);
        this.descripcion = "";
    }
   
    public JvieraMailException(String mensaje, String descripcion)
    {
        super(mensaje);
        this.descripcion = descripcion;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }   
   
}

En esta clase declaramos dos constructores, en los cuales pasamos como parametro el mensaje y la descripción de la excepción personalizada, a continuación muestro como usarla:

 public void validarEnteroPositivo(int valor) throws JvieraMailException
   {
       if(valor < 0)
       {
           throw new JvieraMailException("Error en el valor.", valor+" No es un entero positivo");
       }   
   }  

Convertir el StackTrace de Java a String

En esta ocasión les traigo una clase utilitaria que me sirvio para convertir el StackTrace de una exception a una cadena de String, esto surgio por la necesidad de enviar por correo electronico el StackTrace del errror generado a mi cuenta en gmail.

public final class StackTraceUtil {

    public static String getStackTrace(Throwable aThrowable) {
        final Writer result = new StringWriter();
        final PrintWriter printWriter = new PrintWriter(result);
        aThrowable.printStackTrace(printWriter);
        return result.toString();
    }
  
    public static String getCustomStackTrace(Throwable aThrowable) {
        final StringBuilder result = new StringBuilder("ERROR: ");
        result.append(aThrowable.toString());
        final String NEW_LINE = System.getProperty("line.separator");
        result.append(NEW_LINE);

        for (StackTraceElement element : aThrowable.getStackTrace()) {
            result.append(element);
            result.append(NEW_LINE);
        }
        return result.toString();
    }
}

Referencias: javapractices

Encriptando con Java usando MD5

MD5 (abreviatura de Message-Digest Algorithm 5, Algoritmo de
Resumen del Mensaje 5) es uno de los algoritmos de reducción criptográfico mas usado en la actualidad y su objetivo es ocultar el verdadero valor de un mensaje encriptandolo, de esta manera para cualquier mensaje siempre nos resultara un número de 32 dígitos hexadecimal, por ejemplo:
MD5("Esto sí es una prueba de MD5") = e99008846853ff3b725c27315e469fbc
MD5("") = d41d8cd98f00b204e9800998ecf8427e

En mi caso tenia la necesidad de guardar en una tabla de la Base de Datos todos los usuarios y contraseñas del sistema, por tema de seguridad no se puede guardar las contraseñas directamente, para eso mismo use MD5, el cual es un metodo nativo en MySQL, de esta manera cuando un usuario queria ingresar al sistema encriptaba por MD5 la contraseña ingresada y la comparaba con la guardada en la BD y si correspondia le permitia el acceso.

A continuación muestro los metodos usados para el proposito:

public static String encriptarPorMD5(String clave) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            return hex(md.digest(clave.getBytes("CP1252")));
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

public static String hex(byte[] array) {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < array.length; ++i) {
            sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3));
        }

        return sb.toString();
    }