Подтвердить что ты не робот

SMTP Send блокирует мои файлы - С#

У меня есть функция, которая отправляет сообщения (многие из них) и их вложения.

Он в основном выполняет петлю через структуру каталогов и создает электронные письма из файловой структуры, например

 c:\emails\message01
                \attachments
 c:\emails\message02
                \attachments

Создание сообщений происходит с использованием .net С#, стандартного материала.

После создания всех сообщений... У меня есть другая функция, которая запускается сразу после этого, которая копирует папку сообщений в другое место.

Проблема в том, что файлы заблокированы...

Примечание. Я не перемещаю файлы, просто копируя их....

Любые предложения о том, как скопировать заблокированные файлы, используя С#?

Обновление

У меня есть этот метод добавления вложений

    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));
        }
    }
4b9b3361

Ответ 1

Как вы читаете файлы для создания сообщения электронной почты? Они должны быть открыты только для чтения, а FileShare установлен на FileShare.ReadWrite... тогда они не должны быть заблокированы. Если вы используете FileStream, вы также должны обернуть свою логику в ключе using, чтобы ресурс был правильно установлен.

Обновление:

Я считаю, что удаление самого почтового сообщения закроет в нем ресурсы и разблокирует файлы:

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

Ответ 2

Ненавижу отвечать на мой собственный пост, но да, для следующего бедного парня, у которого есть эта проблема, есть исправление:

ПОСЛЕ ОТПРАВКИ СООБЩЕНИЯ

        // Send the mail
        client.Send(message);

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

Утилизируйте вложения... очищает блокировку, и сообщения все равно будут отправляться с вложениями. Dispose НЕ удаляет файлы, просто удаляет вложения:)

Ответ 3

Закрываете ли вы файлы после их чтения? Если вы откроете их для чтения, но не закрывайте их, когда вы закончите, он должен заблокировать его, пока программа не выйдет и автоматически закрывает все файлы.

Ответ 4

    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); 
      }
    }

Ответ 5

Я вижу это при отправке вложений. Обычно я использую что-то вроде следующего:

В коде, который перемещает файлы в другое место, вы можете использовать следующий шаблон:

Внутри цикла для прокрутки файлов

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.
   }

}