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(); } }
private void notifyEmailAlert(ICondominioRiferimento alert, IDaoFactory daoFactory) { try { if (ConfigurationManager.AppSettings["IsTest"] != null && bool.Parse(ConfigurationManager.AppSettings["IsTest"])) return; if(alert != null) { Attivita attivita = null; var alertAttivita = alert as AlertAttivita; if (alertAttivita != null) attivita = alertAttivita.Attivita; if (alert.GetCondominio() != null && alert.Destinatario != null) { var referente = alert.Destinatario.GetReferenteEffettivo(alert.GetCondominio(), attivita); if (referente != null && referente.Azienda.ID == alert.GetCondominio().Azienda.ID) { if (referente.PersonaRiferimento != null) { var emailAddress = new ContattoCollection(referente.PersonaRiferimento.Contatti).GetFirstContatto<Email>(); if (!string.IsNullOrEmpty(emailAddress?.Valore)) { // Destinatari var destinatari = new List<string>(1); if (ConfigurationManager.AppSettings["IsTest"] != null && bool.Parse(ConfigurationManager.AppSettings["IsTest"])) destinatari.Add("*****@*****.**"); else destinatari.Add(emailAddress.Valore); // Mittente var mittente = ConfigurationManager.AppSettings["MailFrom"]; int? idDelivery = null; if (_delivery != null) idDelivery = _delivery.Id; var result = _messageService.InvioMessaggio(alert.GetCondominio().Azienda.ID, new PersonaMessaggioDTO { ID = referente.PersonaRiferimento.ID, IdDelivery = idDelivery}, alert.GetCondominio(), null, null, null ,null, MotivoMessaggio.ScadenzaContratto, ConfigurationManager.AppSettings["MailSubject"], NVelocityTemplateEngine.ProcessAlert(alert), destinatari, mittente, mittente, null, new ParametriInvioLettera { Asincrono = true })[0]; if (!result.InvioRiuscito) { _log.DebugFormat("Notify: Notifica alert NON ha avuto successo: {0} - il:{1} - ora:{2} - alert:{3}", result.MessaggioInvio, DateTime.Today.ToShortDateString(), DateTime.Now.ToShortTimeString(), alert.ID); } else { if (_delivery == null) _delivery = daoFactory.GetDeliveryPoDao().Find(result.IdDelivery, false); } } } else { _log.DebugFormat("ATTENZIONE: Tentativo di inviare alert ad un referente per il quale non è associata nessuna persona fisica - {0} - idAlert:{1} - idReferente:{2}", Library.Utility.GetMethodDescription(), alert.ID, referente.ID); } } else { _log.DebugFormat("ATTENZIONE: Tentativo di inviare alert a referente di una azienda diversa da quella del contratto - {0} - alert:{1} - referent:{2}", Library.Utility.GetMethodDescription(), alert.ID, referente?.ID.ToString() ?? "<NULL>"); } } } } catch (Exception ex) { _log.ErrorFormat("Errore inaspettato durante la notifica dell'alert - {0} - alert:{1}", ex, Library.Utility.GetMethodDescription(), alert?.ID.ToString() ?? "<NULL>"); throw; } }