Beispiel #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();
		    }

		}