/// <summary> /// Elabora l'oggetto <paramref name="delivery"/> accodando tutti messaggi presenti nella collection Messages /// </summary> /// <param name="delivery">Oggetto contenente tutti i messaggi da inviare</param> public void Send(Delivery delivery) { var recipients = new List<DeliveryMessagePo>(delivery.Messages.Count); DeliveryPo deliveryPo = null; if(delivery.Id > 0) deliveryPo = _daoFactory.GetDeliveryPoDao().Find(delivery.Id, false); if(deliveryPo == null) deliveryPo = new DeliveryPo(delivery.IdAzienda, delivery.Type, recipients, delivery.Sender, delivery.Cc, delivery.Bcc, delivery.ReplyTo, delivery.MaxRetry, delivery.Test); foreach (var deliveryMessage in delivery.Messages) { var deliveryMessagePo = !string.IsNullOrEmpty(deliveryMessage.EmlFile) ? new DeliveryMessagePo(deliveryPo, deliveryMessage.EmlFile, deliveryMessage.NominativoTo, deliveryMessage.EmailTo, deliveryMessage.ReferenceId) : new DeliveryMessagePo(deliveryPo, deliveryMessage.To, deliveryMessage.Subject, deliveryMessage.Body, deliveryMessage.ReferenceId); recipients.Add(deliveryMessagePo); } _daoFactory.GetDeliveryPoDao().SaveOrUpdate(deliveryPo); deliveryPo.State = StatoDelivery.DaSpedire; delivery.Id = deliveryPo.Id; var log = new DeliveryLog(deliveryPo, $"E' stata accodata una spedizione del tipo '{delivery.Type}' contenente {delivery.Messages.Count} messaggi - #{deliveryPo.Id}"); }
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(); } }