Enviar SMTP se bloquea mis archivos - C #
-
18-09-2019 - |
Pregunta
Tengo una función que eso es el envío de mensajes (muchos de ellos) y sus archivos adjuntos.
Es básicamente un bucle a través de una estructura de directorios y crea mensajes de correo electrónico desde una estructura de archivos, por ejemplo,
c:\emails\message01
\attachments
c:\emails\message02
\attachments
La creación de los mensajes se lleva a cabo utilizando .NET en C #, material estándar.
Una vez creados todos los mensajes ... tengo otra función que se ejecuta directamente después de 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, simplemente copiándolos ....
¿Alguna sugerencia sobre cómo copiar archivos bloqueados, usando C #?
Actualizar
Tengo este método 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));
}
}
Solución
¿Cómo estás leyendo los archivos para crear el mensaje de correo electrónico? Ellos deben abrirse como de sólo lectura, con una FileShare
establece en FileShare.ReadWrite
... entonces no deben estar bloqueadas. Si está utilizando un FileStream
también debe envolver su lógica en la palabra clave using
por lo que el recurso está dispuesto correctamente.
Actualización:
Creo que la eliminación del propio mensaje de correo se cerrará recursos dentro de ella y desbloquear los archivos:
using (var mail = new MailMessage())
{
AddAttachments(mail);
}
// File copy code should work here
Otros consejos
odio responder a mi propio puesto, pero sí para el siguiente chico pobre que tiene este problema aquí es 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();
}
Desechar los archivos adjuntos ... borra la cerradura y los mensajes serán enviados con archivos adjuntos. Disponer no elimina los archivos, simplemente borra los archivos adjuntos:)
¿Está el cierre de los archivos después de haber terminado de leerlos? Si se abren para la lectura, pero no cierra cuando haya terminado, se debe mantener un bloqueo en ella hasta que el programa se cierra y se cierra automáticamente todos los archivos.
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);
}
}
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 utilizar el siguiente patrón:
Dentro del bucle para recorrer a través de 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.
}
}