Example #1
0
		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();
		    }

		}
Example #2
0
        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;
            }

        }