sábado, 25 de mayo de 2013

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


----------------------------------------------------------------------------------------------------
Links de descarga Simple Mail
SimpleMail.rar (7.5 MB)
SimpleMailMini.rar (1.7 MB)
SimpleMailMicroP.rar (861 KB)
SimpleMailMicroA.rar (860 KB)

Información del proyecto en Taringa!
 ----------------------------------------------------------------------------------------------------
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.

8 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