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.

17 comentarios:

  1. Hola, me podrias asesorar paso a paso como lo puedo hacer.
    Saludos

    ResponderEliminar
    Respuestas
    1. Me dejaron hacer un aplicatico que envie correos con archivos adjuntos pero dichos correos los tiene que tomar una base de datos.

      Te explico brevemente para ver si me puedes ayudar:

      El aplicativo tiene que llevar 3 pantallas

      1era. pantalla: es el login: te logeas y de ahi de envia a la segunda pantalla

      2da pantalla: en esta tiene que decirte que deseas enviar un txt, una imagen o etc, dar clic en imagen y de ahi que te despliegue una ventana donde tomar el archivo y despues pasar a la ventana 3

      3ra ventana: en esta ventana que te diga si es aun un correo o a varios, y los usuarios los tiene que tomar de una base de datos donde uno tenga dichas direcciones de correo y despues pasar a la ventana 4

      4ta ventana: desplegar una notificacion que diga que se envio satisfactoriamente.

      Crees que sea dificil! es un proyecto final. me puedes ayudar.!!!
      Gracias.
      Saludos

      Eliminar
    2. No es muy difícil. Puedes descargar los archivos que aparecen al inicio de la publicación, son las aplicaciones que hice y sirven para enviar correos. Prácticamente tiene las funciones que dices a excepción de tomas los correos de una base de datos pero considero que no es muy difícil de hacer.

      Eliminar
    3. Ok, de los cuatro archivos que estan en la publicación, cual es el que envia correos con archivo adjunto.

      Eliminar
    4. Ya probe y funciona bien, una duda el codigo que esta en la publicación es el mismo del aplicativo para que puedo manipularlo o solo con copiar y pegarlo en un proyecto de netbeans funciona???

      Eliminar
  2. Hola Marcial Ramirez , me podrias enviar a mi correo el codigo de la aplicacion para enviar correo desde una cuenta de outlook, este es mi correo andres_baranc@outlook.com Muchas gracias

    ResponderEliminar
  3. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  4. Hola, Yo deseo enviar 3 archivos Adjuntos (Imagen, Texto y PDF) todo por separado pero en el mismo correo, en el ejemplo solo he visto imagen + texto, Me podrías explicar cómo lo puedo hacer? Trato de añadir un archivo adjunto cómo los 2 anteriores, pero al enviar me sale un error.
    Gracias

    ResponderEliminar
    Respuestas
    1. Este codigo recibe un arreglo de cadenas para los adjuntos. Tendrias que guardar en el arreglo la ruta de tu imagen y la ruta de tu pdf. Puedes enviar 2 o mas adjuntos y debe funcionar
      public EnviarCorreoMejorado(String usuario,String pass,String[] dest,String asun,String mens,String[] archivo)

      Eliminar
    2. En dónde se guarda la ruta de los archivos?. Por favor, necesito ayuda no he podido hacerlo funcionar

      Eliminar
    3. Para que el código funcione debes pasar un arreglo del tipo cadena con la ruta de tus archivos. Estas rutas las puedes definir estáticamente o leyéndolas desde consola o con un cuadro de dialogo. Este código lo hice hace 8 años en java 7, no estoy seguro si aún funciona en la versión más reciente de Java

      Eliminar
    4. Creeme que aun funciona JavaMail como lo estás poniendo, sólo me podrías dar un ejemplo de como pasar el arreglo en tu código, por favor... 👏🏻

      Eliminar
  5. Hola me podrias compartir tu codigo de la aplicacion? mi correo es mauri0227@hotmail.com

    ResponderEliminar
  6. Genial, me sirvió e mucho y pude adjuntar n archivos, mis gracias por los aportes.

    ResponderEliminar
    Respuestas
    1. Me podrías ilustar como por favor, he tratado pero no lo he logrado.

      Eliminar