2010-05-18 19 views
14

estoy usando System.Net.Mail para enviar correos electrónicos en asp.net .. cómo eliminar el archivo adjunto después de enviarlo como archivo adjunto ... intenté usar el método File.Delete ... pero recibo este error. el proceso no puede acceder a la ruta del archivo \ fun.jpg 'porque está siendo utilizado por otro proceso. graciasborrar el archivo adjunto

Respuesta

26

Eliminar el MailMessage cuando haya terminado con él. Todavía tiene un bloqueo en el archivo que ha agregado como archivo adjunto hasta que lo haya hecho.

var filePath = "C:\\path\\to\\file.txt"; 
var smtpClient = new SmtpClient("mailhost"); 
using (var message = new MailMessage()) 
{ 
    message.To.Add("[email protected]"); 
    message.From = new MailAddress("[email protected]"); 
    message.Subject = "Test"; 
    message.SubjectEncoding = Encoding.UTF8; 
    message.Body = "Test " + DateTime.Now; 
    message.Attachments.Add(new Attachment(filePath)); 
} 
if (File.Exists(filePath)) File.Delete(filePath); 
Console.WriteLine(File.Exists(filePath)); 

Salida: Falso

Me imagino que si usted todavía tiene algo de bloqueo del archivo después de desechar el mensaje, que es probable que tenga otro bloqueo en el archivo, pero sin código, que no puede dejar de tú.

1

No puede eliminar un archivo adjunto después de enviar el correo. Antes de enviar puede eliminar.

Lo que dice el error, la ruta que ha mencionado está utilizando algún otro proceso.

MailMessage Message = new MailMessage(); 

Message.Subject = "Attachment Test"; 
Message.Body = "Check out the attachment!"; 
Message.To.Add("[email protected]"); 
Message.From = "[email protected]"; 

Message.Attachments.Add(new Attachment(memorystream, "test.txt", MediaTypeNames.Application.Text)); 

en cuenta que hemos creado el archivo adjunto desde el MemoryStream y llegamos a nombrar el archivo adjunto nada que queremos. El nombre del archivo adjunto en el segundo parámetro es el nombre del archivo en el correo electrónico, no el nombre en el disco duro del sistema local. De hecho, el archivo adjunto nunca va al disco duro local. El tercer parámetro es el tipo de Mime del archivo adjunto, en nuestro caso esto es texto.

Editar: use Dispose() the mail

+0

creo que es necesario disponer los objetos de apego. – anishMarokey

0

Ampliación de la clase MailMessage es una buena manera de resolver esto y reducir las posibilidades de encontrarse con este problema de nuevo ...

class MyMailMessage : MailMessage, IDisposable 
{ 
    private List<string> _tempFiles = new List<string>(); 

    public void Attach(string filename) 
    { 
     base.Attachments.Add(new Attachment(filename)); 
     this._tempFiles.add(filename); 
    } 

    new public void Dispose() 
    { 
     base.Dispose(); 
     this._tempFiles.Foreach(x => File.Delete(x)); 
    } 
} 

... y recuerda utilizar con un 'utilizar' constructo (que usted debe utilizar de todos modos) ...

using(SmtpClient client = GetMySmtpClient()) 
using(MyMailMessage msd = new MyMailMessage()) 
{ 
    msg.Attach(filename); 
    client.send(msg); 
} 
0

Sólo tiene que disponer el objeto de mensaje antes de borrar el archivo. Por ejemplo:

Dim message As New MailMessage 
    message.From = New MailAddress(fromEmail, fromName) 
    message.Subject = subject 
    message.CC.Add(toCCEmail) 
    message.Bcc.Add(toBCCEmail) 
    Dim attach As Attachment = New Attachment(attachmentPath) 
    message.Attachments.Add(attach) 
    message.IsBodyHtml = True 
    message.Body = body 
    mailClient.Send(message) 

    message.Dispose() 'Add this line to dispose the message! 
0

Si el correo tiene un montón adjuntos

List<Attachments> lstAtt = new List<Attachments>(); 
Attachment att = new Attachment(file); 
lstAtt.Add(att); 

//finally 
foreach(var a in lstAtt) 
{ 
    a.Dispose(); 
} 

//delete file 
Cuestiones relacionadas