Почта не отправляется до тех пор, пока я не прерву свою заявку - System.Mail.Net - PullRequest
1 голос
/ 16 ноября 2009

Я написал простой код для отправки автоматически сгенерированной электронной почты, используя пространство имен System.mail.Net.

Это работает как шарм, но есть одна маленькая проблема.

Письмо не отправляется, пока все мое приложение не будет прекращено.

Есть ли у кого-нибудь из них обходной путь?

Вот код, который я использую (c #):

try
        {
            MailMessage mail = new MailMessage();

            mail.From = new MailAddress("myEmail@mail.com");
            mail.To.Add("targetEmail@mail.com");

            mail.Subject = "Test test";
            mail.Body = "blah blah";

            mail.Attachments.Add(new Attachment("c:\\file.txt"));  

            SmtpClient smtp = new SmtpClient("myserver.mail.com");
            smtp.Send(mail);
        }
        catch (SmtpFailedRecipientsException ex)
        {
            Console.WriteLine(ex);
        }

Как я уже сказал, все работает, но почта не отправляется, пока я не закрою приложение.

Есть ли способ заставить его отправить почту сейчас?

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

С наилучшими пожеланиями

/ S

Ответы [ 4 ]

3 голосов
/ 16 ноября 2009

У меня была такая же проблема, и использование обходного пути, размещенного на http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/6ce868ba-220f-4ff1-b755-ad9eb2e2b13d/, похоже, работает:

Для тех, кто заинтересован, я нашел решение или, по крайней мере, обходной путь задержки.

Член ServicePoint содержит члена с именем MaxIdleTime. Установка этого значения в 0, похоже, имеет тот же эффект, что и Timeout.Infinite (который я предполагаю также 0). При установке значения 1 мое письмо было немедленно отправлено.

См. Ссылку:

http://msdn2.microsoft.com/en-us/library/system.net.servicepoint.maxidletime.aspx

Пример кода:

SmtpClient smtp = new SmtpClient();

// setup the mail message

smtp.ServicePoint.MaxIdleTime = 1;

smtp.Send(myMailMessage);
2 голосов
/ 16 ноября 2009

Интересно, имеет ли ваше приложение блокировку на вложении, которая не позволяет почтовому компоненту выполнять свою работу, пока ваше приложение не завершит работу. Можете ли вы проверить, что все блокировки сняты до отправки почты?

Вы можете начать с нового небольшого приложения, которое отправляет только электронное письмо. Как только это работает должным образом, добавьте жестко закодированное приложение. Убедитесь, что он все еще работает. Если все хорошо, добавьте свой код для обработки вложений. Если он сломается, настройте код. Промыть и повторить. ;)

1 голос
/ 16 ноября 2009

Звонок

smtp.Send(mail);

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

Вот больше информации о SmtpClient.

0 голосов
/ 16 ноября 2009

Я видел эту проблему раньше. Мне пришлось отключить сканирование исходящей электронной почты Norton Antivirus, чтобы сразу отправлять электронные письма.

НТН

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