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...

Métodos Javascript que te pueden ser útiles

Hola a todos, Ufff hace mucho que no publico una entrada contundente. La verdad he estado demasiado ocupado realizando mi tesis de la cual les hablaré en un tiempo más... cuando la termine.

Este post algo tiene que ver con mi tesis y son algunos de los métodos javascript que he tenido que construir para facilitar la obtención de datos y validaciones (a pesar de que ya existen frameworks como JQuery que ya lo hacen, siempre es mejor saber como se hacen las cosas antes que la total abstracción).



El siguiente método obtiene todos los elementos HTML de un tipo específico y cuyo ID cumpla con patrón recibido como parámetro.

function getElementsLikeID( tagName, likeID ){
var elementsLike = [];
var elementos = document.getElementsByTagName( tagName );
if( elementos!=null ){
var j=0;
for( i=0 ; i<elementos.length ; i++ ){
if( elementos[i].id!=null && elementos[i].id.indexOf(likeID)>-1 ){
elementsLike[j++] = elementos[i];
}
}
}
return elementsLike;
}


Si ejecutas getElementsLikeID('INPUT','porcentajes_'); devolverá un arreglo con todos los elementos HTML input cuyo ID contenga la palabra 'porcentajes_'.


Utilizando el método "getElementsLikeID" se pueden hacer una infinidad de funciones, por ejemplo una que permita cambiar la clase de diversos elementos de la página.

function cambiaClassPorTag( tagName, likeID, nombreClase ){
var elementos = getElementsLikeID( tagName, likeID );
if( elementos!=null ){
for( i=0 ; i<elementos.length ; i++ ){
elementos[i].className = nombreClase;
}
}


Por ultimo les dejo unos métodos que sirven para marcar varios checkbox que posean un nombre en común y otro para marcar todos los checkbox que estén dentro de una columna de una tabla (al hacer click en la columna se marcan todos los checkbox).

1) Marcar o descmarcar todos los checkbox con nombre en común.

function checkBoxLikeNameMarcar( name ){
checkBoxLikeName( name, true );
}

function checkBoxLikeNameDesmarcar( name, marcar ){
checkBoxLikeName( name, false );
}

function checkBoxLikeName( name, marcar ){
var checkBoxes = document.getElementsByTagName('INPUT');
for ( i=0 ; i<checkBoxes.length ; i++){
if(checkBoxes.type='CHECKBOX' && checkBoxes[i].name.indexOf(name)>-1){
if( marcar && !checkBox[i].checked )
checkBoxes[i].click();
else if ( !marcar && checkBoxes[i].checked )
checkBoxes[i].click();
}
}
}


2)Marcar todos los checkbox de una columna de una tabla.
*El parámetro "aLink" es un link que va en un o al principio de la columna.

function checkColumna( aLink ){
var tdPresionado = aLink .parentNode;
var trTabla = td.parentNode;
var pos = 0;
for( var i=0 ; i<trTabla.cells.length ; i++ )
if( tr.cells[i]==tdPresionado )
pos = i+1;
for( var i=2 ; i<trTabla.parentNode.rows.length ; i++ ){
trTabla.parentNode.rows[i].cells[pos].getElementsByTagName('INPUT')[0].click();
}


Bueno eso es todo por ahora, espero les sirva ;)
Saludos

PD: Feliz navidad y año nuevo ultra atrasado xD.

ver post completo...

Frases: Software y catedrales

El software y las catedrales se parecen mucho. Primero lo construimos, después rezamos.

–-Anónimo

ver post completo...

Frases: Programación

"Los programas deben ser escritos para que la gente los lea y sólo incidentalmente, para que las máquinas los ejecuten."

---Abelson / Sussman


visto en: hackification

ver post completo...

Gestiona tu proyecto facilemente con Scrumy

Navegando por ahí me encontré con Scrumy una herramienta que permite organizar y gestionar las tareas que se deben realizar en un proyecto con todo el estilo de Scrum.

No hay mucho más que decir les dejo el link del sitio, el cual permite crear proyectos de manera gratuita en su modo FREE o puedes pagar un poco para acceder a todas las funcionalidades en su modo PRO: SCRUMY!!



Aquí les dejo un video que explica de qué trata SCRUMY:


ver post completo...

¿Necesitas iconos para tu web?

Hola a todos.

Siempre cuando desarrollamos un sistema llega el momento de escoger qué
iconos utilizarás. Si eres nuevo y no tienes ideas de las licencias
que pueden tener las imágenes que circulan en la web, pues debo decirte
que no puedes llegar y tomar los iconos que quieras...

Excepto en Wikimedia Commons donde encontrarás una cantidad impresionante de imágenes (en formato PNG y SVG) e iconos bajo licencia "GNU General Public License" más conocida como "GNU GPL" o "GPL".

Para más información visita los siguientes enlaces:
GNU GPL (Wiki)
GNU GPL (Sitio oficial)

Saludos.-

ver post completo...

Frases: Proyectos

"Si deseas empezar y desarrollar algo grandioso, no necesitas millones de dólares de capitalización. Necesitas suficiente pizza y Diet Coke en la nevera, una PC barata y trabajo y dedicación para realizar tu idea."

---John Carmack


visto en: hackification

ver post completo...

top