2010-05-25 3 views
2

У меня есть приложение, которое использует SmtpClient для отправки E-Mail, но E-Mail не отправляется до закрытия приложения. Я искал и искал, чтобы найти решение проблемы, но я не могу ее найти.Электронная почта не отправлена ​​до закрытия приложения

В системе установлен антивирус Symantec, что может быть проблемой.

У кого-нибудь есть решение этой проблемы?

Вот код, который я использую.

public class EMail 
{ 
    private string server; 
    public string Server {get{return this.server;}set{this.server = value;}} 
    private string to; 
    public string To {get{return this.to;}set{this.to = value;}} 
    private string from; 
    public string From {get{return this.from;}set{this.from = value;}} 
    private string subject; 
    public string Subject {get{return this.subject;}set{this.subject = value;}} 
    private string body; 
    public string Body {get{return this.body;}set{this.body = value;}} 

    public EMail() 
    {} 
    public EMail(string _server, string _to, string _from, string _subject, string _body) 
    { 
     this.Server = _server; 
     this.To = _to; 
     this.From = _from; 
     this.Subject = _subject; 
     this.Body = _body; 
    } 

    public void Send() 
    { 
     using(System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(this.From, this.To, this.Subject, this.Body)) 
     {   
      message.IsBodyHtml = true; 
      System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(this.Server); 
      client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network; 
      //I have tried this, but it still does not work. 
      //client.ServicePoint.ConnectionLeaseTimeout = 0; 
      try 
      { 
       client.Send(message); 
      } 
      catch(System.Exception ex) 
      { 
       System.Windows.Forms.MessageBox.Show(ex.ToString());    
      } 
     } 
    } 
} 

Edit:

Оказывается, письмо действительно в конечном счете отправить через 2-3 минуты. Кажется, что он помещен в очередь сервером обмена, или соединение SmtpClient в конечном итоге истекает и закрывается сервером.

Edit:

Я попробовал.

client.ServicePoint.ConnectionLeaseTimeout = 1; 
client.ServicePoint.MaxIdleTime = 1; 

ответ

5

Я наконец-то; после всей помощи StackOverflow и других различных источников исследований, нашли решение. Установив System.Net.ServicePointManager.MaxServicePointIdleTime = 1, почта отправляется немедленно.

Вот окончательный код.

public class EMail 
{ 
    private string server; 
    public string Server {get{return this.server;}set{this.server = value;}} 
    private string to; 
    public string To {get{return this.to;}set{this.to = value;}} 
    private string from; 
    public string From {get{return this.from;}set{this.from = value;}} 
    private string subject; 
    public string Subject {get{return this.subject;}set{this.subject = value;}} 
    private string body; 
    public string Body {get{return this.body;}set{this.body = value;}} 

    public EMail() 
    {} 
    public EMail(string _server, string _to, string _from, string _subject, string _body) 
    { 
     this.Server = _server; 
     this.To = _to; 
     this.From = _from; 
     this.Subject = _subject; 
     this.Body = _body; 
    } 

    public void Send() 
    { 
     using(System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(this.From, this.To, this.Subject, this.Body)) 
     {   
      message.IsBodyHtml = true; 
      System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(this.Server); 
      client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network; 

      int temp = System.Net.ServicePointManager.MaxServicePointIdleTime; //<- Store the original value. 
      System.Net.ServicePointManager.MaxServicePointIdleTime = 1; //<- Change the idle time to 1. 

      try 
      { 
       client.Send(message); 
      } 
      catch(System.Exception ex) 
      { 
       System.Windows.Forms.MessageBox.Show(ex.ToString());    
      } 
      finally 
      { 
       System.Net.ServicePointManager.MaxServicePointIdleTime = temp; //<- Set the idle time back to what it was. 
      } 
     } 
    } 
} 

Благодарим всех вас за помощь! Особенно icemanind.

+0

Это сработало для меня. Благодаря! – NL3294

3

Возможная причина в том, что соединение остается открытым. Попробуйте закрыть соединение в конце метода отправки и посмотреть, работает ли это.

Редактировать: похоже, что в .NET 4.0 теперь SMtpClient реализует IDispose.

+1

Я не верю, что SMTPClient наследует IDisposable и не имеет метода тесной связи. Поэтому я не думаю, что это возможно. – Icemanind

+0

SMTPClient Не имеет метода Dispose или Close, несмотря на то, что говорит документация. Я попытался вызвать Dispose(), но код не будет компилироваться. – Tester101

+0

Да, он не будет компилироваться, потому что он не реализует IDisposable, то есть не существует метода Dispose(). – Icemanind

2

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

+0

Это не практическое решение. – Tester101

+0

Возможно, нет, но это определенно является причиной этой проблемы. – Icemanind

+0

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

0

Кроме того, для любых типов одноразовых как System.Net.Mail.MailMessage вы должны использовали «используя» блок:

public void Send() 
{ 
    using (System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(this.From, this.To, this.Subject, this.Body)) 
    { 
     message.IsBodyHtml = true; 
     System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(this.Server); 
     client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network; 
     try 
     { 
      client.Send(message); 
     } 
     catch(System.Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.ToString());    
     } 
    } 
} 
+0

Это не производственный код, он просто набрал, чтобы продемонстрировать проблему. Но да, я использую большую часть времени, но это не решает проблему в этой ситуации. – Tester101

0

System.Net.Mail.MailMessage и System.Net.Mail.SmtpClient и реализации IDisposable, что означает, что вам нужно позвонить Dispose на их после того, как вы закончите. IE:

using (System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage(this.From, this.To, this.Subject, this.Body)) 
{ 
    message.IsBodyHtml = true; 
    using(System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(this.Server)) 
    { 
     client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network; 
     try 
     { 
      client.Send(message); 
     } 
     catch(System.Exception ex) 
     { 
      System.Windows.Forms.MessageBox.Show(ex.ToString());    
     } 
    } 
} 
+0

Как упоминалось ранее, SmtpClient НЕ реализует IDisposable – Tester101

+0

@ Tester101: Да. Я только что создал и скомпилировал проект, который вызывает «SmtpClient.Dispose», и я проверял в метаданных, что «IDisposable» правильно реализован. Что-то еще происходит. –

+0

Wait - интерфейс IDisposable не был добавлен до 4 ... 3.5 и более ранних версий. –

1

нормально тестер ... Если вы хотите, чтобы обойти проблему Norton, его довольно просто. Добавьте следующую строку:

message.EnableSsl = true; 

Это приведет к SMTP-клиент для шифрования соединения, тем самым отправив его на другой порт, то что Нортона мониторы. Посмотрите, работает ли это!

+0

System.Net.Mail.MailMessage не имеет свойства EnableSsl, но значение свойства EnableSsl для SmtpClient истинно, что сервер не поддерживает безопасные соединения. – Tester101

+0

Несомненно, это головной скребок. Не отключая norton или используя SSL, я не уверен, как это может работать. Но я найду решение. Дайте мне несколько – Icemanind

+0

Есть ли способ зарегистрировать мое приложение с Norton или что-то в этом роде, так что он не сканирует отправленные им сообщения? – Tester101