コード例 #1
0
ファイル: MailService.cs プロジェクト: gipasoft/Sfera
		/// <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}");
		}
コード例 #2
0
ファイル: MailSenderService.cs プロジェクト: gipasoft/Sfera
		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();
		    }

		}