Exemple #1
0
        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)
        {
            try
            {
                if (destinatari.Count > 0)
                {
                    var message = string.Empty;
                    var invioRiuscito = false;
                    var allegatiLista = new List<DocumentInfo>(allegati.Count);
                    Persona persona = null;
                    if (personaMessaggioDTO != null)
                        persona = _daoFactory.GetPersonaDao().Find(personaMessaggioDTO.ID, false);

                    var results = new List<RisultatoInvioMessaggio>();
                    var result = new eMessageResultSendFAX();

                    try
                    {
                        int? idCondominio = null;
                        if (condominio != null)
                            idCondominio = condominio.ID;

                        var destinatariSend = new List<string>();
                        foreach (var item in destinatari)
                        {
                            if (!item.Trim().StartsWith("+39"))
                                destinatariSend.Add("+39" + Conversione.ToPhoneNumber(item));
                            else
                                destinatariSend.Add(Conversione.ToPhoneNumber(item));
                        }

                        // =====================================
                        // Creo le pagine del FAX
                        // =====================================
                        var nomiFiles = new string[allegati.Count];
                        var contenutoAllegati = new byte[allegati.Count][];

                        // -------------------------------------
                        // Allegati
                        // -------------------------------------
                        var index = 0;
                        foreach (var documento in allegati)
                        {
                            nomiFiles[index] = documento.FileName + documento.FileExtension;
                            contenutoAllegati[index] = documento.Body;
                            allegatiLista.Add(documento);
                            index++;
                        }

                        // -------------------------------------
                        // Oggetto
                        // -------------------------------------
                        decimal? importo = null;
                        var tipoIndirizzo = TipoIndirizzo.Recapito;
                        if (personaMessaggioDTO != null)
                        {
                            importo = personaMessaggioDTO.Importo;
                            tipoIndirizzo = personaMessaggioDTO.TipoIndirizzo;
                        }
                        var parametri = new ParametriStampaUnione(persona != null ? (int?)persona.ID : null, idUnitaImmobiliare, idResponsabile, idIncaricatoAttivita, idFornitore, idCondominio, null, tipoIndirizzo, 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);

                        // =====================================
                        // Invio Messaggio
                        // =====================================
                        // -------------------------------------
                        // Invio
                        // -------------------------------------
                        var service = new Fax { Timeout = 999999999 };
                        var userService = new Users();
                        var credenziali = _configurationService.GetLoginInfo(idAzienda);

                        if (credenziali != null && !string.IsNullOrEmpty(credenziali.Value.Utente) && !string.IsNullOrEmpty(credenziali.Value.Password))
                        {
                            var success = false;
                            try
                            {
                                var resultUsers = userService.Login(credenziali.Value.Utente, credenziali.Value.Password, null);
                                success = resultUsers.success;
                            }
                            catch (Exception ex)
                            {
                                _log.WarnFormat("Errore durante il controllo delle credenziali - {0} - username:{1} - password:{2}", ex, Utility.GetMethodDescription(), credenziali.Value.Utente, credenziali.Value.Password);
                            }
                            if (success)
                            {
                                var identificazioneMittente = _configurationService.GetIdentificazioneMittente(idAzienda, TipoMessaggio.Fax, TipoIndirizzo.Recapito);

                                // Controllo identificazione mittente
                                if (string.IsNullOrEmpty(identificazioneMittente.Numero))
                                    return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", null, false, "Il fax non può essere inviato perchè non è presente il numero di fax del mittente" + Environment.NewLine + "Inserire il numero nella anagrafica dello studio e riprovare.", new DocumentInfo()) };

                                if (!string.IsNullOrEmpty(identificazioneMittente.Email))
                                {
                                    if (!string.IsNullOrEmpty(emailRapportino))
                                        emailRapportino += ",";
                                    emailRapportino += identificazioneMittente.Email;
                                }

                                // Mittente
                                if (string.IsNullOrEmpty(mittente))
                                    mittente = identificazioneMittente.Nome;

                                if (ConfigurationManager.AppSettings["IsTest"] != null && bool.Parse(ConfigurationManager.AppSettings["IsTest"]))
                                    destinatariSend = new List<string> { "+390513371992" };

                                var parameters = new List<OptionalParameters>
                                {
                                    new OptionalParameters { ParameterName = "NotificationEmail", ParameterValue = emailRapportino },
                                    new OptionalParameters { ParameterName = "DeliveryTime", ParameterValue = DateTime.Now.ToString() },
                                    new OptionalParameters { ParameterName = "HeaderFax", ParameterValue = identificazioneMittente.Numero },
                                    new OptionalParameters { ParameterName = "HeaderName", ParameterValue = mittente }
                                };

                                if (!parametriInvioLettera.Asincrono)
                                    result = service.Send(credenziali.Value.Utente, credenziali.Value.Password, destinatariSend.ToArray(), contenutoAllegati, nomiFiles, parameters.ToArray());
                                else
                                {
                                    service.SendAsync(credenziali.Value.Utente, credenziali.Value.Password, destinatariSend.ToArray(), contenutoAllegati, nomiFiles, parameters.ToArray());
                                    invioRiuscito = true;
                                }

                                message += result;
                                _log.InfoFormat("Risultato invio fax:{0} - destinatario:{1}", result, destinatariSend.Aggregate(string.Empty, (current, dest) => current + (dest + ", ")));

                                if (result.SpeditionResult.All(item => item.success))
                                    invioRiuscito = true;
                            }
                            else
                            {
                                _log.WarnFormat("Credenziali non valide - {0} - username:{1} - password:{2}", Utility.GetMethodDescription(), credenziali.Value.Utente, credenziali.Value.Password);
                            }
                        }
                        else
                        {
                            _log.FatalFormat("Errore inaspettato durante l'invio del fax. NON sono presenti le credenziali per l'invio del fax - {0} - oggetto:{1} - destinatario:{2}", Utility.GetMethodDescription(), oggetto, destinatari[0]);
                            message = "KO - Non sono definite le credenziali per l'invio dei fax";
                        }
                    }
                    catch (Exception ex)
                    {
                        invioRiuscito = false;

                        _log.FatalFormat("Errore inaspettato durante l'invio del fax - {0} - oggetto:{1} - destinatario:{2}", ex, Utility.GetMethodDescription(), oggetto, destinatari[0]);
                        message = "KO - Errore inaspettato durante l'invio del fax";
                    }

                    if (motivoMessaggio != MotivoMessaggio.ScadenzaContratto && invioRiuscito)
                    {
                        foreach (var singleResult in result.SpeditionResult)
                        {
                            try
                            {
                                string messaggioInvio;
                                if (singleResult.success)
                                {
                                    messaggioInvio = string.Format("Fax accodato per l'invio: {0}", singleResult.jobCode);
                                    _log.InfoFormat("Invio FAX RIUSCITO - {0} - messageCode: {1} - messaggio: {2} - jobcode: {3} - destinatario: {4}", Utility.GetMethodDescription(), singleResult.messageCode, singleResult.errorDescription, singleResult.jobCode, destinatari.Aggregate(string.Empty, (current, dest) => current + (dest + ";")));
                                }
                                else
                                {
                                    messaggioInvio = "Invio della lettera non riuscito:" + Environment.NewLine + singleResult.errorDescription;
                                    _log.WarnFormat("Invio FAX FALLITO - {0} - messageCode: {1} - messaggio: {2} - jobcode: {3} - destinatario: {4}", Utility.GetMethodDescription(), singleResult.messageCode, singleResult.errorDescription, singleResult.jobCode, destinatari.Aggregate(string.Empty, (current, dest) => current + (dest + ";")));
                                }

                                var resultInvio = new RisultatoInvioMessaggio(singleResult.jobCode, singleResult.messageCode, singleResult.success, messaggioInvio, new DocumentInfo());
                                var storicoMessaggio = _messaggisticaService.StoricizzaMessaggio(persona, condominio, resultInvio, motivoMessaggio, oggetto, testo, destinatari, mittente, emailRapportino, allegatiLista, TipoMessaggio.Fax);
                                if (storicoMessaggio != null)
                                    resultInvio.IdMessaggio = storicoMessaggio.ID;
                                results.Add(resultInvio);
                            }
                            catch (Exception ex)
                            {
                                _log.ErrorFormat("Errore inaspettato durante la storicizzazione del messaggio - {0} - oggetto:{1} - destinatario:{2}", ex, Utility.GetMethodDescription(), oggetto, destinatari[0]);
                                throw;
                            }
                        }
                    }
                    else
                    {
                        if (!invioRiuscito)
                            results.Add(new RisultatoInvioMessaggio("KO", null, false, message, new DocumentInfo()));
                    }

                    return results;
                }
            }
            catch (Exception ex)
            {
                var idPersona = "<NULL>";
                if (personaMessaggioDTO != null)
                    idPersona = personaMessaggioDTO.ID.ToString();

                var idCondominio = "<NULL>";
                if (condominio != null)
                    idCondominio = condominio.ID.ToString();

                _log.FatalFormat("Errore inaspettato nell'invio del fax - {0} - azienda:{1} - persona:{2} - condominio:{3} - motivoMessaggio:{4} - oggetto:{5} - testo:{6} - destinatari:{7} - mittente:{8} - emailRapportino:{9}", ex, Utility.GetMethodDescription(), idAzienda, idPersona, idCondominio, motivoMessaggio, oggetto, testo, destinatari.Aggregate(string.Empty, (current, dest) => current + (dest + ", ")), mittente, emailRapportino);
                throw;
            }

            return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio(null, null, false, "Non è definito nessun destinatario", new DocumentInfo())};
        }
Exemple #2
0
        private List<RisultatoInvioMessaggio> elaboraResult(eMessageResultSendSMS result, List<RisultatoInvioMessaggio> resultMessages)
        {
            foreach (var singleResult in result.SpeditionResult)
            {
                try
                {
                    string messaggioInvio;
                    if (singleResult.success)
                    {
                        messaggioInvio = string.Format("Sms accodato per l'invio: {0}", singleResult.jobCode);
                        _log.InfoFormat("Invio sms RIUSCITO - {0} - messageCode: {1} - messaggio: {2} - jobcode: {3} - destinatario: {4}", Library.Utility.GetMethodDescription(), singleResult.messageCode, singleResult.errorDescription, singleResult.jobCode, _destinatari.Aggregate(string.Empty, (current, dest) => current + (dest + ";")));
                    }
                    else
                    {
                        messaggioInvio = "Invio del SMS non riuscito:" + Environment.NewLine + singleResult.errorDescription;
                        _log.WarnFormat("Invio sms FALLITO - {0} - messageCode: {1} - messaggio: {2} - jobcode: {3} - destinatario: {4}", Library.Utility.GetMethodDescription(), singleResult.messageCode, singleResult.errorDescription, singleResult.jobCode, _destinatari.Aggregate(string.Empty, (current, dest) => current + (dest + ";")));
                    }

                    var resultInvio = new RisultatoInvioMessaggio(singleResult.jobCode, singleResult.messageCode, singleResult.success, messaggioInvio, new DocumentInfo());
                    var storicoMessaggio = _messagisticaService.StoricizzaMessaggio(_persona, _condominio, resultInvio, _motivoMessaggio, _oggetto, _testo, _destinatari, _mittente, _emailRapportino, null, TipoMessaggio.Sms);
                    if (storicoMessaggio != null)
                        resultInvio.IdMessaggio = storicoMessaggio.ID;

                    if(resultMessages != null)
                        resultMessages.Add(resultInvio);
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore inaspettato durante la storicizzazione del messaggio - {0} - oggetto:{1} - destinatario:{2} - azienda:{3}", ex, Library.Utility.GetMethodDescription(), _oggetto, _destinatari[0], _condominio.Azienda.ID);
                    throw;
                }
            }

            return resultMessages;
        }
        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)
        {
            if (destinatari.Count > 0)
            {
                var logDocuments = true;
                var results = new List<RisultatoInvioMessaggio>();
                var allegatiLista = new List<DocumentInfo>(allegati.Count + 1);
                Persona persona = null;
                if(personaMessaggioDTO != null)
                    persona = _daoFactory.GetPersonaDao().Find(personaMessaggioDTO.ID, false);

                try
                {
                    // =====================================
                    // Creo le pagine della Lettera
                    // =====================================
                    var nomiFiles = new string[allegati.Count];
                    var contenutoAllegati = new byte[allegati.Count][];

                    // -------------------------------------
                    // Allegati
                    // -------------------------------------
                    var index = 0;
                    foreach (var documento in allegati)
                    {
                        nomiFiles[index] = documento.FileName + documento.FileExtension;
                        contenutoAllegati[index] = _converter.ConvertToPdf(documento).ToArray();
                        allegatiLista.Add(documento);
                        index++;
                    }

                    // =====================================
                    // Invio Messaggio
                    // =====================================

                    // -------------------------------------
                    // Invio
                    // -------------------------------------
                    var credenziali = _configurationService.GetLoginInfo(idAzienda);

                    if (credenziali != null && !string.IsNullOrEmpty(credenziali.Value.Utente) && !string.IsNullOrEmpty(credenziali.Value.Password))
                    {
                        var userService = new it.emessage.users.Users();
                        var success = false;
                        try
                        {
                            var resultUsers = userService.Login(credenziali.Value.Utente, credenziali.Value.Password, null);
                            success = resultUsers.success;
                        }
                        catch (Exception ex)
                        {
                            _log.WarnFormat("Errore durante il controllo delle credenziali - {0} - username:{1} - password:{2}", ex, Library.Utility.GetMethodDescription(), credenziali.Value.Utente, credenziali.Value.Password);
                        }
                        if (success)
                        {
                            var tipoIndirizzo = TipoIndirizzo.Recapito;
                            if (personaMessaggioDTO != null)
                                tipoIndirizzo = personaMessaggioDTO.TipoIndirizzo;
                            var identificazioneMittente = _configurationService.GetIdentificazioneMittente(idAzienda, TipoMessaggio.Fax, tipoIndirizzo);

                            // Controllo identificazione mittente
                            if (string.IsNullOrEmpty(identificazioneMittente.Indirizzo))
                                return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", null, false, "La lettera non può essere inviata perchè non è presente l'INDIRIZZO POSTALE del mittente" + Environment.NewLine + "Inserire l'informazione mancante nella anagrafica dello studio e riprovare.", new DocumentInfo()) };
                            if (string.IsNullOrEmpty(identificazioneMittente.Cap))
                                return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", null, false, "La lettera non può essere inviata perchè non è presente il CAP del mittente" + Environment.NewLine + "Inserire l'informazione mancante nella anagrafica dello studio e riprovare.", new DocumentInfo()) };
                            if (string.IsNullOrEmpty(identificazioneMittente.Comune))
                                return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", null, false, "La lettera non può essere inviata perchè non è presente il COMUNE del mittente" + Environment.NewLine + "Inserire l'informazione mancante nella anagrafica dello studio e riprovare.", new DocumentInfo()) };
                            if (string.IsNullOrEmpty(identificazioneMittente.Provincia))
                                return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", null, false, "La lettera non può essere inviata perchè non è presente la PROVINCIA del mittente" + Environment.NewLine + "Inserire l'informazione mancante nella anagrafica dello studio e riprovare.", new DocumentInfo()) };
                            if (string.IsNullOrEmpty(identificazioneMittente.Stato))
                                return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", null, false, "La lettera non può essere inviata perchè non è presente lo STATO del mittente" + Environment.NewLine + "Inserire l'informazione mancante nella anagrafica dello studio e riprovare.", new DocumentInfo()) };

                            // Controllo destinatari
                            foreach (var dest in destinatari)
                            {
                                var destinatarioAry = dest.Split('¥');
                                var recipient = new Contact
                                {
                                    Company = destinatarioAry[0],
                                    FirstName = destinatarioAry[1],
                                    LastName = destinatarioAry[2],
                                    Address = destinatarioAry[3],
                                    City = destinatarioAry[4],
                                    State = destinatarioAry[5],
                                    ZipCode = destinatarioAry[6],
                                    Country = destinatarioAry[7]
                                };

                                if (string.IsNullOrEmpty(recipient.Address))
                                    return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", null, false, string.Format("La lettera non può essere inviata perchè non è presente l'INDIRIZZO POSTALE di '{0} {1} {2}' {3} Inserire l'informazione mancante nella anagrafica del destinatario e riprovare.", recipient.Company, recipient.FirstName, recipient.LastName, Environment.NewLine), new DocumentInfo()) };
                                if (string.IsNullOrEmpty(recipient.ZipCode))
                                    return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", null, false, string.Format("La lettera non può essere inviata perchè non è presente il CAP di '{0} {1} {2}' {3} Inserire l'informazione mancante nella anagrafica del destinatario e riprovare.", recipient.Company, recipient.FirstName, recipient.LastName, Environment.NewLine), new DocumentInfo()) };
                                if (string.IsNullOrEmpty(recipient.City))
                                    return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", null, false, string.Format("La lettera non può essere inviata perchè non è presente il COMUNE di '{0} {1} {2}' {3} Inserire l'informazione mancante nella anagrafica del destinatario e riprovare.", recipient.Company, recipient.FirstName, recipient.LastName, Environment.NewLine), new DocumentInfo()) };
                                if (string.IsNullOrEmpty(recipient.State))
                                    return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", null, false, string.Format("La lettera non può essere inviata perchè non è presente la PROVINCIA di '{0} {1} {2}' {3} Inserire l'informazione mancante nella anagrafica del destinatario e riprovare.", recipient.Company, recipient.FirstName, recipient.LastName, Environment.NewLine), new DocumentInfo()) };
                                if (string.IsNullOrEmpty(recipient.Country))
                                    return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", null, false, string.Format("La lettera non può essere inviata perchè non è presente lo STATO di '{0} {1} {2}' {3} Inserire l'informazione mancante nella anagrafica del destinatario e riprovare.", recipient.Company, recipient.FirstName, recipient.LastName, Environment.NewLine), new DocumentInfo()) };
                            }

                            if (!string.IsNullOrEmpty(identificazioneMittente.Email))
                            {
                                if (!string.IsNullOrEmpty(emailRapportino))
                                    emailRapportino += ",";
                                emailRapportino += identificazioneMittente.Email;
                            }

                            // Mittente
                            if (string.IsNullOrEmpty(mittente))
                                mittente = identificazioneMittente.Nome;

                            if (ConfigurationManager.AppSettings["IsTest"] != null && bool.Parse(ConfigurationManager.AppSettings["IsTest"]))
                                destinatari = new List<string> { "Giorgio Parmeggiani¥Giorgio¥Parmeggiani¥via Larga 36¥Bologna¥BO¥40138¥ITALIA" };

                            var sender = new Contact
                            {
                                Address = identificazioneMittente.Indirizzo,
                                City = identificazioneMittente.Comune,
                                Company = identificazioneMittente.RagioneSociale,
                                State = identificazioneMittente.Provincia,
                                FirstName = identificazioneMittente.Nome,
                                LastName = identificazioneMittente.Cognome,
                                ZipCode = identificazioneMittente.Cap,
                                Country = identificazioneMittente.Stato
                            };

                            var recipients = new Contact[destinatari.Count];
                            var indexRecipients = 0;
                            foreach (var dest in destinatari)
                            {
                                var destinatarioAry = dest.Split('¥');
                                var recipient = new Contact
                                {
                                    Company = destinatarioAry[0],
                                    FirstName = destinatarioAry[1],
                                    LastName = destinatarioAry[2],
                                    Address = destinatarioAry[3],
                                    City = destinatarioAry[4],
                                    State = destinatarioAry[5],
                                    ZipCode = destinatarioAry[6],
                                    Country = destinatarioAry[7]
                                };
                                recipients[indexRecipients] = recipient;
                                indexRecipients++;
                            }

                            // Parametri spedizione
                            var parameters = new OptionalParameters[4];
                            parameters[0] = new OptionalParameters { ParameterName = "NotificationEmail", ParameterValue = emailRapportino };
                            parameters[1] = new OptionalParameters { ParameterName = "ColourPrint", ParameterValue = parametriInvioLettera.Colore.ToString() };
                            parameters[2] = new OptionalParameters { ParameterName = "OnlyFrontPrint", ParameterValue = (!parametriInvioLettera.FronteRetro).ToString() };
                            parameters[3] = new OptionalParameters { ParameterName = "CreateFirstPage", ParameterValue = parametriInvioLettera.PaginaIniziale.ToString() };

                            var service = new Letter { Timeout = 999999999 };

                            eMessageResultSendLetter resultSend;
                            try
                            {
                                var directoryName = string.Empty;
                                if (logDocuments)
                                {
                                    directoryName = $"{AppDomain.CurrentDomain.BaseDirectory}temp/{Guid.NewGuid()}";
                                    if (!Directory.Exists(directoryName))
                                        Directory.CreateDirectory(directoryName);

                                    for (var i = 0; i < contenutoAllegati.Length; i++)
                                    {
                                        var nomeFile = $"{directoryName}/{i.ToString().PadLeft(3, '0')}_{nomiFiles[i]}";
                                        using (var file = new FileStream(nomeFile, FileMode.Create, FileAccess.Write))
                                        {
                                            file.Write(contenutoAllegati[i], 0, contenutoAllegati[i].Length);
                                        }
                                    }
                                }

                                var pdfMerge = new PdfMerge();
                                var fileUnico = pdfMerge.Merge(contenutoAllegati, false);
                                var contentToSend = new byte[1][];
                                contentToSend[0] = fileUnico;

                                var nomiFilesToSend = new string[1];
                                nomiFilesToSend[0] = motivoMessaggio.ToString();
                                if (!string.IsNullOrEmpty(oggetto))
                                    nomiFilesToSend[0] += $"_{oggetto.ToFileName()}";
                                if (string.IsNullOrEmpty(nomiFilesToSend[0]))
                                    nomiFilesToSend[0] = "document";
                                nomiFilesToSend[0] += ".pdf";

                                if (logDocuments)
                                {
                                    var nomeFileUnico = $"{directoryName}/{nomiFilesToSend[0]}";
                                    using (var file = new FileStream(nomeFileUnico, FileMode.Create, FileAccess.Write))
                                    {
                                        file.Write(fileUnico, 0, fileUnico.Length);
                                    }
                                }

                                if (ConfigurationManager.AppSettings["IsTest"] != null && bool.Parse(ConfigurationManager.AppSettings["IsTest"]))
                                    resultSend = null;
                                else
                                    resultSend = service.Send(credenziali.Value.Utente, credenziali.Value.Password, sender, recipients, parametriInvioLettera.Tipo, contentToSend, nomiFilesToSend, parameters);
                            }
                            catch (System.Web.Services.Protocols.SoapException ex)
                            {
                                return new[]{ new RisultatoInvioMessaggio(null, null, false, ex.Message, new DocumentInfo()) };
                            }
                            catch (Exception ex)
                            {
                                _log.ErrorFormat("Errore inaspettato nell'invio della lettera - {0}", ex, Library.Utility.GetMethodDescription());
                                throw;
                            }

                            if (resultSend != null)
                            {
                                foreach (var eMessageSpeditionResult in resultSend.SpeditionResult)
                                {
                                    string messaggioInvio;
                                    if (eMessageSpeditionResult.success)
                                    {
                                        messaggioInvio = string.Format("Lettera accodata per l'invio: {0}", eMessageSpeditionResult.jobCode);
                                        _log.InfoFormat("Invio lettera RIUSCITO - {0} - messageCode: {1} - messaggio: {2} - jobcode: {3} - destinatario: {4}", Library.Utility.GetMethodDescription(), eMessageSpeditionResult.messageCode, eMessageSpeditionResult.errorDescription, eMessageSpeditionResult.jobCode, destinatari.Aggregate(string.Empty, (current, dest) => current + (dest + ";")));
                                    }
                                    else
                                    {
                                        messaggioInvio = "Invio della lettera non riuscito:" + Environment.NewLine + eMessageSpeditionResult.errorDescription;
                                        _log.WarnFormat("Invio lettera FALLITO - {0} - messageCode: {1} - messaggio: {2} - jobcode: {3} - destinatario: {4}", Library.Utility.GetMethodDescription(), eMessageSpeditionResult.messageCode, eMessageSpeditionResult.errorDescription, eMessageSpeditionResult.jobCode, destinatari.Aggregate(string.Empty, (current, dest) => current + (dest + ";")));
                                    }

                                    var resultInvio = new RisultatoInvioMessaggio(eMessageSpeditionResult.jobCode, eMessageSpeditionResult.messageCode, eMessageSpeditionResult.success, messaggioInvio, new DocumentInfo());
                                    var storicoMessaggio = _messaggisticaService.StoricizzaMessaggio(persona, condominio, resultInvio, motivoMessaggio, oggetto, testo, destinatari, mittente, emailRapportino, allegatiLista, TipoMessaggio.Lettera);
                                    if (storicoMessaggio != null)
                                        resultInvio.IdMessaggio = storicoMessaggio.ID;
                                    results.Add(resultInvio);
                                }                                
                            }
                        }
                        else
                        {
                            _log.WarnFormat("Credenziali non valide - {0} - username:{1} - password:{2} - azienda:{3}", Library.Utility.GetMethodDescription(), credenziali.Value.Utente, credenziali.Value.Password, idAzienda);
                        }
                    }
                    else
                    {
                        _log.ErrorFormat("Errore inaspettato durante l'invio della lettera. NON sono presenti le credenziali per l'invio della lettera - {0} - oggetto:{1} - destinatario:{2} - azienda:{3}", Library.Utility.GetMethodDescription(), oggetto, destinatari[0], idAzienda);
                        var message = string.Format("KO - Non sono definite le credenziali per l'invio della lettera.{0}Inserire le credenziali corrette nel pannello Messaggistica dell'anagrafica dello studio", Environment.NewLine);
                        return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", string.Empty, false, message, new DocumentInfo()) };
                    }
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore inaspettato durante l'invio della lettera - {0} - oggetto:{1} - destinatario:{2} - azienda:{3}", ex, Library.Utility.GetMethodDescription(), oggetto, destinatari[0], Security.Login.Instance.CurrentLogin().Azienda);
                    throw;
                }

                return results;
            }

            return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio("KO", string.Empty, false, "Non è definito nessun destinatario", new DocumentInfo()) };
        }
        public StoricoMessaggio StoricizzaMessaggio(Persona persona, Condominio condominio, RisultatoInvioMessaggio risultatoInvioMessaggio, MotivoMessaggio motivoMessaggio, string oggetto, string testo, IList<string> destinatari, string mittente, string emailRapportino, IList<DocumentInfo> allegati, TipoMessaggio tipoMessaggio)
        {
            try
            {
                StoricoMessaggio messaggio = null;
                if (motivoMessaggio != MotivoMessaggio.ScadenzaContratto)
                {
                    if (persona != null)
                    {
                        var indirizzi = string.Empty;
                        foreach (var destinatario in destinatari)
                        {
                            if (!string.IsNullOrEmpty(indirizzi))
                                indirizzi += "¥";
                            indirizzi += destinatario;
                        }

                        if (oggetto.Length > 512)
                            oggetto = oggetto.Substring(0, 512);

                        if (mittente.Length > 50)
                            mittente = mittente.Substring(0, 50);

                        messaggio = new StoricoMessaggio(persona, tipoMessaggio, motivoMessaggio, oggetto, indirizzi, mittente, risultatoInvioMessaggio.CodiceInvio, risultatoInvioMessaggio.CodiceMessaggio, risultatoInvioMessaggio.InvioRiuscito, DateTime.Now) { Testo = testo, Condominio = condominio };
                        
                        // TODO: Possibile sviluppo futuro
                        // =========================================================================================
                        //  Le email si suppongono sempre ricevute al momento dell'invio.
                        //  Per poter gestire uno stato 'InAttesa' occorre avere una gestione automatica delle 
                        //  conferme di ricezione attualmente non presente
                        // =========================================================================================
                        if (tipoMessaggio == TipoMessaggio.Email)
                            messaggio.Stato = StatoMessaggio.InAttesa;

                        _daoFactory.GetStoricoMessaggioDao().SaveOrUpdate(messaggio);

                        // ----------------------------------
                        // Allegati
                        // ----------------------------------
                        if (allegati != null)
                        {
                            foreach (var documentInfo in allegati)
                            {
                                var storicoMessaggioAllegato = new StoricoMessaggioAllegato(messaggio, documentInfo.FileId, documentInfo.FileName, documentInfo.FileExtension);
                                _daoFactory.GetStoricoMessaggioAllegatoDao().SaveOrUpdate(storicoMessaggioAllegato);
                            }
                        }
                    }
                }

                return messaggio;
            }
            catch (Exception ex)
            {
                _log.ErrorFormat("Errore inaspettato durante la storicizzazione del messaggio - {0}  - oggetto: {1} - indirizzi: {2} - tipo: {3}", ex, Utility.GetMethodDescription(), oggetto, destinatari.Aggregate(string.Empty, (current, destinatario) => current + (destinatario + "; ")), tipoMessaggio.ToString());
                throw;
            }
        }
        /// <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};
        }
        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)
        {
            if (destinatari.Count > 0)
            {
                if(allegati.Count == 0)
                    return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio(null, null, false, "Non è presente nessun messaggio da inviare", new DocumentInfo()) };

                _parametriInvioLettera = parametriInvioLettera;
                var results = new List<RisultatoInvioMessaggio>();
                var allegatiLista = new List<DocumentInfo>(allegati.Count + 1);
                Persona persona = null;
                if (personaMessaggioDTO != null)
                    persona = _daoFactory.GetPersonaDao().Find(personaMessaggioDTO.ID, false);

                try
                {
                    // =====================================
                    // Elaborazione documenti allegati
                    // =====================================
                    var nomiFiles = new string[allegati.Count];
                    var contenutoAllegati = new byte[allegati.Count][];

                    // -------------------------------------
                    // Allegati
                    // -------------------------------------
                    var index = 0;
                    foreach (var documento in allegati)
                    {
                        var body = documento.Body;
                        var fileExtension = documento.FileExtension;
                        var fileName = documento.FileName;

                        // Se richiesto converto l'allegato in PDF
                        if (parametriInvioLettera.FormatoDocumento == FormatoDocumentoEnum.Pdf)
                        {
                            try
                            {
                                var doc = new Document(new MemoryStream(documento.Body));
                                var pdfStream = new MemoryStream();
                                doc.Save(pdfStream, SaveFormat.Pdf);
                                body = pdfStream.ToArray();
                                fileExtension = ".pdf";
                            }
                            catch (UnsupportedFileFormatException ex)
                            {
                                _log.WarnFormat("Formato file non supportato - {0} - fileId:{1} - fileName:{2} - extension:{3}", ex, Utility.GetMethodDescription(), documento.FileId, documento.FileName, documento.FileExtension);
                            }
                            catch (Exception ex)
                            {
                                _log.ErrorFormat("Formato file non supportato - {0} - fileId:{1} - fileName:{2} - extension:{3}", ex, Utility.GetMethodDescription(), documento.FileId, documento.FileName, documento.FileExtension);
                            }
                        }

                        nomiFiles[index] = fileName + fileExtension;
                        contenutoAllegati[index] = body;

                        // Se NON creo un file singolo i singoli documenti li allego al messaggio
                        if(parametriInvioLettera.Aggregazione == AggregazioneDocumentiEnum.DocumentiSeparati)
                            allegatiLista.Add(new DocumentInfo(body, documento.FileId, fileName, fileExtension));
                        index++;
                    }

                    var nomeFile = string.Empty;

                    // =====================================
                    // Creazione dello zip
                    // =====================================
                    byte[] messaggio = null;
                    if (parametriInvioLettera.Aggregazione == AggregazioneDocumentiEnum.DocumentiSeparati)
                    {
                        // ------------------------------------------
                        //  Singolo ZIP con tutti i documenti per persona
                        // ------------------------------------------
                        var stream = new MemoryStream();
                        using (var zipFile = new ZipFile())
                        {
                            for (var i = 0; i < index; i++)
                            {
                                var zipEntry = zipFile.AddEntry(nomiFiles[i], contenutoAllegati[i]);
                            }

                            zipFile.Save(stream);
                        }
                        stream.Position = 0;

                        // ------------------------------------------
                        //  Aggiungo allo zip unico
                        // ------------------------------------------
                        if (_fileSingolo == null)
                            _fileSingolo = new ZipFile();

                        nomeFile = persona != null ? $"{(_fileSingolo.Count + 1).ToString().PadLeft(3, '0')} - {persona.ID.ToString().PadLeft(8, '0')} - {persona.DisplayName}.zip"
                            : oggetto;
                        _fileSingolo.AddEntry(nomeFile, stream);
                        messaggio = stream.ToArray();
                    }
                    else
                    {
                        if (index > 0)
                        {
                            // Se è presente più di un allegato eseguo veramente un merge, altrimenti, per evitare problemi
                            // di orientamento e dimensione del pdf finale, se ho un solo allegato prendo questo come documento finale
                            if (index > 1)
                            {
                                if (parametriInvioLettera.FormatoDocumento == FormatoDocumentoEnum.Pdf)
                                {
                                    var pdfMerge = new PdfMerge { EnablePagination = parametriInvioLettera.RinumeraPagine };
                                    IList<byte[]> documenti = new List<byte[]>(contenutoAllegati.Length);
                                    for (var i = 0; i < index; i++)
                                    {
                                        if (nomiFiles[i].EndsWith(".pdf"))
                                            documenti.Add(contenutoAllegati[i]);
                                    }
                                    messaggio = pdfMerge.Merge(documenti, true);
                                }
                                else
                                {
                                    // The document that the other documents will be appended to.
                                    var doc = new Document();
                                    // We should call this method to clear this document of any existing content.
                                    doc.RemoveAllChildren();

                                    for (var i = 0; i < index; i++)
                                    {
                                        try
                                        {
                                            // Open the document to join.
                                            var srcDoc = new Document(new MemoryStream(contenutoAllegati[i]));

                                            // Append the source document at the end of the destination document.
                                            doc.AppendDocument(srcDoc, ImportFormatMode.UseDestinationStyles);

                                            // In automation you were required to insert a new section break at this point, however in Aspose.Words we
                                            // don't need to do anything here as the appended document is imported as separate sectons already.

                                            // If this is the second document or above being appended then unlink all headers footers in this section
                                            // from the headers and footers of the previous section.
                                            if (i > 1)
                                                doc.Sections[i].HeadersFooters.LinkToPrevious(false);
                                        }
                                        catch (UnsupportedFileFormatException ex)
                                        {
                                            _log.WarnFormat("Documento con formato non riconosciuto - {0} - index:{1}", ex, Utility.GetMethodDescription(), index);
                                        }
                                    }

                                    var saveFormat = SaveFormat.Doc;
                                    if(parametriInvioLettera.FormatoDocumento == FormatoDocumentoEnum.Docx)
                                        saveFormat = SaveFormat.Docx;
                                    using (var stream = new MemoryStream())
                                    {
                                        doc.Save(stream, saveFormat);
                                        messaggio = stream.ToArray();
                                    }
                                }
                            }
                            else
                                messaggio = contenutoAllegati[0];

                            // ----------------------------------------------------------------
                            //  Aggiungo allo zip unico se richiesto un file unico per persona
                            // ----------------------------------------------------------------
                            if (parametriInvioLettera.Aggregazione == AggregazioneDocumentiEnum.DocumentoUnicoPerPersona)
                            {
                                if (_fileSingolo == null)
                                    _fileSingolo = new ZipFile();
                                nomeFile = persona != null ?
                                    $"{(_fileSingolo.Count + 1).ToString().PadLeft(3, '0')} - {persona.ID.ToString().PadLeft(8, '0')} - {persona.DisplayName}.{parametriInvioLettera.FormatoDocumento.ToString().ToLower()}"
                                    : oggetto;
                                if (string.IsNullOrEmpty(nomeFile) && nomiFiles.Length > 0 && !string.IsNullOrEmpty(nomiFiles[0]))
                                    nomeFile = nomiFiles[0];
                                if (string.IsNullOrEmpty(nomeFile))
                                    nomeFile = $"Documento.{parametriInvioLettera.FormatoDocumento.ToString().ToLower()}";
                                _fileSingolo.AddEntry(nomeFile, messaggio);
                            }
                            else
                            {
                                if (parametriInvioLettera.FormatoDocumento == FormatoDocumentoEnum.Pdf)
                                {
                                    var pdfMerge = new PdfMerge
                                    {
                                        EnablePagination = parametriInvioLettera.RinumeraPagine
                                    };
                                    if (_documentoSingolo != null)
                                        pdfMerge.AddDocument(_documentoSingolo);
                                    pdfMerge.AddDocument(messaggio);
                                    using (var stream = new MemoryStream())
                                    {
                                        pdfMerge.Merge(stream, true);
                                        _documentoSingolo = stream.ToArray();
                                    }
                                }
                                else
                                {
                                    var doc = new Document();
                                    doc.RemoveAllChildren();

                                    if (_documentoSingolo != null)
                                    {
                                        var singleDoc = new Document(new MemoryStream(_documentoSingolo));
                                        doc.AppendDocument(singleDoc, ImportFormatMode.UseDestinationStyles);
                                    }

                                    var newDoc = new Document(new MemoryStream(messaggio));
                                    doc.AppendDocument(newDoc, ImportFormatMode.UseDestinationStyles);
                                    doc.Sections[0].HeadersFooters.LinkToPrevious(false);

                                    var saveFormat = SaveFormat.Doc;
                                    if (parametriInvioLettera.FormatoDocumento == FormatoDocumentoEnum.Docx)
                                        saveFormat = SaveFormat.Docx;
                                    using (var stream = new MemoryStream())
                                    {
                                        doc.Save(stream, saveFormat);
                                        _documentoSingolo = stream.ToArray();
                                    }
                                }
                            }
                        }
                    }

                    if (messaggio != null)
                    {
                        var fileExtension = $".{parametriInvioLettera.FormatoDocumento.ToString().ToLower()}";
                        var documentMessage = _documentService.SaveDocument(messaggio, nomeFile, fileExtension, null, idAzienda);
                        if (documentMessage.Documento != null)
                        {
                            var checkSumMessaggio = documentMessage.Documento.Checksum;
                            var destinatarioMessaggio = "Tutti";
                            if (persona != null)
                                destinatarioMessaggio = persona.DisplayName;
                            var messaggioInvio = $"Messaggio preparato per l'invio: {destinatarioMessaggio}";

                            var document = new DocumentInfo();
                            var nomeDocumento = persona != null ? $"Lettera {motivoMessaggio} {DateTime.Today:d MMMM yyyy} - {persona.DisplayName}"
                                : $"Lettera {motivoMessaggio} {DateTime.Today:d MMMM yyyy}";
                            if (parametriInvioLettera.ApriFileGenerato)
                            {
                                document = new DocumentInfo(messaggio, checkSumMessaggio, nomeDocumento, fileExtension) { BodyText = oggetto };
                                allegatiLista.Add(document);
                            }

                            var resultInvio = new RisultatoInvioMessaggio(checkSumMessaggio, checkSumMessaggio, true, messaggioInvio, document);
                            var storicoMessaggio = _messaggisticaService.StoricizzaMessaggio(persona, condominio, resultInvio, motivoMessaggio, oggetto, testo, destinatari, mittente, emailRapportino, allegatiLista, TipoMessaggio.Manuale);
                            if (storicoMessaggio != null)
                                resultInvio.IdMessaggio = storicoMessaggio.ID;
                            results.Add(resultInvio);
                        }
                    }
                }
                catch (Exception ex)
                {
                    _log.ErrorFormat("Errore inaspettato durante la creazione del messaggio - {0} - oggetto:{1} - destinatario:{2}", ex, Utility.GetMethodDescription(), oggetto, destinatari[0]);
                    throw;
                }

                return results;
            }

            return new List<RisultatoInvioMessaggio> { new RisultatoInvioMessaggio(null, null, false, "Non è definito nessun destinatario", new DocumentInfo()) };
        }