Ошибка отправки почты асинхронно - PullRequest
0 голосов
/ 04 июня 2009

Я пытаюсь асинхронно отправить электронное письмо с вложением, используя класс .net SMPTClient:

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, потому что он используется другим процессом». Кроме того, почта не доставляется. Если я использую метод Send вместо SendAsync, то доставка почты работает.

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

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

Ответы [ 2 ]

1 голос
/ 04 июня 2009

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

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

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

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

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

1 голос
/ 04 июня 2009

Во-первых, вы должны подключить SendCompletedEventHandler ПЕРЕД тем, как вы выполните SendAsync. то есть:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...