c# - ¿Por qué solo se puede llamar a SmtpClient.SendAsync una vez?
system.net.mail (6)
Como notaron todos los demás aquí, solo puede enviar un correo electrónico a la vez, pero la manera de enviar otro una vez que se ha enviado el primero es manejar el evento .SendCompleted de la clase SmtpClient, y luego pasar al siguiente correo electrónico y envía eso
Si desea enviar muchos correos electrónicos simultáneamente, entonces, como han dicho los demás, use múltiples objetos SmtpClient.
Intento escribir un servicio de notificación (para fines completamente no legítimos y no spam) en .NET usando SmtpClient. Inicialmente hice un bucle en cada mensaje y lo envié, sin embargo, esto es lento y me gustaría mejorar la velocidad. Entonces, cambié a usar ''SendAsync'', pero ahora obtengo el siguiente error en la segunda llamada:
An asynchronous call is already in progress.
Leí esto para decir que MS paralizó System.Net.Mail para evitar envíos masivos de correo. ¿Es esto correcto? Si es así, ¿existe una mejor manera de hacerlo en .NET y aún así poder registrar los resultados de cada correo electrónico (que es importante para nuestro cliente)? De lo contrario, ¿por qué SendAsync solo se puede llamar una vez?
Creo que malinterpretas la clase de métodos XXXAsync
. El objetivo de estas llamadas asincrónicas es permitir que el programa continúe ejecutándose, sin necesidad de que el método finalice el procesamiento y vuelva primero. Luego puede continuar con el resultado suscribiéndose a algo así como XXXReceived
evento XXXReceived
del objeto.
Para enviar más de un correo al mismo tiempo, puede considerar usar más Thread
s.
De acuerdo con la documentación :
Después de llamar a SendAsync, debe esperar a que se complete la transmisión del correo electrónico antes de intentar enviar otro mensaje de correo electrónico mediante Send o SendAsync.
Entonces, para enviar múltiples correos al mismo tiempo, necesita varias instancias de SmtpClient.
Obviamente, este no es un intento de detener envíos masivos de correo.
La razón es que la clase SmtpClient no es segura para subprocesos. Si desea enviar múltiples correos electrónicos simultáneamente, debe generar algunos hilos de trabajo (hay algunas maneras de hacerlo en .NET Framework) y crear instancias separadas de SmtpClient en cada uno de ellos.
Solo puede enviar uno a la vez por cliente SMTP. Si desea realizar más de una llamada de envío, cree más de un cliente SMTP.
HTH,
Colby África
Es posible que pueda usar lo siguiente:
ThreadPool.QueueUserWorkItem(state => client.Send(msg));
Esto debería permitir que sus mensajes se pongan en cola y se envíen a medida que los hilos estén disponibles.