2012-12-03 2 views
2

В консольном приложении Windows, с .NET 3.5 (я изменил существующий .NET 2.0 приложение для .NET 3,5).NET 3.5 SmtpClient - отказ отправка электронной почты - работает только после перезагрузки каждого раза

У меня есть странная проблема, код для отправки сообщений электронной почты несколько раз (может быть от 5 до 10 раз).

После нескольких раз он не может отправить электронное письмо с сообщением «Отказ отправки почты». Этот же код работает после перезапуска системы. (что не является ожидаемым решением в производстве).

Вот кусок кода, я чувствовал, где-то у меня есть это соединение SmtpClient. поэтому я установил клиент в null и вызвал GC.Collect, но не помог мне.

Пожалуйста, помогите



private static void SendEmail(MailMessage msg) 
{ 
      SmtpClient client = new SmtpClient(GetSMTPServer(), GetSMTPPort()); 

      client.Credentials = CredentialCache.DefaultNetworkCredentials; 
      client.EnableSsl = false; 
      client.ServicePoint.MaxIdleTime = 1; 
      //client.Timeout = GetSMTPTimeout(); 30000000 
      client.Send(msg); 
      client = null; 
      GC.Collect(); 
} 


+1

Детали исключения не хватает, захвата деталей исключения. –

+0

- \t \t \t Smex { "Ошибка отправки почты."} \t System.Net.Mail.SmtpException - \t \t \t InnerException { "Не удается прочитать данные из транспортного соединения:. Net_io_connectionclosed"} \t System.Exception {System. IO.IOException} – Bennz

+0

проверить http://stackoverflow.com/questions/1143846/unable-to-read-data-from-the-transport-connection-net-io-connectionclosed и подобные вопросы –

ответ

1

Если интервал между двумя отправки почты больше, чем за 60 секунд и меньше чем за 90 секунд, вы получите эту ошибку определенно.

например, вы отправляете первое электронное письмо в 8:08:08 утра, а затем отправляете второе письмо в 8:09:10, исключение будет выбрасываться.

Это ошибка в настройках SmtpClient.TimeOut, вы не можете ее изменить.

как решить эту проблему? три способа:

  1. попробуйте поймать отправку, если поймать исключение, отправить еще раз.
  2. SmtpClient.Dispose() для .NET Framework 3.0 и выше
  3. набора SmtpClient.servicepoint.maxidletime=1000; набора-слишком мал, не работает в режиме отладки
2

Попробуйте просто используя using блок, чтобы правильно расположить SmtpClient после отправки.

private static void SendEmail(MailMessage msg) 
{ 
    using(SmtpClient client = new SmtpClient(GetSMTPServer(), GetSMTPPort())) 
    { 
     client.Credentials = CredentialCache.DefaultNetworkCredentials; 
     client.EnableSsl = false; 
     client.Send(msg); 
    } 
} 

Смотрите также: .NET Best Method to Send Email (System.Net.Mail has issues)

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