Example #1
0
		/// <summary>
		/// Identifica una singola email
		/// </summary>
		/// <param name="to">Email del destinatario</param>
		/// <param name="subject">Oggetto della mail</param>
		/// <param name="body">Testo della mail</param>
		/// <param name="referenceId">Identificativo del destinatario della mail</param>
		public DeliveryMessagePo(Delivery delivery, MailAddress to, string subject, string body, string referenceId) : base(to, subject, body, referenceId)
		{
			Delivery = delivery;
			CreatedDate = DateTime.Now;

			if(Delivery != null)
				Delivery.Messages.Add(this);
		}
Example #2
0
        /// <summary>
        /// Identifica una singola email
        /// </summary>
        /// <param name="emlFile">File Eml che deve essere inviato</param>
        /// <param name="referenceId">Identificativo del destinatario della mail</param>
        public DeliveryMessagePo(Delivery delivery, string emlFile, string nominativoTo, string emailTo, string referenceId) : base(emlFile, nominativoTo, emailTo, referenceId)
        {
            Delivery = delivery;
            CreatedDate = DateTime.Now;
            RecipientEmail = emailTo;
            RecipientName = nominativoTo;

            if (Delivery != null)
                Delivery.Messages.Add(this);
        }
Example #3
0
		/// <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}");
		}
Example #4
0
        /// <summary>
        /// Funzione per l'invio del messaggio email
        /// </summary>
        /// <param name="idAzienda">Identificativo dell'azienda</param>
        /// <param name="personaMessaggioDTO">DTO contenente l'identificativo della persona alla quale il messaggio viene inviato e altre informazioni utili all'invio del messaggio</param>
        /// <param name="condominio">Condominio a cui appartiene la persona destinataria del messaggio può non essere definito</param>
        /// <param name="idUnitaImmobiliare">Identificativo dell'unità immobiliare</param>
        /// <param name="idIncaricatoAttivita">Identificativo del soggetto incaricato allo svolgimento dell'attività</param>
        /// <param name="motivoMessaggio">Indica il motivo che ha portato all'invio del messaggio (es: Sollecito)</param>
        /// <param name="oggetto">Oggetto del messaggio</param>
        /// <param name="testo">Testo del messaggio</param>
        /// <param name="destinatari">Destinatari del messaggio</param>
        /// <param name="mittente">Mittente del messaggio</param>
        /// <param name="emailRapportino">Se presente è l'indirizzo email a cui saranno inviate eventuali risposte, altrimenti viene usato il mittente</param>
        /// <param name="allegati">Eventuali allegati del messaggio</param>
        /// <param name="parametriInvioLettera">Parametri er l'invio della lettera: Se tipo è <value>alert</value> il messaggio viene inviato creando un messaggio di tipo alert (solo outlook) - <value>Asincrono</value>: indica se deve essere eseguito un invio asincrono</param>
        /// <param name="idFornitore">Identificativo del fornitore</param>
        /// <param name="idResponsabile">Identificativo del responsabile dell'attività</param>
        /// <returns>Restituisce una lista di: codice dell'invio, eventuali messaggi, il flag che indica se l'invio è riuscito e il corpo, sotto forma di array di byte, del messaggio in formato standard 'eml'</returns>
        public IList<RisultatoInvioMessaggio> InvioMessaggio(int idAzienda, PersonaMessaggioDTO personaMessaggioDTO, Condominio condominio, int? idUnitaImmobiliare, int? idFornitore, int? idResponsabile, int? idIncaricatoAttivita, MotivoMessaggio motivoMessaggio, string oggetto, string testo, IList<string> destinatari, string mittente, string emailRapportino, IList<DocumentInfo> allegati, ParametriInvioLettera parametriInvioLettera)
        {
            var message = string.Empty;
            var invioRiuscito = true;

            // Impostazioni Azienda
            var impostazioniAzienda = _daoFactory.GetImpostazioniAziendaDao().GetByAzienda(idAzienda) ?? new ImpostazioniAzienda(_daoFactory.GetAziendaDao().Find(idAzienda, false));

            // Applico la stampa unione
            Persona persona = null;
            if(personaMessaggioDTO != null)
            {
                int? idCondominio = null;
                if (condominio != null)
                    idCondominio = condominio.ID;

                persona = _daoFactory.GetPersonaDao().GetById(personaMessaggioDTO.ID, false);
                var parametri = new ParametriStampaUnione(persona.ID, idUnitaImmobiliare, idResponsabile, idIncaricatoAttivita, idFornitore, idCondominio, null, personaMessaggioDTO.TipoIndirizzo, personaMessaggioDTO.Importo, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null);
                oggetto = _messaggisticaService.ApplicaStampaUnione(oggetto, parametri, idAzienda);
                testo = _messaggisticaService.ApplicaStampaUnione(testo, parametri, idAzienda);
            }

            // Mittente
            if (string.IsNullOrEmpty(mittente))
            {
                var identificazioneMittente = _configurationService.GetIdentificazioneMittente(idAzienda, TipoMessaggio.Email, TipoIndirizzo.Recapito);
                mittente = identificazioneMittente.Nome;
            }
            if (string.IsNullOrEmpty(mittente) && !string.IsNullOrEmpty(emailRapportino))
                mittente = emailRapportino;
            else if (string.IsNullOrEmpty(mittente))
                message = "Non è possibile inviare un messaggio senza aver definito il mittente";

            var fullPathFile = string.Empty;
            var messaggio = new DocumentInfo();

            // ========================================================
            // Crezione del mail message solo se NON si tratta di messaggi automatici
            // ========================================================
            var referenceId = Guid.NewGuid().ToString();
            if (motivoMessaggio != MotivoMessaggio.ScadenzaContratto &&
                motivoMessaggio != MotivoMessaggio.NotificaResponsabileAttivita)
            {
                var mailMessage = new MailMessage();
                if (string.IsNullOrEmpty(message) && !string.IsNullOrEmpty(mittente))
                {
                    try
                    {
                        mailMessage.From = new MailAddress(mittente);
                    }
                    catch (Exception ex)
                    {
                        invioRiuscito = false;
                        message = "Mittente errato: " + mittente;
                        _log.ErrorFormat("Errore inaspettato durante l'invio della mail - IMPOSTAZIONE MITTENTE - {0} - mittente:{1} - oggetto:{2} - destinatario:{3}", ex, Utility.GetMethodDescription(), mittente, oggetto, destinatari[0]);
                    }

                    if (invioRiuscito)
                    {
                        foreach (var destinatario in destinatari.Distinct())
                        {
                            try
                            {
                                if (!string.IsNullOrEmpty(destinatario))
                                {
                                    if (!destinatario.Trim().Contains(" "))
                                    {
                                        // Se il destinatario è uno solo uso il campo 'To' se invece è più di uno uso l'undisclosed recipient per evitare di 
                                        // avere in chiaro tutti i destinatari dei messaggi
                                        if (ConfigurationManager.AppSettings["IsTest"] != null && bool.Parse(ConfigurationManager.AppSettings["IsTest"]))
                                        {
                                            if (destinatari.Count > 1)
                                                mailMessage.Bcc.Add("*****@*****.**");
                                            else
                                                mailMessage.To.Add("*****@*****.**");
                                        }
                                        else
                                        {
                                            if (destinatari.Count > 1)
                                                mailMessage.Bcc.Add(destinatario.Trim());
                                            else
                                                mailMessage.To.Add(destinatario.Trim());
                                        }
                                    }
                                    else
                                    {
                                        invioRiuscito = false;
                                        message = "L'email del destinatario non può contenere spazi: " + destinatario;
                                        _log.WarnFormat("Errore inaspettato durante l'invio della mail - EMAIL DESTINATARIO CON SPAZI - {0} - destinatario:{1} - mittente:{2} - oggetto:{3}", Utility.GetMethodDescription(), destinatario, mittente, oggetto);
                                    }
                                }
                            }
                            catch (Exception ex)
                            {
                                invioRiuscito = false;
                                message = "Destinatario errato: " + destinatario;
                                _log.WarnFormat("Errore inaspettato durante l'invio della mail - IMPOSTAZIONE DESTINATARIO - {0} - destinatario:{1} - mittente:{2} - oggetto:{3}", ex, Utility.GetMethodDescription(), destinatario, mittente, oggetto);
                            }
                        }

                        if (mailMessage.To.Count == 0 && mailMessage.Bcc.Count == 0)
                        {
                            invioRiuscito = false;
                            message = persona == null
                                ? "Non sono presenti destinatari validi."
                                : $"Non sono presenti destinatari validi: {persona.DisplayName}";
                            _log.WarnFormat("Errore inaspettato durante l'invio della mail - {0} - {1} - mittente:{2} - oggetto:{3}", message.ToUpper(), Utility.GetMethodDescription(), mittente, oggetto);
                        }

                        if (invioRiuscito)
                        {
                            mailMessage.Subject = oggetto;
                            mailMessage.Body = testo;

                            if (testo.Contains('<') && testo.Contains('>'))
                                mailMessage.IsBodyHtml = true;

                            // Trucco per ottenere un messaggio di tipo "Alert" per outlook
                            if (parametriInvioLettera.Tipo == "alert")
                                mailMessage.Headers.Add("message-id", "<3BD50098E401463AA228377848493927-1>");

                            if (allegati != null)
                            {
                                foreach (var documento in allegati)
                                {
                                    if (documento.Body != null)
                                    {
                                        var fileExtension = documento.FileExtension;
                                        if (string.IsNullOrEmpty(fileExtension))
                                        {
                                            var extension = _fileTypeDetector.GetFileExtension(new MemoryStream(documento.Body));
                                            if (!string.IsNullOrEmpty(extension))
                                                fileExtension = $".{extension}".ToLower();
                                        }

                                        if (!string.IsNullOrEmpty(fileExtension))
                                        {
                                            string mimeType;
                                            var mimeTypeList = _daoFactory.GetMimeTypeDao().GetByExtension(fileExtension);
                                            if (mimeTypeList.Count > 0)
                                            {
                                                mimeType = mimeTypeList[0].Tipo;

                                                // add the attachment from a stream
                                                var memStream = new MemoryStream(documento.Body);
                                                var streamWriter = new StreamWriter(memStream);
                                                streamWriter.Flush();

                                                // this is quite important
                                                memStream.Position = 0;

                                                var ct = new ContentType(mimeType)
                                                {
                                                    Name = documento.FileName + fileExtension
                                                };

                                                var attachment = new Attachment(memStream, ct);
                                                mailMessage.Attachments.Add(attachment);
                                            }
                                            else
                                            {
                                                _log.ErrorFormat("Il documento allegato non è stato riconosciuto - {0} - documento:{1} - fileName:{2} - extension:{3}", Utility.GetMethodDescription(), documento.FileId, documento.FileName, fileExtension);
                                            }
                                        }

                                    }
                                    else
                                    {
                                        _log.WarnFormat("ATTENZIONE: Tentativo di allegare un documento vuoto - {0} - documento:{1} - azienda:{2}", Utility.GetMethodDescription(), documento.FileId, idAzienda);
                                    }
                                }
                            }

                            if (motivoMessaggio != MotivoMessaggio.ScadenzaContratto && motivoMessaggio != MotivoMessaggio.NotificaResponsabileAttivita)
                            {
                                try
                                {
                                    mailMessage.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess | DeliveryNotificationOptions.OnFailure;

                                    string destinatarioRicevuta;
                                    switch (impostazioniAzienda.ControlloRapportinoMessaggistica)
                                    {
                                        case ControlloRapportino.Mittente:
                                            destinatarioRicevuta = mittente;
                                            break;
                                        case ControlloRapportino.Automatico:
                                            destinatarioRicevuta = "*****@*****.**";
                                            break;
                                        case ControlloRapportino.IndirizzoSpecifico:
                                            destinatarioRicevuta = impostazioniAzienda.EmailControlloRapportinoMessaggistica;
                                            break;
                                        default:
                                            destinatarioRicevuta = mittente;
                                            break;
                                    }

                                    mailMessage.Headers.Add("Return-Receipt-To", destinatarioRicevuta);
                                    mailMessage.Headers.Add("Disposition-Notification-To", destinatarioRicevuta);
                                    mailMessage.Headers.Add("X-Confirm-Reading-To", destinatarioRicevuta);

                                    // ========================================================
                                    // Salvare il messaggio in formato .eml
                                    // ========================================================
                                    var emailStream = new MemoryStream();
                                    mailMessage.MessageId = referenceId;
                                    mailMessage.Save(emailStream, MessageFormat.Eml);
                                    messaggio.Body = emailStream.ToArray();
                                    messaggio.FileName = $"Email_{DateTime.Now.ToString("dd-mm-yyyy")}.eml";
                                    messaggio.FileExtension = ".eml";

                                    // Aggiungo la mail generata alla lista degli allegati
                                    // ----------------------------------------------------
                                    var documentMessage = _documentService.SaveDocument(messaggio.Body, messaggio.FileName, messaggio.FileExtension, null, idAzienda);
                                    if (documentMessage.Documento != null)
                                    {
                                        fullPathFile = documentMessage.FilePath;
                                        var checksum = documentMessage.Documento.Checksum;
                                        messaggio.FileId = checksum;
                                        if (allegati == null)
                                            allegati = new List<DocumentInfo>();
                                        allegati.Add(messaggio);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    invioRiuscito = false;
                                    message = "Si sono verificati problemi nel salvataggio del file EML :" + Environment.NewLine + ex.Message;
                                    _log.FatalFormat("Errore inaspettato durante il salvataggio del file eml - {0} - oggetto:{1} - destinatario:{2}", ex, Utility.GetMethodDescription(), oggetto, destinatari.Aggregate("<NESSUNO>", (current, dest) => current + (dest + ", ")));
                                }
                            }
                        }
                    }
                }
                else
                    invioRiuscito = false;
            }

            // ========================================================
            // Invio del messaggio
            // ========================================================
            Delivery delivery = null;
            if (invioRiuscito)
            {
                try
                {
                    var deliveryMessages = new List<DeliveryMessage>(destinatari.Count);
                    if (motivoMessaggio == MotivoMessaggio.ScadenzaContratto || motivoMessaggio == MotivoMessaggio.NotificaResponsabileAttivita)
                    {
                        foreach (var destinatario in destinatari)
                        {
                            var deliveryMessage = new DeliveryMessage(new System.Net.Mail.MailAddress(destinatario, destinatario), oggetto, testo, referenceId);
                            deliveryMessages.Add(deliveryMessage);
                        }
                    }
                    else
                    {
                        var nominativo = string.Empty;
                        if (persona != null)
                            nominativo = persona.DisplayName;
                        var destinatario = string.Join(",", destinatari);
                        deliveryMessages.Add(new DeliveryMessage(fullPathFile, nominativo, destinatario, referenceId));
                    }

                    // Se non viene passato in input creo una nuova delivery
                    delivery = new Delivery(idAzienda, motivoMessaggio.ToString(), deliveryMessages, new System.Net.Mail.MailAddress(mittente));
                    if (personaMessaggioDTO != null && personaMessaggioDTO.IdDelivery != null)
                        delivery.Id = personaMessaggioDTO.IdDelivery.Value;

                    _mailService.Send(delivery);
                }
                catch (Exception ex)
                {
                    invioRiuscito = false;
                    message = "Si sono verificati problemi nell'invio del messaggio :" + Environment.NewLine + ex.Message;
                    _log.ErrorFormat("Errore inaspettato durante l'invio della mail - {0} - oggetto:{1} - testo:{2} - destinatario:{3} - nominativo:{4} - emlFile:{5}", ex, Utility.GetMethodDescription(), oggetto, testo, destinatari.Aggregate("<NESSUNO>", (current, dest) => current + (dest + ", ")), persona != null ? persona.DisplayName : "<NULL>", fullPathFile);
                }

            }

            if (invioRiuscito)
            {
                var destinatarioStr = string.Empty;
                foreach (var dest in destinatari)
                {
                    if (!string.IsNullOrEmpty(destinatarioStr))
                        destinatarioStr += ",";
                    destinatarioStr += dest;
                }

                message = persona == null ? $"La mail è stata correttamente accodata: {destinatarioStr}"
                    : $"La mail è stata correttamente accodata: {persona.DisplayName} - {destinatarioStr}";
                
                // =====================================
                // Controllo rapportino
                // =====================================
                //// Crea un trigger che parte tra 10 minuti e ogni minuto per 30 volte controlla le mail in arrivo.
                //Trigger trigger = new PeriodicTrigger(DateTime.UtcNow.AddSeconds(10), null, TimeSpan.FromMinutes(1), 30);

                //// Create a job specification for my job.
                //var jobSpec = new JobSpec("Controllo rapportino", "Verifica e salvataggio email contenente rapportino di conferma di invio FAX", "ConfermaRicezioneMessaggio", trigger);
                ////jobSpec.JobData = jobData;

                //// Create a job.  If it already exists in the persistent store then automatically update
                //// its definition to reflect the provided job specification.  This is a good idea when using
                //// a scheduler cluster because the job is guaranteed to be created exactly once and kept up
                //// to date without it ever being accidentally deleted by one instance while another instance
                //// is processing it.
                //_scheduler.CreateJob(jobSpec, CreateJobConflictAction.Replace);

                //// Start the scheduler.
                //_scheduler.Start();

            }

            var risultatoInvio = new RisultatoInvioMessaggio(referenceId, referenceId, invioRiuscito, message, new DocumentInfo());

            try
            {
                if (invioRiuscito)
                {
                    if (motivoMessaggio != MotivoMessaggio.ScadenzaContratto && motivoMessaggio != MotivoMessaggio.NotificaResponsabileAttivita)
                    {
                        var allegatiMessaggio = new List<DocumentInfo>();
                        if (allegati != null)
                            allegatiMessaggio = allegati.ToList();

                        var storicoMessaggio = _messaggisticaService.StoricizzaMessaggio(persona, condominio, risultatoInvio, motivoMessaggio, oggetto, testo, destinatari, mittente, emailRapportino, allegatiMessaggio, TipoMessaggio.Email);
                        if (storicoMessaggio != null)
                            risultatoInvio.IdMessaggio = storicoMessaggio.ID;
                    }

                    risultatoInvio.IdDelivery = delivery.Id;
                }
            }
            catch(Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la storicizzazione del messaggio - {0} - oggetto:{1} - destinatario:{2}", ex, Utility.GetMethodDescription(), oggetto, destinatari.Aggregate("<NESSUNO>", (current, dest) => current + (dest + ", ")));
                throw;
            }
            
            return new List<RisultatoInvioMessaggio> { risultatoInvio};
        }