Сообщение CDO не отправлено, и прикрепленный файл сообщения не может быть свободно удален - PullRequest
0 голосов
/ 18 августа 2010

Я пытаюсь отправить сообщение с вложением, используя объект CDO. Когда SMTP-сервер доступен и вся информация верна, сообщение корректно отправляется с вложением.

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

Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"] = 2

Я искал по Интернету и обнаружил, что этот параметр даст 60-секундный тайм-аут. Но файл, который я прикрепил к сообщению, никогда не доступен.

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

Я хочу знать, как настроить время ожидания, чтобы оно перестало отправлять сообщение, как я «отсоединяю» файл, когда сообщение не отправлено, и как заставить программу ждать отправки сообщения (я хочу отправить сообщение, а затем стереть прикрепленный файл с компьютера. Поэтому мне нужно знать, когда сообщение действительно было отправлено или когда истекло время ожидания).

1 Ответ

1 голос
/ 18 августа 2010

CDO безнадежно устарел, вам действительно нужно подумать о переходе на System.Net.Mail. Конкретная проблема звучит как проблема блокировки файлов. Крякает, как ошибка в CDO, он открывает вложение для составления сообщения электронной почты, но забывает закрыть файл, когда SMTP-сервер блокируется.

Эта ошибка, вероятно, усугубляется тем, что .NET работает с COM-серверами, такими как CDO. COM-объект не освобождается до запуска сборщика мусора. Что может занять некоторое время, особенно когда ваша программа не делает ничего существенного после попытки отправить электронное письмо. Обходным путем для этого является вызов Marshal.ReleaseComObject () для объекта CDO. Как правило, не работает, когда у вас есть другие ссылки на интерфейсы CDO в вашей программе, эти ссылки, как правило, скрыты. GC.Collect () + GC.WaitForPendingFinalizers () - это большой молот после того, как вы обнулили любую ссылку на объект.

Но, действительно, используйте System.Net.Mail.

...