/// <summary> /// Identifica una singola email /// </summary> /// <param name="to">Email del destinatario</param> /// <param name="subject">Oggetto della mail</param> /// <param name="body">Testo della mail</param> /// <param name="referenceId">Identificativo del destinatario della mail</param> public DeliveryMessagePo(Delivery delivery, MailAddress to, string subject, string body, string referenceId) : base(to, subject, body, referenceId) { Delivery = delivery; CreatedDate = DateTime.Now; if(Delivery != null) Delivery.Messages.Add(this); }
/// <summary> /// Identifica una singola email /// </summary> /// <param name="emlFile">File Eml che deve essere inviato</param> /// <param name="referenceId">Identificativo del destinatario della mail</param> public DeliveryMessagePo(Delivery delivery, string emlFile, string nominativoTo, string emailTo, string referenceId) : base(emlFile, nominativoTo, emailTo, referenceId) { Delivery = delivery; CreatedDate = DateTime.Now; RecipientEmail = emailTo; RecipientName = nominativoTo; if (Delivery != null) Delivery.Messages.Add(this); }
/// <summary> /// Elabora l'oggetto <paramref name="delivery"/> accodando tutti messaggi presenti nella collection Messages /// </summary> /// <param name="delivery">Oggetto contenente tutti i messaggi da inviare</param> public void Send(Delivery delivery) { var recipients = new List<DeliveryMessagePo>(delivery.Messages.Count); DeliveryPo deliveryPo = null; if(delivery.Id > 0) deliveryPo = _daoFactory.GetDeliveryPoDao().Find(delivery.Id, false); if(deliveryPo == null) deliveryPo = new DeliveryPo(delivery.IdAzienda, delivery.Type, recipients, delivery.Sender, delivery.Cc, delivery.Bcc, delivery.ReplyTo, delivery.MaxRetry, delivery.Test); foreach (var deliveryMessage in delivery.Messages) { var deliveryMessagePo = !string.IsNullOrEmpty(deliveryMessage.EmlFile) ? new DeliveryMessagePo(deliveryPo, deliveryMessage.EmlFile, deliveryMessage.NominativoTo, deliveryMessage.EmailTo, deliveryMessage.ReferenceId) : new DeliveryMessagePo(deliveryPo, deliveryMessage.To, deliveryMessage.Subject, deliveryMessage.Body, deliveryMessage.ReferenceId); recipients.Add(deliveryMessagePo); } _daoFactory.GetDeliveryPoDao().SaveOrUpdate(deliveryPo); deliveryPo.State = StatoDelivery.DaSpedire; delivery.Id = deliveryPo.Id; var log = new DeliveryLog(deliveryPo, $"E' stata accodata una spedizione del tipo '{delivery.Type}' contenente {delivery.Messages.Count} messaggi - #{deliveryPo.Id}"); }
/// <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}; }