2010-09-07 22 views
8

Odio simplemente publicar un seguimiento de la pila aquí, pero me he quedado sin ideas ... Mi aplicación envía correos electrónicos para varias tareas en el sitio web, y el 90% de las veces no hay problemas. Sin embargo, de vez en cuando ASP.NET arroja una extraña excepción, que parece estar relacionada con la conectividad del servidor de correo (uso los servidores de Google Business para el correo electrónico). El error es demasiado genérico para que lo depure, de ahí el seguimiento de pila a continuación. Mi aplicación captura la excepción y vuelve a escribir un mensaje genérico 'intente nuevamente en 5 minutos'.Problemas temporales al enviar correos electrónicos con ASP.NET

Estoy confundido por este error porque:

  • Google de correo electrónico es generalmente muy fiable (que se envía desde mi dominio, no gmail.com).
  • volúmenes son muy bajos, por lo que esto no debería ser un tipo de carga/envío de correo basura del problema.
  • El error es muy genérico.
  • Tratando de nuevo en 5 minutos casi siempre permite que el correo electrónico que se enviará sin ningún problema, con ninguno de los parámetros (destinatario, asunto, cuerpo) después de haber cambiado.

¿Alguna idea? Los únicos problemas pendientes que puedo pensar es que:

  1. El envío de correo electrónico es síncrono. Esto es lo que realmente quiero que ocurra, ya que quiero responder al usuario con un mensaje de estado de éxito/error.
  2. Estoy utilizando Amazon EC2 como servidor, si eso tiene alguna relación con el asunto.

El código:

public static void SendMail(String from, String to, String subject, String body, bool IsHtml) 
    { 
     MailMessage m = new MailMessage(from, to, subject, body); 
     m.IsBodyHtml = IsHtml; 

     SmtpClient smtpClient = new SmtpClient(); 
     smtpClient.EnableSsl = true; 
     smtpClient.Send(m); 
    } 

La excepción:

System.Net.Mail.SmtpException: Error in processing. The server response was: 4.3.0 Mail server temporarily rejected message. m6sm2190005vcx.24 
at System.Net.Mail.DataStopCommand.CheckResponse(SmtpStatusCode statusCode, String serverResponse) 
at System.Net.Mail.DataStopCommand.Send(SmtpConnection conn) 
at System.Net.Mail.SmtpConnection.OnClose(Object sender, EventArgs args) 
at System.Net.ClosableStream.Close() 
at System.Net.Mail.MailWriter.Close() 
at System.Net.Mail.SmtpClient.Send(MailMessage message) 
+0

La realización de una búsqueda en Google sobre este error específico indica que es probable un problema con los servidores de Google que son conscientes.Resolución pendiente. –

Respuesta

5

He trabajado en sistemas de correo electrónico a granel en el pasado. El mensaje de excepción que está recibiendo es totalmente descriptivo: ese servidor SMTP temporalmente no acepta el correo. Esto puede ser debido a una serie de condiciones:

  1. El servidor está ocupado
  2. Está enviando demasiados mensajes de correo electrónico demasiado rápido (esto puede hacerle parecer un spammer)
  3. errores generales

El hecho de que volver a intentar el correo electrónico funcione siempre indica que se trata de un comportamiento normal y esperado. No hay nada que pueda hacer de manera diferente para evitar esto, es un método común utilizado por los ISP para reducir el tráfico cuando sea necesario.

+0

Según su experiencia ... ¿Es una buena idea intentarlo por segunda vez inmediatamente después de que se produce la primera falla SMTP, con un retraso de 1 segundo entre? Esto parece ser solo un problema temporal (¿sorprendente, porque es google mail?) Y simplemente repetir el envío parece resolver problemas. –

+1

Te garantizo que no eres el único que recibe este error al enviar a través de Google o cualquier otro ISP/ESP. Esto no es necesariamente un "error" al final de Google: la cola en ese servidor podría estar llena o cualquiera de los otros problemas comunes. Un segundo probablemente no sea suficiente, esperaría al menos 30 segundos. –

+0

¡Gracias por el consejo! –

0

Además de lo que dijo Dave Swersky: Puede almacenar los correos electrónicos que desea enviar en algún lugar (como sistema de archivos o base de datos) y dejar que el servicio de generación de correo electrónico esté a la mano. Su servicio buscará nuevos correos electrónicos para enviar. Si se produce un error durante el envío, puede volver a poner el correo electrónico en la cola y volver a intentarlo más tarde.

Quizás incluso pueda usar un STMPServer local que use GoogleMail como servidor de retransmisión. En ese caso, podría usar la función integrada pickupdirectory en lugar de escribirla usted mismo.

Cuestiones relacionadas