2009-06-09 26 views
5

Estoy buscando un buen rendimiento al enviar una gran cantidad de correos electrónicos.¿Forma óptima de enviar correo con SmtpClient?

He oído que la forma correcta de hacerlo es abrir una conexión para enviar ~ 20 correos electrónicos y cerrar la conexión. Y haz eso una y otra vez. ¿Es esto correcto?

¿Y cómo funciona SmtpClient, abre una conexión por su propia vida? (no IDisposable, por lo que no se ve así) ¿O abre una conexión para cada correo electrónico que se envía? ¿O tiene una conexión abierta todo el tiempo? ¿O tiene alguna magia que abre y cierra las conexiones cuando es apropiado?

Me gustaría saber para saber cómo debo iniciar el SmtpClient. Como singleton o solo para un fragmento de mensajes ...

Respuesta

7

Sólo envía un solo MailMessage desde una conexión. De hecho, ni siquiera cierra correctamente la conexión. Envía el correo, pero luego no le dice al servidor de correo electrónico que quiere abandonar. Entonces, simplemente lo deja abierto, hasta que el flujo agrupado subyacente decide cerrar el socket.

Aquí es el código interno del reflector:

... 
     this.GetConnection(); 
     fileMailWriter = this.transport.SendMail((message.Sender != null) ? message.Sender : message.From, recipients, message.BuildDeliveryStatusNotificationString(), out exception); 
     } 
     catch (Exception exception2) 
     { 
      if (Logging.On) 
      { 
       Logging.Exception(Logging.Web, this, "Send", exception2); 
      } 
      if ((exception2 is SmtpFailedRecipientException) && !((SmtpFailedRecipientException) exception2).fatal) 
      { 
       throw; 
      } 
      this.Abort(); 
      if (this.timedOut) 
      { 
       throw new SmtpException(SR.GetString("net_timeout")); 
      } 
      if (((exception2 is SecurityException) || (exception2 is AuthenticationException)) || (exception2 is SmtpException)) 
      { 
       throw; 
      } 
      throw new SmtpException(SR.GetString("SmtpSendMailFailure"), exception2); 
     } 

por cierto, aquí es más información sobre la SmtpClient no emite el comando QUIT. https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711&wa=wsignin1.0

Editar: Ver el vínculo roto por encima de web.archive.org

La solución alternativa es fijar SmtpClient.ServicePoint.MaxTimeout a 1. Esto cerrará el zócalo más rápido, sin embargo, esto no emitir la realidad SALIR comando.

+0

¿Se ha solucionado el problema con 'QUIT' en los frameworks .NET más nuevos? – jocull

+0

Esto fue supuestamente arreglado en .NET 4.0 https://stackoverflow.com/questions/1466572/net-system-net-mail-smtpclient-class-doesnt-issue-quit-command-to-smtp-transac?noredirect=1 # comment79406662_1466572 – jocull

Cuestiones relacionadas