O SMTP Send está travando meus arquivos - C#
-
18-09-2019 - |
Pergunta
Eu tenho uma função que está enviando mensagens (muitas delas) e seus anexos.
Basicamente, ele atravessa uma estrutura de diretório e cria e -mails de uma estrutura de arquivo, por exemplo
c:\emails\message01
\attachments
c:\emails\message02
\attachments
A criação das mensagens ocorre usando .NET C#, Standard Stuff.
Depois que todas as mensagens são criadas ... tenho outra função que funciona diretamente depois que copia a pasta de mensagens para outro local.
O problema é: os arquivos estão bloqueados ...
Nota: não estou movendo os arquivos, apenas copiando -os ....
Alguma sugestão sobre como copiar arquivos bloqueados, usando C#?
Atualizar
Eu tenho esse método de addings anexos
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));
}
}
Solução
Como você está lendo os arquivos para criar a mensagem de email? Eles devem ser abertos como somente leitura, com um FileShare
definido como FileShare.ReadWrite
... então eles não devem estar trancados. Se você estiver usando um FileStream
você também deve envolver sua lógica no using
palavra -chave para que o recurso seja descartado corretamente.
Atualizar:
Acredito que descartar a mensagem de email em si fechará os recursos dentro dela e desbloqueará os arquivos:
using (var mail = new MailMessage())
{
AddAttachments(mail);
}
// File copy code should work here
Outras dicas
Odeio responder ao meu próprio post, mas sim, para o próximo pobre rapaz que tem esse problema aqui é a correção:
Depois de enviar a mensagem
// Send the mail
client.Send(message);
//Clean up attachments
foreach (Attachment attachment in message.Attachments)
{
attachment.Dispose();
}
Descarte os anexos ... limpa o bloqueio e as mensagens ainda serão enviadas com anexos. Dispone não exclui os arquivos, apenas limpa os anexos :)
Você está fechando os arquivos depois de terminar de lê -los? Se você os abrir para leitura, mas não os feche quando terminar, ele deve manter um bloqueio até que o programa sai e feche automaticamente todos os arquivos.
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);
}
}
Eu vejo muito isso ao enviar anexos. Eu normalmente uso algo como o seguinte:
No código que move os arquivos para um local diferente, você pode usar o seguinte padrão:
Dentro do loop para loop através dos arquivos
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.
}
}