/// <summary>
        /// Método EnviarEmail.
        /// Permite enviar un email desde de una cuenta de correo específica.
        /// </summary>
        /// <param name="pEmail">Email que se guardará en la base de datos</param>
        /// <param name="pCuenta">Cuenta desde la cual enviamos el mail</param>
        /// <param name="pMensaje">Objeto tipo MailMessage para armar el mensaje a enviar</param>
        public void EnviarEmail(EmailDTO pEmail, CuentaDTO pCuenta, MailMessage pMensaje)
        {

            try
            {
                iFactory = DAOFactory.Instancia();
                iFactory.IniciarConexion();
                iFactory.ComenzarTransaccion();
                FactoryServicios.Instancia.Servicio(pCuenta.Servicio).EnviarCorreo(pCuenta, pMensaje);
                if (pEmail.IDMensaje == null)
                {
                    pEmail.IDMensaje = "";
                }
                if (pEmail.Leido == null)
                {
                    pEmail.Leido = "Leído";
                }
                iFactory.MailDAO().Insertar(pEmail);
                iFactory.Commit();
            }
            catch (Exception ex)
            {
                iFactory.RollBack();
                throw new Exception(ex.Message);
            }
            finally
            {
                iFactory.FinalizarConexion();
            }
        }
        /// <summary>
        /// Método Exportar.
        /// Permite exportar a TXT un mail específico que hayamos elegido.
        /// </summary>
        /// <param name="pEmail">Email a exportar</param>
        /// <param name="pRuta">Ruta donde guardaremos el archivo</param>
        /// <param name="pNombre">Nombre que le daremos al archivo a exportar</param>
        public override void Exportar(EmailDTO pEmail, string pRuta, string pNombre)
        {
            string iDestinatarios = ""; // Cadena que contendrá todas las direcciones de los destinatarios del mail
            
            foreach (string Destinatario in pEmail.Destinatario)
            {
                iDestinatarios = iDestinatarios + Destinatario + ", "; // Construimos la cadena con las direcciones de los destinatarios
            }

            // Construimos el texto principal del archivo con todos los datos del mail que vamos a exportar
            string[] iTextoPlanoAExportar = {"De: <" + pEmail.Remitente + ">", "Para: <" + iDestinatarios + ">",
                                            "Asunto: " + pEmail.Asunto, "Fecha y hora: " + pEmail.Fecha, "Adjuntos: " + "------------------------------------------", "Cuerpo: " + pEmail.Cuerpo};
            try
            {
                File.WriteAllLines(pRuta + "\\" + pNombre, iTextoPlanoAExportar); // Una vez que tenemos construido todo, trataremos de guardarlo en un archivo. Caso contrario, lanzará las debidas excepciones
            }
            catch (FormatException)
            {
                throw new ExportadoresException("No se pudo exportar su correo. Hubo un problema con el formato del correo a exportar o con la ruta de la carpeta elegida. Eliga una nueva ruta o revise el correo y vuelva a intentarlo.");
            }
            catch (PathTooLongException)
            {
                throw new ExportadoresException("No se pudo exportar su correo. La ruta para guardar el archivo es demasiado larga. Revise la ruta e intente nuevamente");
            }
            catch (IOException)
            {
                throw new ExportadoresException("No se pudo exportar su correo. Hubo un problema al guardar el archivo. Elija otra carpeta e intente nuevamente");
            }
            catch (Exception ex)
            {
                throw new ExportadoresException("No se pudo exportar su correo");
            }
        }
 /// <summary>
 /// Método Exportar.
 /// Permite exportar a EML un mail específico que hayamos elegido.
 /// </summary>
 /// <param name="pEmail">Email a exportar</param>
 /// <param name="pRuta">Ruta donde guardaremos el archivo</param>
 /// <param name="pNombre">Nombre que le daremos al archivo a exportar</param>
 public override void Exportar(EmailDTO pEmail, string pRuta, string pNombre)
 {
     try
     {
         // Utilizamos un cliente SMTP para poder 'enviar' el mail exportado a EML
         // a la ruta que especificamos en los parámetros. Una vez 'enviado', el 
         // email se guardará como un archivo .eml
         MailMessage iEmail = new MailMessage();
         iEmail.From = new MailAddress(pEmail.Remitente);
         foreach (string Destinatario in pEmail.Destinatario)
         {
             iEmail.To.Add(Destinatario);
         }
         iEmail.Subject = pEmail.Asunto;
         iEmail.Body = pEmail.Cuerpo;
         SmtpClient iCliente = new SmtpClient();
         iCliente.UseDefaultCredentials = true;
         iCliente.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
         iCliente.PickupDirectoryLocation = pRuta;
         iCliente.Send(iEmail);
         
     }
     catch (FormatException)
     {
         throw new ExportadoresException("No se pudo exportar su correo. Hubo un problema con el formato del correo a exportar o con la ruta de la carpeta elegida. Eliga una nueva ruta o revise el correo y vuelva a intentarlo.");
     }
     catch (PathTooLongException)
     {
         throw new ExportadoresException("No se pudo exportar su correo. La ruta para guardar el archivo es demasiado larga. Revise la ruta e intente nuevamente");
     }
     catch (IOException)
     {
         throw new ExportadoresException("No se pudo exportar su correo. Hubo un problema al guardar el archivo. Elija otra carpeta e intente nuevamente");
     }
     catch (SmtpException)
     {
         throw new ExportadoresException("No se pudo exportar su correo. Reinicie la aplicación e intente nuevamente");
     }
     catch (Exception)
     {
         throw new ExportadoresException("No se pudo exportar su correo");
     }
 }
 /// <summary>
 /// Método GuardarCorreo.
 /// El método permite guardar los emails en la base de datos y persistirlos.
 /// </summary>
 /// <param name="pEmail">Email que vamos a persistir en la base de datos</param>
 public void GuardarCorreo(EmailDTO pEmail)
 {
     try
     {
         iFactory = DAOFactory.Instancia();
         iFactory.IniciarConexion();
         iFactory.ComenzarTransaccion();
         iFactory.MailDAO().Insertar(pEmail);
         iFactory.Commit();
     }
     catch (Exception ex)
     {
         iFactory.RollBack();
         throw new Exception(ex.Message);
     }
     finally
     {
         iFactory.FinalizarConexion();
     }
 }
 public void EnviarMailPrueba()
 {
     SmtpClient iCliente = new SmtpClient();
     iCliente.Port = 587;
     iCliente.Host = "smtp.gmail.com";
     iCliente.EnableSsl = true;
     iCliente.Timeout = 10000;
     iCliente.DeliveryMethod = SmtpDeliveryMethod.Network;
     iCliente.UseDefaultCredentials = false;
     iCliente.Credentials = new System.Net.NetworkCredential("*****@*****.**", "AlexanderAnderson");
     MailMessage iMensaje = new MailMessage("*****@*****.**", "*****@*****.**", "Prueba", "Te mando un cosito");
     iCliente.Send(iMensaje);
     List<String> iDestinatarios = new List<String>();
     List<String> iCCO = new List<String>();
     List<String> iCC = new List<String>();
     iDestinatarios.Add("*****@*****.**");
     iDestinatarios.Add("*****@*****.**");
     iEmail = new EmailDTO(1 ,"enviado", "*****@*****.**", iDestinatarios, "Prueba", "Te mando un cosito", iFecha, true, iCC, iCCO);
     DAO = DAOFactory.Instancia();
     DAO.IniciarConexion();
     DAO.ComenzarTransaccion();
     DAO.MailDAO().Insertar(iEmail);
     DAO.Commit();
 }
 /// <summary>
 /// Método abstracto Exportar.
 /// Se utiliza para crear una instancia de un Exportador en particular
 /// </summary>
 /// <param name="pEmail">Email que vamos a exportar</param>
 /// <param name="pRuta">Ruta donde exportaremos el mail</param>
 /// <param name="pNombre">Nombre que le asignamos archivo</param>
 public abstract void Exportar(EmailDTO pEmail, string pRuta, string pNombre);
示例#7
0
        /// <summary>
        /// Método DescargarCorreos.
        /// Permite descargar los correos de una casilla de correo del tipo Gmail.
        /// </summary>
        /// <param name="pCuenta">Cuenta para descargar correos</param>
        /// <returns>Lista de emails descargados</returns>
        public override List<EmailDTO> DescargarCorreos(CuentaDTO pCuenta)
        {
            List<EmailDTO> iListaCorreosDescargados = new List<EmailDTO>();
            Pop3Client iPop = new Pop3Client();
            int iCantidadMensajes;
            string iIDMensaje;
            try
            {
                iPop.Connect("pop.gmail.com", 995, true);
                iPop.Authenticate(pCuenta.Direccion, pCuenta.Contraseña);
                iCantidadMensajes =  iPop.GetMessageCount();
                string iCuerpo = "";
                string iTipoCorreo = "";
                List<String> iDestino = new List<String>();
                List<String> iCC = new List<String>();
                List<String> iCCO = new List<String>();
                List<MessagePart> iListaAdjuntos = new List<MessagePart>();
                for (int i = iCantidadMensajes; i > 0; i--)
                {
                    
                    iDestino.Clear();
                    iCC.Clear();
                    iCCO.Clear();
                    
                    Message iMensaje = iPop.GetMessage(i);
                    iIDMensaje = iPop.GetMessageHeaders(i).MessageId;
                    if (iIDMensaje == null)
                    {
                        iIDMensaje = "";
                    }
                    MessagePart iTexto = iMensaje.FindFirstPlainTextVersion();
                    if (iTexto != null)
                    {
                        iCuerpo = iTexto.GetBodyAsText();
                    }
                    else
                    {
                        MessagePart iHTML = iMensaje.FindFirstHtmlVersion();
                        if (iHTML != null)
                        {
                            iCuerpo = iHTML.GetBodyAsText();
                        }
                    }
                    if (iMensaje.Headers.From.Address == pCuenta.Direccion)
                    {
                        iTipoCorreo = "Enviado";
                    }
                    else
                    {
                        iTipoCorreo = "Recibido";
                    }

                    foreach (RfcMailAddress direccionCorreo in iMensaje.Headers.To)
                    {
                        iDestino.Add(direccionCorreo.Address);
                    }

                    foreach (RfcMailAddress direccionCC in iMensaje.Headers.Cc)
                    {
                        iCC.Add(direccionCC.Address);
                    }

                    foreach (RfcMailAddress direccionCCO in iMensaje.Headers.Bcc)
                    {
                        iCCO.Add(direccionCCO.Address);
                    }
                    EmailDTO iNuevoMail = new EmailDTO(
                            pCuenta.ID,
                            iTipoCorreo,
                            iMensaje.Headers.From.Address,
                            iDestino,
                            iMensaje.Headers.Subject,
                            iCuerpo,
                            iMensaje.Headers.DateSent.ToString(),
                            true,
                            iCC,
                            iCCO,
                            iIDMensaje,
                            "No leído"
                        );
                    iListaCorreosDescargados.Add(iNuevoMail);
                }
            }
            catch (InvalidLoginException)
            {
                throw new ServiciosCorreoException("No se puede actualizar la bandeja de la cuenta " + pCuenta.Direccion + ". Hubo un problema en el acceso");
            }
            catch (PopServerNotFoundException)
            {
                throw new ServiciosCorreoException("No se puede actualizar la bandeja de la cuenta " + pCuenta.Direccion + ". Hubo un error en el acceso al servidor POP3 de Gmail");
            }
            catch (Exception)
            {
                throw new ServiciosCorreoException("No se puede actualizar la bandeja de la cuenta " + pCuenta.Direccion + ".");
            }
            return iListaCorreosDescargados;
            
        }
 /// <summary>
 /// Método ExisteCorreo.
 /// El método controla si existen o no los correos en la base de datos.
 /// </summary>
 /// <param name="pEmail">Email que se verifica si existe o no en la base de datos</param>
 /// <returns>TRUE en caso de que exista. FALSE en caso contrario</returns>
 public bool ExisteCorreo(EmailDTO pEmail)
 {
     bool iEncontrado = false;
     try
     {
         iFactory = DAOFactory.Instancia();
         iFactory.IniciarConexion();
         iFactory.ComenzarTransaccion();
         iEncontrado = iFactory.MailDAO().ExisteCorreo(pEmail);
         iFactory.Commit();
         return iEncontrado;
     }
     catch (Exception Ex)
     {
         iFactory.RollBack();
         throw new Exception(Ex.Message);
     }
     finally
     {
         iFactory.FinalizarConexion();
     }
 }
        /// <summary>
        /// Evento EventoEnviarMail.
        /// Se ejecuta en segundo plano para enviar mails a una casilla de correo especificada.
        /// </summary>
        public void EventoEnviarMail()
        {
            ControladorCuenta iControladorC = ControladorCuenta.Instancia;
            ControladorEmail iControladorE = ControladorEmail.Instancia;
            List<String> iDestinatarios = new List<String>();
            List<String> iCC = new List<String>();
            List<String> iCCO = new List<String>();
            MailMessage iMensaje = new MailMessage();
            EmailDTO iEmail = null;
            CuentaDTO iCuenta = null;

            if (comboBoxRemitente.SelectedItem == null)
            {
                MessageBox.Show("Existen campos incompletos. Se recomiendo que seleccione un remitente de los disponibles y luego agregue un destinatario. Luego pruebe enviar el mensaje nuevamente", "Campos incompletos", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else if (textBoxDestinatarios.Lines == null)
            {
                MessageBox.Show("Existen campos incompletos. Se recomiendo que agregue al menos un destinatario escrito en forma correcta. Luego pruebe enviar el mensaje nuevamente", "Campos incompletos o formato de mail inválidos", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else if (textBoxAsuntoMail.Text == "" || richTextBoxCuerpoMensajes.Text == "")
            {
                DialogResult Resultado = MessageBox.Show("Está a punto de enviar el mail sin un asunto definido o sin cuerpo. ¿Desea enviarlo de todas maneras?", "Email sin asunto o cuerpo", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information);
                if (Resultado == DialogResult.Yes)
                {
                    iMensaje.From = new MailAddress(comboBoxRemitente.SelectedItem.ToString());
                    foreach (string Linea in textBoxDestinatarios.Lines)
                    {
                        iMensaje.To.Add(new MailAddress(Linea));
                    }

                    foreach (string Linea in textBoxCC.Lines)
                    {
                        iMensaje.CC.Add(new MailAddress(Linea));
                    }

                    foreach (string Linea in textBoxCCO.Lines)
                    {
                        iMensaje.Bcc.Add(new MailAddress(Linea));
                    }

                    iMensaje.Subject = textBoxAsuntoMail.Text;
                    iMensaje.Body = richTextBoxCuerpoMensajes.Text;

                    foreach (TreeNode Nodo in treeViewAdjuntos.Nodes)
                    {
                        Attachment Adjunto = new Attachment(@Nodo.Text);
                        iMensaje.Attachments.Add(Adjunto);
                    }


                    foreach (string Linea in textBoxDestinatarios.Lines)
                    {
                        iDestinatarios.Add(Linea);
                    }
                    foreach (string Linea in textBoxCC.Lines)
                    {
                        iCC.Add(Linea);
                    }
                    foreach (string Linea in textBoxCCO.Lines)
                    {
                        iCCO.Add(Linea);
                    }

                    iCuenta = iControladorC.BuscarPorEmail(comboBoxRemitente.SelectedItem.ToString());
                    iEmail = new EmailDTO(iCuenta.ID, "Enviado", comboBoxRemitente.SelectedItem.ToString(), iDestinatarios, textBoxAsuntoMail.Text, richTextBoxCuerpoMensajes.Text, textBoxFechaMail.Text, true, iCC, iCCO);

                    iControladorE.EnviarEmail(iEmail, iCuenta, iMensaje);
                    MessageBox.Show("¡El mail fue enviado con éxito!", "Mail enviado", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    textBoxFechaMail.Refresh();
                }
            }
            else
            {
                foreach (string Linea in textBoxDestinatarios.Lines)
                {
                    iDestinatarios.Add(Linea);
                }
                foreach (string Linea in textBoxCC.Lines)
                {
                    iCC.Add(Linea);
                }
                foreach (string Linea in textBoxCCO.Lines)
                {
                    iCCO.Add(Linea);
                }

                iMensaje.From = new MailAddress(comboBoxRemitente.SelectedItem.ToString());
                foreach (string Linea in textBoxDestinatarios.Lines)
                {
                    iMensaje.To.Add(new MailAddress(Linea));
                }

                foreach (string Linea in textBoxCC.Lines)
                {
                    iMensaje.CC.Add(new MailAddress(Linea));
                }

                foreach (string Linea in textBoxCCO.Lines)
                {
                    iMensaje.Bcc.Add(new MailAddress(Linea));
                }

                iMensaje.Subject = textBoxAsuntoMail.Text;
                iMensaje.Body = richTextBoxCuerpoMensajes.Text;

                foreach (TreeNode Nodo in treeViewAdjuntos.Nodes)
                {
                    Attachment Adjunto = new Attachment(@Nodo.Text);
                    iMensaje.Attachments.Add(Adjunto);
                }

                iCuenta = iControladorC.BuscarPorEmail(comboBoxRemitente.SelectedItem.ToString());
                iEmail = new EmailDTO(iCuenta.ID, "Enviado", comboBoxRemitente.SelectedItem.ToString(), iDestinatarios, textBoxAsuntoMail.Text, richTextBoxCuerpoMensajes.Text, textBoxFechaMail.Text, true, iCC, iCCO);

                iControladorE.EnviarEmail(iEmail, iCuenta, iMensaje);
                textBoxFechaMail.Refresh();
            }
        }
        /// <summary>
        /// Método GuardarBorrador_Click.
        /// Permite guardar un email como borrador para ser enviado mas tarde si el usuario
        /// lo considera necesario.
        /// </summary>
        public void GuardarBorrador_Click(object pSender, EventArgs pEvento)
        {
            ControladorEmail iControladorE = ControladorEmail.Instancia;
            ControladorCuenta iControladorC = ControladorCuenta.Instancia;
            CuentaDTO iCuenta = null;
            List<String> iDestinatarios = new List<String>();
            List<String> iCC = new List<String>();
            List<String> iCCO = new List<String>();
            EmailDTO iEmailBorrador = null;
            string iRemitente = "";
            string iEstado = "Borrador";
            if (comboBoxRemitente.SelectedItem == null)
            {

                MessageBox.Show("No se pudo guardar el mensaje como borrador. Se recomienda que deje en el borrador constancia de, al menos, el remitente. Luego pruebe guardar el mensaje nuevamente", "No se pudo guardar el borrador", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            else
            {
                iRemitente = comboBoxRemitente.SelectedItem.ToString();
                iCuenta = iControladorC.BuscarPorEmail(comboBoxRemitente.SelectedItem.ToString());
                foreach (string Destinatario in textBoxDestinatarios.Lines)
                {
                    iDestinatarios.Add(Destinatario);
                }
                foreach (string CC in textBoxCC.Lines)
                {
                    iCC.Add(CC);
                }
                foreach (string CCO in textBoxCCO.Lines)
                {
                    iCCO.Add(CCO);
                }
                string iAsunto = textBoxAsuntoMail.Text;
                string iFecha = textBoxFechaMail.Text;
                string iCuerpo = richTextBoxCuerpoMensajes.Text;

                iEmailBorrador = new EmailDTO(iCuenta.ID, iEstado, iRemitente, iDestinatarios, iAsunto, iCuerpo, iFecha, true, iCC, iCCO, "", "Leído");
                iControladorE.GuardarCorreo(iEmailBorrador);
                MessageBox.Show("Mensaje ha sido guardado con éxito", "Borrador guardado", MessageBoxButtons.OK);
            }

        }
 /// <summary>
 /// Método ExisteCorreo.
 /// Controla si los mails existen o no en la base de datos.
 /// </summary>
 /// <param name="pEmail">Email a verificar si existe o no en la base de datos</param>
 /// <returns>TRUE en caso de que ya exista, FALSE en caso contrario</returns>
 public bool ExisteCorreo(EmailDTO pEmail)
 {
     bool encontrado = false;
     try
     {
         NpgsqlCommand comando = this.iConexion.CreateCommand();
         comando.CommandText = @"select * from email where idmensaje=@idmensaje and activo = 'true'";
         comando.Parameters.AddWithValue("@idmensaje", pEmail.IDMensaje);
         comando.Transaction = iTransaccion;
         DataTable tabla = new DataTable();
         using (NpgsqlDataAdapter adaptador = new NpgsqlDataAdapter(comando))
         {
             adaptador.Fill(tabla); 
             if (tabla.Rows.Count > 0)
             {
                 // En el caso de que la tabla tenga mas de un registro, el método devolverá true.
                 encontrado = true;
             }
         }
         return encontrado;
     }
     catch (NpgsqlException Ex)
     {
         throw new Exception(Ex.Message);
         throw new DAOException("Se ha producido un error");
     }
 }
        /// <summary>
        /// Método Insertar(). El método permite insertar un mail en la base de datos.
        /// </summary>
        /// <param name="pEmail">Objeto de tipo EmailDTO</param>
        public void Insertar(EmailDTO pEmail)
        {
            try
            {
                // Obtengo el máximo idMail que se encuentra en la base de datos
                // que corresponde al último Email que inserté
                // En el caso de que la tabla Email esté vacía, entonces
                // inicializamos idMail en 1.
                NpgsqlCommand cmd = new NpgsqlCommand("SELECT MAX(idmail) from email", this.iConexion, this.iTransaccion);
                NpgsqlCommand command = new NpgsqlCommand("SELECT COUNT(*) from email", this.iConexion, this.iTransaccion);
                int iCantidadRegistros = Convert.ToInt32(command.ExecuteScalar());
                int idMail;
                if (iCantidadRegistros == 0)
                {
                    idMail = 1;
                }
                else
                {
                    idMail = Convert.ToInt32(cmd.ExecuteScalar());
                    idMail++;
                }


                // Inserto el email en la base de datos
                NpgsqlCommand comando = new NpgsqlCommand("INSERT INTO Email(idmail,fecha,remitente,cuerpo,cuenta,asunto,estado,activo,idmensaje,leido) values(@idmail,@fecha,@remitente,@cuerpo,@cuenta,@asunto,@estado,@activo,@idmensaje,@leido)", this.iConexion, this.iTransaccion);
                comando.Parameters.AddWithValue("@idmail", idMail);
                comando.Parameters.AddWithValue("@fecha", pEmail.Fecha);
                comando.Parameters.AddWithValue("@remitente", pEmail.Remitente);
                comando.Parameters.AddWithValue("@cuerpo", pEmail.Cuerpo);
                comando.Parameters.AddWithValue("@cuenta", pEmail.Cuenta);
                comando.Parameters.AddWithValue("@asunto", pEmail.Asunto);
                comando.Parameters.AddWithValue("@estado", pEmail.Estado);
                comando.Parameters.AddWithValue("@activo", pEmail.Activo);
                comando.Parameters.AddWithValue("@idmensaje", pEmail.IDMensaje);
                comando.Parameters.AddWithValue("@leido", pEmail.Leido);
                comando.ExecuteNonQuery();



                // Obtengo el máximo idDestinatario que se encuentra en la base de datos
                // que corresponde al último destinatario que inserté
                // En el caso de que la tabla Destinatarios esté vacía, entonces
                // inicializamos idDestinatarios en 1.

                // Por cada dirección en la lista de destinatarios, creo una tupla en la base de datos
                foreach (string fDestinatario in pEmail.Destinatario)
                {
                    NpgsqlCommand com = new NpgsqlCommand("INSERT INTO destinatarios(direccion,tipo,idmail) values(@direccion,@tipo,@idmail)", this.iConexion, this.iTransaccion);
                    com.Parameters.AddWithValue("@direccion", fDestinatario);
                    com.Parameters.AddWithValue("@tipo", "D");
                    com.Parameters.AddWithValue("@idmail", idMail);
                    com.ExecuteNonQuery();
                }
                if (pEmail.ConCopia != null)
                {
                    //por cada direccion en la lista de ConCopia, creo una tupla en la base de datos
                    foreach (String CC in pEmail.ConCopia)
                    {
                        NpgsqlCommand com = new NpgsqlCommand("insert into destinatarios(direccion,tipo,idmail) values(@direccion,@tipo,@idmail)", this.iConexion, this.iTransaccion);

                        com.Parameters.AddWithValue("@direccion", CC);
                        com.Parameters.AddWithValue("@tipo", "CC");
                        com.Parameters.AddWithValue("@idMail", idMail);
                        com.ExecuteNonQuery();
                    }
                }
                if (pEmail.ConCopiaOculta != null)
                {
                    //por cada direccion en la lista de ConCopiaOculta, creo una tupla en la base de datos
                    foreach (String CCO in pEmail.ConCopiaOculta)
                    {
                        NpgsqlCommand com = new NpgsqlCommand("insert into destinatarios(direccion,tipo,idmail) values(@direccion,@tipo,@idmail)", this.iConexion, this.iTransaccion);
                        com.Parameters.AddWithValue("@direccion", CCO);
                        com.Parameters.AddWithValue("@tipo", "CCO");
                        com.Parameters.AddWithValue("@idMail", idMail);
                        com.ExecuteNonQuery();
                    }
                }

            }
            catch (NpgsqlException)
            {
                throw new DAOException("No se pudo insertar el email en la base de datos");
            }
        }
        /// <summary>
        /// Método ObtenerMail.
        /// Obtiene un único mail a partir de su ID
        /// </summary>
        /// <param name="pIDMail">ID del mail que necesitamos obtener</param>
        /// <returns>Email obtenido</returns>
        public EmailDTO ObtenerMail(int pIDMail)
        {
            EmailDTO EmailABuscar = null;
            try
            {
                NpgsqlCommand iComando = this.iConexion.CreateCommand();

                iComando.CommandText = "SELECT * FROM email WHERE idmail = @idmail;";
                iComando.Parameters.AddWithValue("@idmail", pIDMail);
                DataTable iTabla = new DataTable();
                NpgsqlDataAdapter iAdaptador = new NpgsqlDataAdapter(iComando);
                iAdaptador.Fill(iTabla);
                foreach (DataRow fila in iTabla.Rows)
                {
                    NpgsqlCommand iComandoDestinatario = new NpgsqlCommand("SELECT * FROM destinatarios WHERE idmail = @idmail and tipo = 'D'", this.iConexion);
                    iComandoDestinatario.Parameters.AddWithValue("@idmail", Convert.ToInt32(fila["idmail"].ToString()));
                    NpgsqlCommand iComandoCC = new NpgsqlCommand("SELECT * FROM destinatarios WHERE idmail = @idmail and tipo = 'CC'", this.iConexion);
                    iComandoCC.Parameters.AddWithValue("@idmail", Convert.ToInt32(fila["idmail"].ToString()));
                    NpgsqlCommand iComandoCCO = new NpgsqlCommand("SELECT * FROM destinatarios WHERE idmail = @idmail and tipo = 'CCO'", this.iConexion);
                    iComandoCCO.Parameters.AddWithValue("@idmail", Convert.ToInt32(fila["idmail"].ToString()));
                    // 3 listas para destinatario, CC y CCO
                    List<String> iListaDestinatarios = new List<String>();
                    List<String> iListaCC = new List<String>();
                    List<String> iListaCCO = new List<String>();
                    // 3 DataTable para llenar con los datos de la base de datos
                    DataTable dListaDestinatarios = new DataTable();
                    DataTable dListaCC = new DataTable();
                    DataTable dListaCCO = new DataTable();
                    // 3 adaptadores para llenar las tablas con los datos traídos de la base de datos
                    NpgsqlDataAdapter aDestinatarios = new NpgsqlDataAdapter(iComandoDestinatario);
                    NpgsqlDataAdapter aCC = new NpgsqlDataAdapter(iComandoCC);
                    NpgsqlDataAdapter aCCO = new NpgsqlDataAdapter(iComandoCCO);
                    // Llenamos las tablas
                    aDestinatarios.Fill(dListaDestinatarios);
                    aCC.Fill(dListaCC);
                    aCCO.Fill(dListaCCO);
                    foreach (DataRow otraFila in dListaDestinatarios.Rows)
                    {
                        iListaDestinatarios.Add(Convert.ToString(otraFila["direccion"]));
                    }
                    foreach (DataRow otraFila2 in dListaCC.Rows)
                    {
                        iListaCC.Add(Convert.ToString(otraFila2["direccion"]));
                    }
                    foreach (DataRow otraFila3 in dListaCCO.Rows)
                    {
                        iListaCCO.Add(Convert.ToString(otraFila3["direccion"]));
                    }
                    EmailABuscar = new EmailDTO(
                           Convert.ToInt32(fila["idmail"]),
                           Convert.ToInt32(fila["cuenta"]),
                           Convert.ToString(fila["estado"]),
                           Convert.ToString(fila["remitente"]),
                           iListaDestinatarios,
                           Convert.ToString(fila["asunto"]),
                           Convert.ToString(fila["cuerpo"]),
                           Convert.ToString(fila["fecha"]),
                           Convert.ToBoolean(fila["activo"]),
                           iListaCC,
                           iListaCCO,
                           Convert.ToString(fila["idmensaje"]),
                           Convert.ToString(fila["leido"])
                           );
                }
                return EmailABuscar;
            }
            catch (NpgsqlException ex)
            {
                throw new Exception(ex.Message);
                throw new DAOException("Error en la obtención de datos de correo. Revise la configuración de su servidor de Base de Datos y el nombre de su base de datos. Para más información consulte el manual de PostApp.");
            }
        }