public void SendMails(IDaoFactory daoFactory) { try { var deliveryToSend = daoFactory.GetDeliveryPoDao().GetDeliveryToSend(); if (deliveryToSend != null && !SendingDeliveryId.Contains(deliveryToSend.Id)) { initialize(deliveryToSend.SenderEmail == ConfigurationManager.AppSettings["MailFrom"] ? null : daoFactory.GetAziendaDao().GetById(deliveryToSend.IdAzienda, false)); if (deliveryToSend.AttemptNumber >= deliveryToSend.MaxRetry) { deliveryToSend.State = StatoDelivery.Bloccato; daoFactory.GetDeliveryPoDao().SaveOrUpdate(deliveryToSend); SendingDeliveryId.Remove(deliveryToSend.Id); deliveryToSend = daoFactory.GetDeliveryPoDao().GetDeliveryToSend(); } if (deliveryToSend != null && !SendingDeliveryId.Contains(deliveryToSend.Id)) { var log = new DeliveryLog(deliveryToSend, $"Iniziato l'invio della spedizione di tipo '{deliveryToSend.Type}' - #{deliveryToSend.Id}"); deliveryToSend.AttemptNumber++; SendingDeliveryId.Add(deliveryToSend.Id); deliveryToSend.State = StatoDelivery.InSpedizione; var retryIndex = 0; bool allSented; // Finchè tutte le mail sono spedite oppure viene raggiunto il numero massimo di tentativi cerco di spedire tutte le mail accodate do { allSented = true; var index = 0; foreach (var deliveryMessage in deliveryToSend.Messages) { var deliveryMessagePo = deliveryMessage as DeliveryMessagePo; if (deliveryMessagePo != null) { if (deliveryMessagePo.SendingDate == null) { var sendArgs = SendMail(deliveryMessagePo); if (sendArgs.Exception == null) { deliveryMessagePo.SendingDate = DateTime.Now; deliveryMessagePo.Smtp = sendArgs.Smtp; deliveryMessagePo.AttemptNumber = retryIndex; } else { deliveryMessagePo.Exception += sendArgs.Exception.Message; allSented = false; } index++; // Attesa prima di spedire la nuova mail if(deliveryToSend.Messages.Count > index) Thread.Sleep(5000); } } else { var fatalException = new InvalidCastException($"Fallito il cast di un oggetto DeliveryMessage a DeliveryMessagePo#{deliveryMessage.Id}"); _log.FatalFormat("Fallito il cast di un oggetto DeliveryMessage", fatalException); throw fatalException; } } retryIndex++; } while (!allSented && retryIndex < deliveryToSend.MaxRetry); if (allSented) deliveryToSend.State = StatoDelivery.Spedito; deliveryToSend.EndSendingDate = DateTime.Now; SendingDeliveryId.Remove(deliveryToSend.Id); daoFactory.GetDeliveryPoDao().SaveOrUpdate(deliveryToSend); var logFine = new DeliveryLog(deliveryToSend, string.Format("Finito l'invio della spedizione di tipo '{0}' - Sono stati elaborati {2} messaggi ({3} non inviati per errori) - #{1}", deliveryToSend.Type, deliveryToSend.Id, deliveryToSend.Messages.Count, deliveryToSend.Messages.Cast<DeliveryMessagePo>().Count(item => item.SendingDate == null))); daoFactory.GetDeliveryLogDao().SaveOrUpdate(logFine); } } daoFactory.GetDeliveryPoDao().CommitChanges(); } catch (Exception ex) { _log.FatalFormat("Invio non riuscito - {0}", ex, Library.Utility.GetMethodDescription()); } finally { SendingDeliveryId.Clear(); } }