smtpexception net mail error enviar correo c# smtp locked-files

net - send email c#



El envío SMTP está bloqueando mis archivos-c# (5)

¿Cómo estás leyendo los archivos para crear el mensaje de correo electrónico? Deben abrirse como de solo lectura, con un FileShare configurado en FileShare.ReadWrite ... entonces no deben estar bloqueados. Si está utilizando un FileStream , también debe ajustar su lógica con la palabra clave de using para que el recurso se elimine correctamente.

Actualizar:

Creo que eliminar el mensaje de correo cerrará los recursos y desbloqueará los archivos:

using (var mail = new MailMessage()) { AddAttachments(mail); } // File copy code should work here

Tengo una función que está enviando mensajes (muchos de ellos) y sus archivos adjuntos.

Básicamente recorre una estructura de directorios y crea correos electrónicos a partir de una estructura de archivos, por ejemplo.

c:/emails/message01 /attachments c:/emails/message02 /attachments

La creación de los mensajes se realiza utilizando .net c #, material estándar.

Después de crear todos los mensajes ... Tengo otra función que se ejecuta directamente después que copia la carpeta de mensajes a otra ubicación.

El problema es que los archivos están bloqueados ...

Nota: No estoy moviendo los archivos, solo los estoy copiando ...

¿Alguna sugerencia sobre cómo copiar archivos bloqueados, usando c #?

Actualizar

Tengo este método de añadir archivos adjuntos

private void AddAttachments(MailMessage mail) { string attachmentDirectoryPath = "c:/messages/message1"; DirectoryInfo attachmentDirectory = new DirectoryInfo(attachmentDirectoryPath); FileInfo[] attachments = attachmentDirectory.GetFiles(); foreach (FileInfo attachment in attachments) { mail.Attachments.Add(new Attachment(attachment.FullName)); } }


¿Estás cerrando los archivos después de terminar de leerlos? Si los abre para leerlos, pero no los cierra cuando termina, debe mantenerlos bloqueados hasta que el programa salga y cierre automáticamente todos los archivos.


Odio responder a mi propio mensaje, pero sí, para el próximo pobre hombre que tiene este problema aquí está la solución:

DESPUÉS DE ENVIAR EL MENSAJE

// Send the mail client.Send(message); //Clean up attachments foreach (Attachment attachment in message.Attachments) { attachment.Dispose(); }

Eliminar los archivos adjuntos ... borra el bloqueo, y los mensajes se seguirán enviando con los archivos adjuntos. Eliminar NO borra los archivos, solo borra los archivos adjuntos :)


Veo esto mucho al enviar archivos adjuntos. Normalmente uso algo como lo siguiente:

En el código que mueve los archivos a una ubicación diferente, puede usar el siguiente patrón:

Dentro del bucle para recorrer en bucle los archivos.

bool FileOk = false; while (!FileOk) { try { // code to move the file FileOk = true; } catch(Exception) { // do nothing or write some code to pause the thread for a few seconds. } }


MailMessage email = new MailMessage(); email.From = txtFrom.Text; email.To = txtToEmail.Text; email.Subject = txtMSubject.Text; email.Body = txtBody.Text; SmtpClient mailClient = new SmtpClient(); mailClient.Host = "smtp.emailAddress"; mailClient.Port = 2525; mailClient.Send(email ); email.Dispose(); // After Disposing the email object you can call file delete if (filePath != "") { if (System.IO.File.Exists(filePath)) { System.IO.File.Delete(filePath); } }