SMTP Отправить заблокирует мои файлы - C#
-
18-09-2019 - |
Вопрос
У меня есть функция, которая отправляет сообщения (много из них) и их вложения.
Он в основном проходит через структуру каталога и создает электронные письма из структуры файла, например,
c:\emails\message01
\attachments
c:\emails\message02
\attachments
Создание сообщений происходит с использованием .NET C#, Standard Stuff.
После того, как все сообщения создаются ... У меня есть еще одна функция, которая запускается сразу после этого, которая копирует папку сообщения в другое место.
Проблема в том, что файлы заблокированы ...
Примечание: я не перемещаю файлы, просто копирую их ....
Есть предложения о том, как скопировать заблокированные файлы, используя C#?
Обновлять
У меня есть этот метод добавления вложений
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));
}
}
Решение
Как вы читаете файлы для создания сообщения электронной почты? Они должны быть открыты как только для чтения, с FileShare
установлен в FileShare.ReadWrite
... тогда они не должны быть заблокированы. Если вы используете FileStream
Вы также должны обернуть свою логику в using
Ключевое слово, чтобы ресурс был утилизирован должным образом.
Обновлять:
Я полагаю, что утилизация почтового сообщения закроет ресурсы внутри него и разблокирует файлы:
using (var mail = new MailMessage())
{
AddAttachments(mail);
}
// File copy code should work here
Другие советы
Ненавижу отвечать на мой собственный пост, но да, для следующего бедного парня, у которого есть эта проблема, это исправление:
После того, как вы отправите сообщение
// Send the mail
client.Send(message);
//Clean up attachments
foreach (Attachment attachment in message.Attachments)
{
attachment.Dispose();
}
Утилизируйте вложения ... Очистите блокировку, и сообщения все еще будут отправлены с вложениями. Распоряжение не удаляет файлы, просто очищает вложения :)
Вы закрываете файлы после того, как закончите их читать? Если вы откроете их для чтения, но не закройте их, когда вы закончите, это должно держать заблокирован, пока программа не выходит и автоматически не закрывает все файлы.
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);
}
}
Я много вижу при отправке вложений. Обычно я использую что -то вроде следующего:
В коде, который перемещает файлы в другое место, вы можете использовать следующий шаблон:
Внутри цикла для цикла через файлы
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.
}
}