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