none
¿Cómo cerrar el proceso donde se utiliza la ruta de un archivo? RRS feed

  • Pregunta

  • void EnviarCorreo()
            {
                System.Net.Mail.MailMessage mensaje = new System.Net.Mail.MailMessage();
                System.Net.Mail.SmtpClient cliente = new System.Net.Mail.SmtpClient();
    
                mensaje.To.Add(EmailEstudiante);
                mensaje.Subject = "Mensaje de Prueba con Archivos";
                mensaje.SubjectEncoding = System.Text.Encoding.UTF8;
    
                System.Net.Mail.Attachment archivo = new System.Net.Mail.Attachment(@"D:\FichaMatriculaEstudiante.pdf");
                mensaje.Attachments.Add(archivo);
                
    
                mensaje.Body = "Cuerpo de mensaje de prueba 02: Gracias por tu apoyo";
                mensaje.SubjectEncoding = System.Text.Encoding.UTF8;
    
                mensaje.IsBodyHtml = true;
    
                mensaje.From = new System.Net.Mail.MailAddress("CorreoUsuario@gmail.com");
    
                cliente.Credentials = new System.Net.NetworkCredential("CorreoUsuario@gmail.com","Contraseña");
                
                cliente.Port = 587;
                cliente.EnableSsl = true;
    
                cliente.Host = "smtp.gmail.com";
    
                try
                {
                    cliente.Send(mensaje); 
                }
                catch(Exception ex)
                {
                    MessageBox.Show(Convert.ToString(ex), "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
                finally
                {              
                    EliminarPDF();
                }
                
            }

    Metodo para envíar un correo electrónico con un archivo de adjunto.

    (@"D:\FichaMatriculaEstudiante.pdf")
    (@"D:\FichaMatriculaEstudiante.pdf")
    void EliminarPDF()
            {
                String ruta = @"D:\FichaMatriculaEstudiante.pdf";
                try
                {
                    if (File.Exists(ruta))
                    {
                        System.IO.File.Delete(ruta);
                    }
                    else
                    {
                        MessageBox.Show("¡El archivo ya no existe!", "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show("Error al borrar archivo: {0}"+ e.ToString(), "Alerta", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }
            }

    Luego para eliminar el archivo que eh enviado me sale el error de que aún se sigue utilizando el archivo en otro proceso, y me supongo que es en el de EnviarCorreo

    lunes, 23 de noviembre de 2020 19:14

Todas las respuestas

  • La clase System.Net.Mail.Attachment es IDisposable. Asegúrate de llamar a su método Dispose() cuando termines de enviar el correo, para que no mantenga bloqueado el archivo.

    Por cierto, el SmtpClient también es IDisposable y por tanto también deberías llamar a su Dispose(). Eso no afectará al bloqueo del archivo, pero si envías muchos correos muy seguidos puede ser que agotes las conexiones al servidor de correo y te empiece a dar errores.

    Puedes meter ambas llamadas en el finally, antes de llamar a EliminarPDF.

    lunes, 23 de noviembre de 2020 21:13
    Moderador
  • Muchas gracias por su ayuda, pero no entendí la parte de Agotar las conexiones al servidor, talves me puedas explicar, porque lo entiendo de esta manera, GMAIL te da una cierta cantidad de envíos de correos y luego tengo que comprar el servicio o que?
    martes, 24 de noviembre de 2020 2:28
  • No tiene nada que ver. Se refiere a las conexiones que abres y no cierras. Si abres una conexión y no la cierras, se queda abierta hasta que caduca su tiempo de espera o se ejecuta el Garbage Collector y la libera. En el caso del SmtpClient se refiere a la conexión TCP al puerto del servidor de correo. Se te pueden agotar las conexiones bien sea porque agotes los puertos efímeros de Windows, o porque el servidor de destino considere que al abrir miles de conexiones y no cerrarlas lo estás atacando, y te bloquee la apertura de nuevas conexiones.
    martes, 24 de noviembre de 2020 12:40
    Moderador
  • Hola VelizBruno, 

      

    ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las  respuestas proporcionadas?  

    Espero su respuesta.  

    Gracias por usar los foros de MSDN.  

    Andres Aguilar 

    ____________________________  

     

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar  MSDNFSF@microsoft.com. 

    martes, 24 de noviembre de 2020 20:27
    Moderador