2009-06-04 2 views
0

Am пытается асинхронно отправить электронное письмо с классом SMPTClient прикрепленных файлов с использованием .NET в:Ошибка отправки почта асинхронно

SmtpClient smtp = new SmtpClient(MailServer); 

       smtp.SendAsync(mailMsg, ""); 

       smtp.SendCompleted += new SendCompletedEventHandler(MailSentCallback); 

       mailMsg.Dispose(); 

Мне нужно удалить файл вложение с моим сервера, как только почта успешно отправлена.

private static void MailSentCallback(object sender, AsyncCompletedEventArgs e) 
     { 
      File.Delete(myAttachment); 
     } 

Но когда этот метод называется, я получаю сообщение об ошибке: «Процесс не может получить доступ к файлу„myAttachment“, так как он используется другим процессом.» Кроме того, почта не доставляется. Если я использую метод отправки вместо SendAsync, тогда доставка почты работает.

Что мне здесь не хватает?

Спасибо за чтение!

ответ

1

Хорошо, прежде всего, как говорит mundeep, подключите обработчик событий до вызова SendAsync.

Кроме того, не делайте Dispose() сообщение о том, что вы делаете, потому что в этот момент его, возможно, еще не «отправили» ... вы в основном потенциально развращаете сообщение, а SmtpClient пытается его обработать.

Теперь, что касается вашей реальной проблемы, у меня была та же проблема, и из памяти файл все еще удерживается SmtpClient во время обратного вызова, поэтому вы действительно не можете его удалить. Я думаю, что прикрепление файла в файловой системе действительно лучше всего использовать, если это постоянный файл.

Если вы пытаетесь отправить временный файл, загрузите его в MemoryStream и создайте Attachment.

Мне кажется, что вы можете решить проблему удаления вложений, сначала удалив объект Attachment в обработчик обратного вызова, прежде чем пытаться удалить файл ... хотя я очень тщательно тестировал, что это не вызывают другие побочные эффекты.

+0

спасибо jerryjvl ...! Теперь я использую Memorystream и привязываю его к почтовому сообщению на лету .... работает как шарм без каких-либо ошибок «файл используется другими процессами» ... еще раз спасибо! –

1

Во-первых, вы должны подключить SendCompletedEventHandler до того, как вы выполните SendAsync. т.е.

//Wire up SendCompetedEventHandler 
smtp.SendCompleted += new SendCompletedEventHandler(MailSentCallback); 
//Send the Message 
smtp.SendAsync(mailMsg, ""); 

Во-вторых, где myAttachment объявлен? Каков его объем?

+0

спасибо за ур вход mundeep! –