2009-11-16 2 views
0

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

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

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

У вас есть обходной путь для этого?

Вот код, я использую (C#):

try 
     { 
      MailMessage mail = new MailMessage(); 

      mail.From = new MailAddress("[email protected]"); 
      mail.To.Add("[email protected]"); 

      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

ответ

1

Вызов

smtp.Send(mail); 

Посылает письмо на ваш SMTP-сервер немедленно. Если вы не видите отправленное письмо, как только эта строка будет выполнена, я проверил бы, правильно ли работает ваш SMTP-сервер.

Это more information на SmtpClient.

1

У меня была такая же проблема, и используя обходной путь размещенную на 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); 
+0

Я был бы очень осторожен с этим. См. Http://stackoverflow.com/questions/930236/net-best-method-to-send-email-system-net-mail-has-issues для получения дополнительной информации – NotMe

+0

Спасибо всем, кто ответил - это, казалось, сработало: D – Sagi1981

2

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

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

0

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

HTH

Смежные вопросы