Сообщение CDO не отправлено, и прикрепленный файл сообщения не может быть свободно удален
Я пытаюсь отправить сообщение с вложением, используя объект CDO. Когда SMTP-сервер доступен и вся информация верна, сообщение корректно отправляется с вложением.
Однако, если SMTP-сервер неверен, сообщение не отправляется (как ожидалось), но кажется, что оно "застряло" где-то. Я использую:
Fields["http://schemas.microsoft.com/cdo/configuration/sendusing"] = 2
Я искал по Интернету и обнаружил, что этот параметр даст 60-секундный тайм-аут. Но файл, который я прикрепил к сообщению, никогда не доступен.
Тест, который я сделал, - это отправить сообщение с прикрепленным файлом и использовать недопустимый SMTP-сервер. Затем я подожду несколько минут и попытаюсь удалить прикрепленный файл. Однако, когда я пытаюсь это сделать, у меня возникает проблема с разрешением. Когда я убиваю программу отправки электронной почты, я могу удалить файл.
Я хочу знать, как настроить время ожидания, чтобы оно перестало отправлять сообщение, как я "отсоединяю" файл, когда сообщение не отправлено, и как заставить программу ждать отправки сообщения (я хочу отправить) сообщение, а затем удалите прикрепленный файл с компьютера. Поэтому мне нужно знать, когда сообщение действительно было отправлено или когда истекло время ожидания).
1 ответ
CDO безнадежно устарел, вам действительно нужно подумать о переходе на System.Net.Mail. Конкретная проблема звучит как проблема блокировки файлов. Крякает, как ошибка в CDO, он открывает вложение для составления сообщения электронной почты, но забывает закрыть файл, когда SMTP-сервер блокируется.
Эта ошибка, вероятно, усугубляется тем, что.NET работает с COM-серверами, такими как CDO. COM-объект не освобождается, пока не будет запущен сборщик мусора. Что может занять некоторое время, особенно когда ваша программа не делает ничего существенного после попытки отправить электронное письмо. Обходным путем для этого является вызов Marshal.ReleaseComObject() для объекта CDO. Как правило, не работает, когда у вас есть другие ссылки на интерфейсы CDO в вашей программе, эти ссылки, как правило, скрыты. GC.Collect() + GC.WaitForPendingFinalizers() - это большой молот после того, как вы обнулили любую ссылку на объект.
Но, действительно, используйте System.Net.Mail.