2010-01-21 16 views
7

Tengo un hilo ejecutándose en segundo plano que dormirá y extraerá datos de la base de datos cuando algo lo despierte. Estoy enviando los correos electrónicos usando aplicaciones de Google usando SmtpClient (código a continuación).¿Qué debería saber sobre el envío de correos electrónicos en un hilo de fondo? ASP.NET

¿Quería saber si hay algo que tenga en cuenta? Planeo enviar solo un correo electrónico a la vez (un correo electrónico de registro o contraseña olvidada). Estoy un poco preocupado de que algo pueda suceder, como un correo electrónico no válido bloqueando el hilo porque no establecí un tiempo de espera o tal vez las aplicaciones de Google se hicieron y causaron que la aplicación explotara. ¿Qué debería saber? Debería preguntar cómo debo probar también?

 var client = new SmtpClient("smtp.gmail.com", 587) 
     { 
      Credentials = new NetworkCredential(fromAddr, pass), 
      EnableSsl = true 
     }; 
     MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body); 
     mail.IsBodyHtml = true; 
     client.Send(mail); 
+2

¿Hay alguna razón por la que no pueda llamar a esta lógica desde donde ocurre el 'disparo' de despertarlo? Si estás tratando de enviar un restablecimiento de contraseña y falla, como usuario, probablemente quiera saber eso y ver un buen error diciendo que falló, así que no me siento y renuevo mi bandeja de entrada esperándome. El pequeño retraso en procesar la solicitud del usuario y enviar todo en uno podría valer la pena eliminar la complejidad de tener que señalizarlo. – Rosstified

Respuesta

3

Si está utilizando IIS. Instale SMTP en su servidor y envíe todos los correos a localhost. De esta forma, si un correo electrónico no se procesa de inmediato, el servidor SMTP pondrá en cola el correo electrónico en lugar de colgar la aplicación.

Tendrá que configurar el servidor SMTP para usar gmail como smarthost. Si necesita más información sobre cómo configurar esto, hágamelo saber.

+0

Esta es también la forma en que lo hago: es más rápido y más confiable. Si alguno de sus destinatarios no es válido o sus servidores SMTP están caídos, obtendrá tiempos de espera y/o excepciones. De esta forma, IIS acepta todo el correo de inmediato y luego se encarga de enviar el mensaje, incluso reintentar la operación de envío si falla. – Richard

1

Supongo que esto se hace en ASP.Net ya que es una de las etiquetas.

¿Cuán importante es este proceso? Este puede ser un buen candidato para un servicio de Windows en lugar de ser parte del tiempo de ejecución de ASP.Net si su entorno lo permite.

Ha mencionado que extrae los datos de la base de datos y envía el correo electrónico. Nada de esto depende de ASP.Net. Además, un servicio puede brindarle mejores opciones de subprocesamiento, prueba, registro y asincronización.

Si desea seguir con el tiempo de ejecución ASP.Net, también puede considerar Asynchronous Pages si no lo ha hecho aún. Esto le permitirá generar varios hilos de correo y hacer que su hilo de la página principal espere los resultados. También puede establecer un valor de tiempo de espera que le permitirá cancelar y registrar los hilos atascados. Establecer y manejar un tiempo de espera asíncrono me haría cargo de gran parte de sus preocupaciones, sospecho. Esta solución al menos eliminará el envío de correo de su hilo de solicitud de página.

Las pruebas deben ser sencillas. Puede registrar cuentas de google separadas para las pruebas.

2

Agregue un try/catch al código, y usted está bien. En el peor de los casos, eventualmente terminará. No funcionará para siempre, y Google no mantendrá la conexión abierta para siempre (de hecho, SMTP es bastante implacable cuando se trata de tiempos de espera ... si eres lento, matará la conexión).

try 
    { 
     var client = new SmtpClient("smtp.gmail.com", 587) 
     { 
      Credentials = new NetworkCredential(fromAddr, pass), 
      EnableSsl = true 
     }; 
     MailMessage mail = new MailMessage(fromAddr, toAddr, subject, body); 
     mail.IsBodyHtml = true; 
     client.Send(mail); 
    } 
    catch 
    { 
     // do something 
    } 

Cuando se trata de probar ... use una cuenta de gMail diferente. También es posible que desee verificar el límite de correos electrónicos enviados por día. No estoy seguro de cuál es el número de gMail, pero no solo le permiten enviar la cantidad que quiera enviar.

+0

-1: casi deberías usar _never_ "catch {}". Ocultará todas las excepciones.Las excepciones no desaparecen solo porque no puedas verlas. –

+2

bien lo dijo // hacer algo –

+4

-1 ?? No atrapé {}. Tuve un comentario para que ellos ... hagan algo. ¿Cómo se supone que sabré lo que necesitan hacer? –

0

Puede establecer la propiedad Timeout de SmtpClient, y luego manejar las excepciones lanzadas por la llamada Send. Entonces no bloqueará el hilo, aunque tendrá que manejar la causa de la excepción como considere apropiado.

Cuestiones relacionadas