sábado, 25 de mayo de 2013

JavaMail(Parte 3) Enviar un correo con múltiples destinatarios y múltiples adjuntos.


----------------------------------------------------------------------------------------------------


 ----------------------------------------------------------------------------------------------------
En las dos entradas anteriores mostré la forma de enviar un mail y enviar un mail con un archivo adjunto. Los  datos a utilizar estaban definidos de forma estática y era simplemente para demostración. En esta ocasión dejo el código que ya he modificado para volverlo más general y se puedan usar variables y parámetros para utilizarlo en una interfaz gráfica.

A continuación dejo en código.


/* @author marxs7
 * basado en código de Chuidiang
 * En este ejemplo se usa Gmail pero pueden utilizar cualquier servidor
 * solo remplacen los valores asignados a servidorSMTP Y puertoEnvio.
 */
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class EnviarCorreoMejorado
{   String miCorreo;
    String miPassword;
    String servidorSMTP="smtp.gmail.com";
    String puertoEnvio="587";// puertoEnvio="587";//465 para mensajes normales y 587 con adjuntos
    String[] destinatarios;
    String asunto;
    String cuerpo = null;//cuerpo del mensaje
    String[] archivoAdjunto;
    
  public EnviarCorreoMejorado(String usuario,String pass,String[] dest,String asun,String mens,String[] archivo){
        destinatarios=dest;
        asunto=asun;
        cuerpo=mens;
        archivoAdjunto=archivo;  
        miCorreo=usuario;
        miPassword=pass;
     }
    
    public void Enviar() throws MessagingException
    {
            Properties props=null;
            props = new Properties();
            props.put("mail.smtp.host", servidorSMTP);
            props.setProperty("mail.smtp.starttls.enable", "true");//si usa Yahoo comentar esta linea         
            props.setProperty("mail.smtp.port", "587");
            props.setProperty("mail.smtp.user", miCorreo);
            props.setProperty("mail.smtp.auth", "true");
            SecurityManager security = System.getSecurityManager();
     
            Authenticator auth = new EnviarCorreoMejorado.autentificadorSMTP();
            Session session = Session.getInstance(props, auth);
           // session.setDebug(true); //Descomentar para ver el proceso de envio detalladamente
            
            // Se compone la parte del texto
            BodyPart texto = new MimeBodyPart();
            texto.setText(cuerpo);
            
            // Se compone el adjunto 
            BodyPart[] adjunto=new BodyPart[archivoAdjunto.length];
            for(int j=0;j<archivoAdjunto.length;j++){
            adjunto[j]=new MimeBodyPart();
            adjunto[j].setDataHandler(
                new DataHandler(new FileDataSource(archivoAdjunto[j])));
            
            String[] rutaArchivo = archivoAdjunto[j].split("/");//separamos las palabras que forman la url y las                 ponemos en arreglo  de cadenas
            int nombre=rutaArchivo.length-1;//del array buscamos la ultima posicion
            adjunto[j].setFileName(rutaArchivo[nombre]);//la ultima posicion debe tener el nombre del archivo
            }
            

            // Una MultiParte para agrupar texto e imagen.
            MimeMultipart multiParte = new MimeMultipart();
            multiParte.addBodyPart(texto);
            for(BodyPart aux:adjunto){
                multiParte.addBodyPart(aux);
            }
            

            // Se compone el correo, dando to, from, subject y el
            // contenido.
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(miCorreo));
            Address []destinos = new Address[destinatarios.length];//Aqui usamos el arreglo de destinatarios
            for(int i=0;i<destinos.length;i++){
                destinos[i]=new InternetAddress(destinatarios[i]);
            }
            message.addRecipients(Message.RecipientType.TO, destinos);//agregamos los destinatarios
            message.setSubject(asunto);
            message.setContent(multiParte);

            // Se envia el correo.
            Transport t = session.getTransport("smtp");
            t.connect(miCorreo, miPassword);
            t.sendMessage(message, message.getAllRecipients());
            System.out.println("Correo Enviado exitosamente!"); 
            t.close();    
        }
     private class autentificadorSMTP extends javax.mail.Authenticator {
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(miCorreo, miPassword);
        }
    }
        
    }


Cualquier duda o pregunta déjenla en los comentarios. Si necesitan las librerías o servidores y puertos SMTP pueden encontrarlos en la Primer entrada acerca de Java Mail.

En la próxima publicación se implementará un parámetro extra para poder definir el servidor de correo dinámicamente.

miércoles, 15 de mayo de 2013

 JavaMail(Parte 2) Enviar un correo con un dato adjunto.


En la publicación anterior realice el envío de un correo electrónico lo mas simple posible. Ahora adaptaremos el código para enviar un correo electrónico con un dato adjunto.

Recomiendo que visiten el post anterior para descargar las librerías y leer la explicación acerca del envío de correos electrónicos con JavaMail. Ir a entrada anterior.



import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
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;
/**
 * Ejemplo de envio de un correo de texto con una imagen adjunta con javamail
 * @author marxs7
  */
public class EnviarCorreoConAdjunto
{   String miCorreo="miCorreo@gmail.com";
    String miPassword="miPassword";
    String servidorSMTP="smtp.gmail.com";
    String puertoEnvio="587";
    String destinatario="destinatario@gmail.com";
    String asunto="Correo con adjunto";
    String mensaje = "mensaje con adjunto desde JAVA";//cuerpo del mensaje
    String archivoAdjunto=null;
    String nombreArchivo;
   
   
    public EnviarCorreoConAdjunto(String archivo,String nombre){
        archivoAdjunto=archivo;
        nombreArchivo=nombre;
    }    
    public void Enviar() throws MessagingException
    {
         
            Properties props=null;
            props = new Properties();
            props.put("mail.smtp.host", servidorSMTP);
           //si usan yahoo comentar la linea siguiente
                 props.setProperty("mail.smtp.starttls.enable", "true");
            props.setProperty("mail.smtp.port", "587");
            props.setProperty("mail.smtp.user", miCorreo);
            props.setProperty("mail.smtp.auth", "true");

            SecurityManager security = System.getSecurityManager();

     
            Authenticator auth = new EnviarCorreoConAdjunto.autentificadorSMTP();
            Session session = Session.getInstance(props, auth);
           // session.setDebug(true);//Descomentar si quieren ver en consola el proceso detallado
           

            // Se compone la parte del texto
            BodyPart texto = new MimeBodyPart();
            texto.setText(mensaje);
            BodyPart adjunto = new MimeBodyPart();
           adjunto.setDataHandler(new DataHandler(new FileDataSource(archivoAdjunto)));
           adjunto.setFileName(nombreArchivo);//es para que al descargar el archivo se
                                            //descargue con el formato correcto
           
           
            // Una MultiParte para agrupar texto e imagen.
            MimeMultipart multiParte = new MimeMultipart();
            multiParte.addBodyPart(texto);
            multiParte.addBodyPart(adjunto);
         
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(miCorreo));//quien lo envia
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(destinatario));//destinatario
            message.setSubject(asunto);//asunto
            message.setContent(multiParte);//asignamos los datos al mensaje

            // Se envia el correo.
            Transport t = session.getTransport("smtp");
            t.connect(miCorreo, miPassword);
            t.sendMessage(message, message.getAllRecipients());
            //System.out.println("Correo Enviado exitosamente!");
            t.close();
           
           
        }
     private class autentificadorSMTP extends javax.mail.Authenticator {
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(miCorreo, miPassword);
        }
     }
       
     public static void main(String[] args) throws MessagingException {
        // TODO Auto-generated method stub
        EnviarCorreoConAdjunto EnviarAdjunto = new EnviarCorreoConAdjunto("c:/imagen.gif",
                "imagen.gif");
        EnviarAdjunto.Enviar();
       
        System.out.println("Mensaje Enviado");
    }
    }

Esta en la base para el envío de correos electrónicos con datos adjuntos. Podemos adecuar el código expuesto de acuerdo a nuestras necesidades. Este ejemplo es demasiado sencillo solo es para comprender mejor la estructura. Cada persona puede predefinir los parámetros que le convenga.
Si desean crear una interfaz gráfica solo modifiquen el constructor para que acepte los parámetros que consideren necesarios.

En la próxima entrada explicaré la forma de enviar un correo electrónico con múltiples datos adjuntos a múltiples destinatarios.
 JavaMail(Parte 1) Enviar Mail Simple

Hoy comienzo un pequeño tutorial para enviar correos electrónicos desde una aplicación en Java. Explicare desde enviar un mensaje simple desde una cuenta predeterminada hasta como enviar un correo a múltiples destinatarios, con múltiples adjuntos con detección de servidores de correo mas utilizados.

Que necesitamos:
Obviamente contar con el JDK instalado en el equipo.
Librerias JavaMail 
NetBeans(Para las interfaces gráficas).

Los datos necesarios para enviar un email son los siguientes:
  • Servidor SMTP. Direccion SMTP de su proveedor de Correos.
  • Puerto del Servidor SMTP. El puerto en el cual nos conectaremos.
  • Usuario. El usuario para conectarnos al Servidor SMTP.
  • Password. La contraseña.
  • Destinatario. Las personas a las que va dirigido el mensaje.
  • Destinatario para copia. 
  • Destinatario para copia oculta.
  • Asunto. El asunto del mensaje.
  • Mensaje. Es la información que queremos enviar.
  • Adjuntos. Los archivos que se enviarán junto al mensaje.

Lista de Servidores SMTP.


GMail
Servidor SMTP: smtp.gmail.com
Puerto: 465,587 (según mis pruebas 465 para mensajes normales y 587 para mensajes con aduntos)

HotMail, Live, Outlook
Servidor SMTP: smtp.live.com
Puerto: 587

 Yahoo Mail
Servidor SMTP:smtp.mail.yahoo.com
Puerto:587

Después de aclarar lo necesario, las partes que contiene un correo electrónico y los servidores SMTP mas utilizados crearemos el ejemplo más sencillo. En este ejemplo todos los datos están definidos y solo debemos ejecutar el código.

Remplazar por su usuario, contraseña y destinatario para que funcione.

-------Recuerden importar las librerías al proyecto----------



import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public  class EnviarCorreo {
    final String miCorreo = "ejemplo@gmail.com";
    final String miContraseña = "miPassword";
    final String servidorSMTP = "smtp.gmail.com";
    final String puertoEnvio = "465";
    String mailReceptor = null;
    String asunto = null;
    String cuerpo = null;

    public EnviarCorreo(String mailReceptor, String asunto,
            String cuerpo) throws MessagingException {
        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");

        SecurityManager security = System.getSecurityManager();

   
            Authenticator auth = new EnviarCorreo.autentificadorSMTP();
            Session session = Session.getInstance(props, auth);
            // session.setDebug(true);

            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);
     

    }

    private class autentificadorSMTP extends javax.mail.Authenticator {
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(miCorreo, miContraseña);
        }
    }

    /**
     * @param args
     */
  public static void main(String[] args) throws MessagingException {
        // TODO Auto-generated method stub
//El destinatario puede ser cualquier direccion electronica válida
        EnviarCorreo EnviadorMail = new EnviarCorreo("destinatario@gmail.com",
                "Asunto", "Mensaje ");
        System.out.println("Mensaje Enviado");
    }

}


En la siguiente publicación Explicare como enviar un Correo Con datos Adjuntos.

domingo, 12 de mayo de 2013

Mi primer publicación


Mi primer publicación la enfocaré a presentarme, a contarles quien soy y que hago :)

Realmente no creí que fuera tan difícil describirse. Normalmente soy una persona que se platica mucho con sus amigos y  se la pasa riendo todo el tiempo.

Soy un estudiante universitario, estudio Licenciatura en Informática. Me gusta mucho la tecnología y sobre todo los teléfonos. 
Otra actividad que me gusta es la programación principalmente en Java y siempre estoy buscando código y buscando nuevas formas de utilizarlo.

El porque del titulo del blog.
Less is Better, es una frase en inglés que en español equivale a Menos es mejor. Escogí este titulo debido a que pienso escribir algunos tutoriales simples que sean lo mas cortos posible y bien explicado para su mejor comprensión.

En fin se que pocos o tal vez nadie lea esta publicación así que mejor me esforzaré en mis publicaciones siguientes.

Espero que les agrade el contenido de mi blog. Y cualquier duda la responderé oportunamente.

ATTE 

Marxs7