El servicio de envío de correo electrónico en C # no se recupera después del tiempo de espera del servidor

He tenido este problema durante meses, y me está volviendo loco. Tengo un servicio de Windows escrito en C # (.NET 4.5) que básicamente envía correos electrónicos, utilizando una cuenta de Outlook (creo que es un servicio de Office365). Soy consciente del problema del "orden de credenciales", que no me afecta (muchos correos electrónicos se envían correctamente).

El servicio se inicia correctamente y comienza a enviar correos electrónicos. A veces, cuando hay demasiados, recibo un error del servidor para esperar, el servicio espera unos minutos y continúa perfectamente por sí solo.

En estos casos me sale el error A:

 System.Net.Mail.SmtpException: The operation has timed out.
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at Cobranzas.WinService.Email.SendEmail(String subject, String body, String mailTo, String attPath)
   at Cobranzas.WinService.CobranzasEmailService.SendEmails(IEnumerable`1 toSend, RepositoryEf emailRepo)

El problema: a veces, y no he podido encontrar un patrón, ocurre cada pocos días, se produce un error de tiempo de espera y nunca se recupera (reiniciar los servicios lo arregla inmediatamente) Todos los intentos de envío posteriores fallan con el mismo error. En este caso, obtengo una mezcla de Error A y:

 System.Net.Mail.SmtpException: Failure sending mail. ---> System.Net.WebException: The operation has timed out.
   at System.Net.ConnectionPool.Get(Object owningObject, Int32 result, Boolean& continueLoop, WaitHandle[]& waitHandles)
   at System.Net.ConnectionPool.GetConnection(Object owningObject, GeneralAsyncDelegate asyncCallback, Int32 creationTimeout)
   at System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint)
   at System.Net.Mail.SmtpTransport.GetConnection(ServicePoint servicePoint)
   at System.Net.Mail.SmtpClient.GetConnection()
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   --- End of inner exception stack trace ---
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at Cobranzas.WinService.Email.SendEmail(String subject, String body, String mailTo, String attPath)
   at Cobranzas.WinService.CobranzasEmailService.SendEmails(IEnumerable`1 toSend, RepositoryEf emailRepo)

La lógica de mi servicio es la siguiente: tengo un temporizador que cada 5 minutos itera sobre una gran cantidad de correos electrónicos para ser enviados, y para cada uno se ejecuta

Thread.Sleep(2000); 
try
{
    emailService.SendEmail(asunto, nuevoCuerpo, mail.Email, mail.AlertMessage.Attach);
}
catch (Exception ex)
{
    if (ex is System.Net.Mail.SmtpException)
    {
        Thread.Sleep(20000); // Lo hacemos esperar 20 segundos
    }
}

El método SendEmail es:

var mailMessage = new MailMessage();

mailMessage.To.Add(mailTo);

mailMessage.Subject = subject;
mailMessage.Body = WebUtility.HtmlDecode(body);
mailMessage.IsBodyHtml = true;
mailMessage.From = new MailAddress(emailFromAddress, emailFromName); 
mailMessage.Headers.Add("Content-type", "text/html; charset=iso-8859-1");

// Attachment
if (attPath != null)
{
    var data = new Attachment(attPath, MediaTypeNames.Application.Octet);
    mailMessage.Attachments.Add(data);
}

var cred =
    new NetworkCredential(emailFromAddress, emailFromPassword); 

using (var mailClient =
    new SmtpClient(emailSmtpClient, emailSmtpPort) 
                     {
                         EnableSsl = true,
                         DeliveryMethod = SmtpDeliveryMethod.Network,
                         UseDefaultCredentials = false,
                         Timeout = 20000,
                         Credentials = cred
                     })
{
    mailClient.Send(mailMessage);
}

foreach (Attachment attachment in mailMessage.Attachments)
{
    attachment.Dispose();
}

El uso de SmtpClient y la disposición de los archivos adjuntos son nuevos, los agregamos tratando de solucionar esto. No hubo cambio de comportamiento. T̶h̶e̶ ̶T̶h̶r̶e̶a̶d̶.̶S̶l̶e̶e̶p̶ ̶a̶f̶t̶e̶r̶ ̶t̶h̶e̶ ̶t̶i̶m̶e̶o̶u̶t̶ ̶i̶s̶ ̶n̶e̶w̶ ̶a̶n̶d̶ ̶u̶n̶̶̶̶̶̶̶.

Dado que reiniciar el servicio lo soluciona, sospecho que algo no se está cerrando / limpiando adecuadamente, pero lo he comprobado y no puedo encontrar lo que podría ser. encontréesta enlace hace un tiempo, pero se ve bastante viejo.

¡Cualquier ayuda es muy apreciada!

[PROGRESO]

He probado la espera de 20 "después de un tiempo de espera y nada, sigue fallando de la misma manera. ¿Alguna idea? Estamos realmente perplejos con esto.

Respuestas a la pregunta(1)

Su respuesta a la pregunta