/// <summary> /// Elabora i file _info.xml ed i relativi file eml scaricati. /// L'elaborazione produce una cartella con tutti gli allegati per ciascun file. /// Vengono anche elaborati ed espansi i file compressi /// Al termine del processo viene generato un file _index.xml che contiene l'elenco dei file allegati con marcatura di quelli speciali per la PEC /// es. Postacert.eml, daticert.xml ecc... /// </summary> public void ProcessFiles() { FileLogger.Info(_loggerName, "Avvio elaborazione mail scaricate"); try { String[] files = MailInfo.GetInfoFiles(_parameters.DropFolder); MailInfo mailInfo = null; foreach (String filename in files) { try { if (_cancelRequest()) { FileLogger.Info(_loggerName, "Chiusura modulo invocata dall'utente."); return; } mailInfo = MailInfo.Load(filename); if (mailInfo.HasError() || mailInfo.Status != MailInfo.ProcessStatus.Downloaded) { continue; } mailInfo.Process(_parameters.DropFolder, _parameters.BiblosMaxLength); } catch (Exception ex_int) { String pecName = filename; if (mailInfo != null) { pecName = mailInfo.Subject; } FileLogger.Error(_loggerName, string.Format("Errore in elaborazione della mail {0}. Il flusso normale proseguirà con le successive mail.", pecName), ex_int); _sendMessage(string.Format("Errore in elaborazione mail {0}. Il flusso normale proseguirà con le successive mail. Exception: {1} - Stacktrace: {2}", pecName, ex_int.Message, _fullStacktrace(ex_int))); } } } catch (Exception ex) { FileLogger.Error(_loggerName, "Errore globale in elaborazione delle mails.", ex); _sendMessage(string.Format("Errore globale in elaborazione delle mails. Exception:{0} - Stacktrace: {1}", ex.Message, _fullStacktrace(ex))); } FileLogger.Info(_loggerName, "Fine elaborazione mail scaricate"); }
/// <summary> /// Pulizia dei file generati nel drop folder per consentire l'elaborazione del contenuto della mail e l'archiviazione della stessa /// Inoltre si occupa di spostare le mail con errori e quelle invece archiviate con successo /// Se richiesto elimina la mail dal server e crea un backup su file system /// </summary> /// <param name="dumpFolder"></param> public SortedList <short, StatisticLog> ReleaseFiles(string dumpFolder, SortedList <short, StatisticLog> statistics, Dictionary <short, string> passwordBoxes) { FileLogger.Info(_loggerName, "Avvio pulizia file temporanei e mail archiviate"); try { String[] files = MailInfo.GetInfoFiles(_parameters.DropFolder); MailInfo mailInfo = null; DateTime start, end; //rimuove o sposta le mail processate foreach (String filename in files) { try { mailInfo = null; start = DateTime.Now; if (_cancelRequest()) { FileLogger.Info(_loggerName, "Chiusura modulo invocata dall'utente."); return(statistics); } mailInfo = MailInfo.Load(filename); PECMailBox box = _storeFacade.GetMailBox(mailInfo.IDPECMailBox); ImapClient imapClient = new ImapClient(CreateImapParams(box, passwordBoxes[box.Id])); //ERRORE DI ELABORAZIONE if (mailInfo.HasError()) { //invia warnings PECMail pecMail = mailInfo.IDPECMail > 0 ? _storeFacade.GetMail(mailInfo.IDPECMail) : null; if (pecMail != null && pecMail.Id > 0) { IList <PECMailLog> logs = MailStoreFacade.Factory.PECMailLogFacade.GetByPec(pecMail); if (logs.Count > 0) { foreach (PECMailLog pecMailLog in logs.Where(pecMailLog => pecMailLog.Type == PECMailLogType.Warning.ToString() || pecMailLog.Type == PECMailLogType.Error.ToString())) { _sendMessage(string.Format("PEC[{0}] {1}: {2}", pecMail.Id, pecMailLog.Type, pecMailLog.Description)); } } } //se indicato sposta in cartella di errore if (mailInfo.Client == MailInfo.ClientType.Imap && !string.IsNullOrEmpty(box.Configuration.MoveErrorToFolder)) { imapClient.MoveByUid(long.Parse(mailInfo.MailUID), box.Configuration.MoveErrorToFolder); FileLogger.Warn(_loggerName, string.Format("Mail Uid:{0} 'SPOSTATA SU CARTELLA:{1}' nel Server {2} [{3}]", mailInfo.MailUID, box.Configuration.MoveErrorToFolder, box.MailBoxName, box.IncomingServerName)); } //se indicato una cartella di errore sposta la mail scaricata e i relativi file if (!string.IsNullOrEmpty(_parameters.ErrorFolder)) { mailInfo.MoveFiles(_parameters.DropFolder, _parameters.ErrorFolder); } } //ELABORATA CON SUCCESSO if (mailInfo.Status == MailInfo.ProcessStatus.Archived) { // Verifico se è stata richiesta la cancellazione dal server if (box.Configuration.DeleteMailFromServer.GetValueOrDefault(false)) { //esegui backup prima della cancellazione if (!string.IsNullOrEmpty(_parameters.DumpFolder)) { BackupToFolder(mailInfo, box, dumpFolder); if (!_parameters.DebugModeEnabled) { DeleteFromServer(mailInfo, box, passwordBoxes[box.Id]); } else { FileLogger.Info(_loggerName, "Cancellazione da server non effettuata per modalità debug attiva."); } } else { throw new Exception("Impossibile effettuare il backup prima della cancellazione da server a causa della mancanza del parametro \"DumpFolder\""); } } else { //nel caso di connessione Imap if (mailInfo.Client == MailInfo.ClientType.Imap) { if (box.Configuration.MarkAsRead && !_parameters.DebugModeEnabled) { imapClient.MarkMessageSeen(long.Parse(mailInfo.MailUID)); FileLogger.Info(_loggerName, string.Format("Mail Uid:{0} 'IMPOSTATA COME LETTA' nel Server {1} [{2}]", mailInfo.MailUID, box.MailBoxName, box.IncomingServerName)); } if (!string.IsNullOrEmpty(box.Configuration.MoveToFolder) && !_parameters.DebugModeEnabled) { imapClient.MoveByUid(long.Parse(mailInfo.MailUID), box.Configuration.MoveToFolder); FileLogger.Info(_loggerName, string.Format("Mail Uid:{0} 'SPOSTATA SU CARTELLA:{1}' nel Server {2} [{3}]", mailInfo.MailUID, box.Configuration.MoveToFolder, box.MailBoxName, box.IncomingServerName)); } } } //Se tutto è andato a buon fine allora procedo a svuotare la cartella di drop FileLogger.Debug(_loggerName, "Cancellazione file elaborati in DropFolder"); mailInfo.RemoveFiles(_parameters.DropFolder); } end = DateTime.Now; if (mailInfo != null && statistics != null && statistics.Keys != null && statistics.Keys.Any(f => f == mailInfo.IDPECMailBox)) { statistics[mailInfo.IDPECMailBox].ElaboratedTime = statistics[mailInfo.IDPECMailBox].ElaboratedTime + (TimeSpan.FromTicks(end.Ticks) - TimeSpan.FromTicks(start.Ticks)); } } catch (Exception ex_int) { String pecName = filename; if (mailInfo != null) { pecName = mailInfo.Subject; try { PECMailBox box = MailStoreFacade.Factory.PECMailboxFacade.GetById(mailInfo.IDPECMailBox); MailStoreFacade.Factory.PECMailboxLogFacade.InsertLog(ref box, "ERRORE - Pulizia EML", PECMailBoxLogFacade.PecMailBoxLogType.ErrorEval); } catch (Exception) { } } FileLogger.Error(_loggerName, string.Format("Errore in pulizia file temporanei e mail archiviate della mail {0}. Il flusso normale proseguirà con le successive mail.", pecName), ex_int); _sendMessage(string.Format("Errore in pulizia file temporanei e mail archiviate della mail {0}. Il flusso normale proseguirà con le successive mail. Exception: {1} - Stacktrace: {2}", pecName, ex_int.Message, _fullStacktrace(ex_int))); } } } catch (Exception ex) { FileLogger.Error(_loggerName, "Errore pulizia file temporanei e mail archiviate.", ex); _sendMessage(string.Format("Errore pulizia file temporanei e mail archiviate.{0}Exception: {1}{0}Stacktrace: {2}", Environment.NewLine, ex.Message, _fullStacktrace(ex))); } FileLogger.Info(_loggerName, "Fine pulizia file temporanei e mail archiviate"); return(statistics); }
/// <summary> /// Archiviazione dei file generati dalla ProcessFolder. /// Questa funzione racchiude tutte le funzioni di archiviazione su storage della mail (Biblos e DocSuite) /// I file vengono salvati in Biblos secondo la gerarchia indicata nel file ..._index.xml /// Genera il record PecMail e tutte i record di supporto per i file contenuti nella Pec (postacert.eml, daticert.xml, ecc...) /// Genera i record per PecMailAttachments /// </summary> public SortedList <short, StatisticLog> ArchiveFiles(SortedList <short, StatisticLog> statistics) { FileLogger.Info(_loggerName, "Avvio archiviazione mail elaborate"); PECMail pecMail = null; int nRetry = MaxRetry; String errMsg = string.Empty; int waitingTime = 30000; try { String[] files = MailInfo.GetInfoFiles(_parameters.DropFolder); DateTime start, end; foreach (String filename in files) { start = DateTime.Now; try { if (_cancelRequest()) { FileLogger.Info(_loggerName, "Chiusura modulo invocata dall'utente."); return(statistics); } nRetry = MaxRetry; errMsg = string.Empty; waitingTime = 30000; IterationTracker iterationTracker = new IterationTracker(); while (--nRetry > 0) { IterationDescriptor currentIterationInfo = iterationTracker.AddIteration(); if (_storeFacade.ArchiveMail(_parameters.DropFolder, filename, _parameters.DebugModeEnabled, true, out pecMail, out errMsg, currentIterationInfo)) { FileLogger.Info(_loggerName, $"Archiviazione di MailInfo [{filename}] avvenuta con successo, passaggio ad elemento successivo."); if (pecMail?.MailBox != null && statistics?.Keys != null && statistics.Keys.Any(f => f == pecMail.MailBox.Id)) { statistics[pecMail.MailBox.Id].PECDone++; } break; } FileLogger.Warn(_loggerName, $"E' avvenuto un errore di archiviazione, potenzialmente temporaneo. Verrà ritentata l'archiviazione altre {nRetry} volte dopo una pausa di {waitingTime / 1000} sec."); //Errore di archiviazione, attendo 150 secondi diviso il tentativo prima di riprovare if (nRetry > 0) { #if !DEBUG System.Threading.Thread.Sleep(waitingTime); #endif waitingTime += waitingTime / nRetry; } } iterationTracker.Log(_loggerName); // Se mi trovo qui significa che ho esaurito i tentativi di archiviazione if (nRetry <= 0) { String errorMessage = $"{errMsg} - Eseguiti {MaxRetry} tentativi di archiviazione senza successo."; if (pecMail != null && pecMail.Id > 0) { String errorResult = $"La PEC {pecMail.Id} non è stata correttamente inserita ed è stata disattivata (isActive = 255) e dovrà essere riattivata previa verifica dell'errore. {errorMessage}"; pecMail.IsActive = ActiveType.Cast(ActiveType.PECMailActiveType.Error); try { MailStoreFacade.Factory.PECMailFacade.UpdateOnly(ref pecMail); MailStoreFacade.Factory.PECMailLogFacade.Error(ref pecMail, errorResult); if (pecMail != null && pecMail.MailBox != null && statistics != null && statistics.Keys != null && statistics.Keys.Any(f => f == pecMail.MailBox.Id)) { statistics[pecMail.MailBox.Id].PECError++; } } catch (Exception ex) { errorMessage = string.Concat(errorMessage, "\n", ex.Message); } } //throw new ApplicationException(errorMessage); } end = DateTime.Now; if (pecMail?.MailBox != null && statistics?.Keys != null && statistics.Keys.Any(f => f == pecMail.MailBox.Id)) { statistics[pecMail.MailBox.Id].ElaboratedTime = statistics[pecMail.MailBox.Id].ElaboratedTime + (TimeSpan.FromTicks(end.Ticks) - TimeSpan.FromTicks(start.Ticks)); } } catch (Exception ex_int) { if (pecMail != null && pecMail.Id > 0) { try { PECMailBox box = MailStoreFacade.Factory.PECMailboxFacade.GetById(pecMail.MailBox.Id); MailStoreFacade.Factory.PECMailboxLogFacade.InsertLog(ref box, "ERRORE - Archiviazione mail", PECMailBoxLogFacade.PecMailBoxLogType.ErrorEval); end = DateTime.Now; if (pecMail != null && pecMail.MailBox != null && statistics != null && statistics.Keys != null && statistics.Keys.Any(f => f == pecMail.MailBox.Id)) { statistics[pecMail.MailBox.Id].ElaboratedTime = statistics[pecMail.MailBox.Id].ElaboratedTime + (TimeSpan.FromTicks(end.Ticks) - TimeSpan.FromTicks(start.Ticks)); statistics[pecMail.MailBox.Id].PECError++; } } catch (Exception ex_log) { FileLogger.Error(_loggerName, string.Format("Errore in archiviazione mail {0} -> logger. Il flusso normale proseguirà con le successive mail.", filename), ex_log); _sendMessage(string.Format("Errore in archiviazione mail -> logger. Il flusso normale proseguirà con le successive mail.{0}Exception: {1}{0}Stacktrace: {2}", Environment.NewLine, ex_log.Message, _fullStacktrace(ex_log))); } } FileLogger.Error(_loggerName, string.Format("Errore in archiviazione mail {0}. Il flusso normale proseguirà con le successive mail.", filename), ex_int); _sendMessage(string.Format("Errore in archiviazione mail. Il flusso normale proseguirà con le successive mail.{0}Exception: {1}{0}Stacktrace: {2}", Environment.NewLine, ex_int.Message, _fullStacktrace(ex_int))); } } } catch (Exception ex) { FileLogger.Error(_loggerName, "Errore in archiviazione globale mail.", ex); _sendMessage(string.Format("Errore in archiviazione globale mail.{0}Exception: {1}{0}Stacktrace: {2}", Environment.NewLine, ex.Message, _fullStacktrace(ex))); } FileLogger.Info(_loggerName, "Fine archiviazione mail scaricate e processate"); return(statistics); }
/// <summary> /// Elabora i file _info.xml ed i relativi file eml scaricati. /// L'elaborazione produce una cartella con tutti gli allegati per ciascun file. /// Vengono anche elaborati ed espansi i file compressi /// Al termine del processo viene generato un file _index.xml che contiene l'elenco dei file allegati con marcatura di quelli speciali per la PEC /// es. Postacert.eml, daticert.xml ecc... /// </summary> public SortedList <short, StatisticLog> ProcessFiles(SortedList <short, StatisticLog> statistics) { FileLogger.Info(_loggerName, "Avvio elaborazione mail scaricate"); try { String[] files = MailInfo.GetInfoFiles(_parameters.DropFolder); MailInfo mailInfo = null; DateTime start, end; foreach (String filename in files) { start = DateTime.Now; try { if (_cancelRequest()) { FileLogger.Info(_loggerName, "Chiusura modulo invocata dall'utente."); return(statistics); } mailInfo = MailInfo.Load(filename); if (mailInfo.HasError() || mailInfo.Status != MailInfo.ProcessStatus.Downloaded) { continue; } mailInfo.Process(_parameters.DropFolder, _parameters.BiblosMaxLength); end = DateTime.Now; if (statistics != null && mailInfo != null && statistics.Keys.Any(f => f == mailInfo.IDPECMailBox)) { statistics[mailInfo.IDPECMailBox].ElaboratedTime = statistics[mailInfo.IDPECMailBox].ElaboratedTime + (TimeSpan.FromTicks(end.Ticks) - TimeSpan.FromTicks(start.Ticks)); } } catch (Exception ex_int) { String pecName = filename; if (mailInfo != null) { pecName = mailInfo.Subject; try { end = DateTime.Now; if (statistics != null && mailInfo != null && statistics.Keys.Any(f => f == mailInfo.IDPECMailBox)) { statistics[mailInfo.IDPECMailBox].ElaboratedTime = statistics[mailInfo.IDPECMailBox].ElaboratedTime + (TimeSpan.FromTicks(end.Ticks) - TimeSpan.FromTicks(start.Ticks)); statistics[mailInfo.IDPECMailBox].PECError++; } PECMailBox box = MailStoreFacade.Factory.PECMailboxFacade.GetById(mailInfo.IDPECMailBox); MailStoreFacade.Factory.PECMailboxLogFacade.InsertLog(ref box, "ERRORE - Elaborazione EML", PECMailBoxLogFacade.PecMailBoxLogType.ErrorEval); } catch (Exception) { } } FileLogger.Error(_loggerName, string.Format("Errore in elaborazione della mail {0}. Il flusso normale proseguirà con le successive mail.", pecName), ex_int); _sendMessage(string.Format("Errore in elaborazione mail {0}. Il flusso normale proseguirà con le successive mail. Exception: {1} - Stacktrace: {2}", pecName, ex_int.Message, _fullStacktrace(ex_int))); } } } catch (Exception ex) { FileLogger.Error(_loggerName, "Errore globale in elaborazione delle mails.", ex); _sendMessage(string.Format("Errore globale in elaborazione delle mails. Exception:{0} - Stacktrace: {1}", ex.Message, _fullStacktrace(ex))); } FileLogger.Info(_loggerName, "Fine elaborazione mail scaricate"); return(statistics); }
/// <summary> /// Verifica se la mail scaricata utilizzando l'hash md5 dell'intero Eml se questa è già presente nel db, e quindi non deve essere ri-elaborata. /// Allo stesso tempo aggiorna il campo Header Hash calcolato dalla nuova versione della gestione pec nella tabella PecMail per /// poter individuare da subito utilizzando il solo header se si tratta di una mail già processata /// Se la mail esiste lo status viene già portata ad Archivied affinche venga gestito la release con evenutale cancellazione e backup della mail. /// </summary> public SortedList <short, StatisticLog> UpdateHeaderHash(SortedList <short, StatisticLog> statistics, Dictionary <short, string> passwordBoxes) { FileLogger.Info(_loggerName, "Verifica checksum mail scaricate"); try { String[] files = MailInfo.GetInfoFiles(_parameters.DropFolder); List <int> isActiveIn = new List <int> { 0, 1, 2 }; //rimuove o sposta le mail processate MailInfo mailInfo = null; DateTime start, end; foreach (String filename in files) { try { mailInfo = null; start = DateTime.Now; if (_cancelRequest()) { FileLogger.Info(_loggerName, "Chiusura modulo invocata dall'utente."); return(statistics); } mailInfo = MailInfo.Load(filename); if (mailInfo.Status != MailInfo.ProcessStatus.Downloaded) { end = DateTime.Now; if (statistics != null && mailInfo != null && mailInfo.IDPECMailBox > 0 && statistics.Keys.Any(f => f == mailInfo.IDPECMailBox)) { statistics[mailInfo.IDPECMailBox].ElaboratedTime = statistics[mailInfo.IDPECMailBox].ElaboratedTime + (TimeSpan.FromTicks(end.Ticks) - TimeSpan.FromTicks(start.Ticks)); } continue; } //ok, la mail non esiste bisogna processarla if (!MailStoreFacade.Factory.PECMailFacade.ChecksumExists(mailInfo.EmlHash, mailInfo.MailBoxRecipient)) { end = DateTime.Now; if (statistics != null && mailInfo != null && mailInfo.IDPECMailBox > 0 && statistics.Keys.Any(f => f == mailInfo.IDPECMailBox)) { statistics[mailInfo.IDPECMailBox].ElaboratedTime = statistics[mailInfo.IDPECMailBox].ElaboratedTime + (TimeSpan.FromTicks(end.Ticks) - TimeSpan.FromTicks(start.Ticks)); } continue; } //se esiste e mi trovo a questo punto, aggiorno il valore dell'headerChecksum IList <PECMail> results = MailStoreFacade.Factory.PECMailFacade.GetByChecksum(mailInfo.EmlHash, mailInfo.MailBoxRecipient, isActiveIn); foreach (PECMail pecMail in results.Where(item => string.IsNullOrEmpty(item.HeaderChecksum))) { PECMail temp = pecMail; temp.HeaderChecksum = mailInfo.HeaderHash; MailStoreFacade.Factory.PECMailFacade.Update(ref temp); FileLogger.Info(_loggerName, string.Format("HeaderHash aggiornato per la Mail Id:{0}.", temp.Id)); } //Old: Non serve più importare la mail perchè esiste già, verra rimossa nella fase di Release, quindi la segno come archiviata mailInfo.UpdateStatus(MailInfo.ProcessStatus.Archived); mailInfo.Save(); WashOnlinePecNotErased(mailInfo, passwordBoxes[mailInfo.IDPECMailBox]); end = DateTime.Now; if (statistics != null && mailInfo != null && statistics.Keys.Any(f => f == mailInfo.IDPECMailBox)) { statistics[mailInfo.IDPECMailBox].ElaboratedTime = statistics[mailInfo.IDPECMailBox].ElaboratedTime + (TimeSpan.FromTicks(end.Ticks) - TimeSpan.FromTicks(start.Ticks)); } } catch (Exception ex_int) { String pecName = filename; if (mailInfo != null) { pecName = mailInfo.Subject; try { PECMailBox box = MailStoreFacade.Factory.PECMailboxFacade.GetById(mailInfo.IDPECMailBox); MailStoreFacade.Factory.PECMailboxLogFacade.InsertLog(ref box, "ERRORE - Verifica checksum", PECMailBoxLogFacade.PecMailBoxLogType.ErrorEval); } catch (Exception) { } } FileLogger.Error(_loggerName, string.Format("Errore in verifica checksum mail scaricate della mail {0}. Il flusso normale proseguirà con le successive mail.", pecName), ex_int); _sendMessage(string.Format("Errore in verifica checksum mail scaricate della mail {0}. Il flusso normale proseguirà con le successive mail. Exception: {1} - Stacktrace: {2}", pecName, ex_int.Message, _fullStacktrace(ex_int))); } } } catch (Exception ex) { FileLogger.Error(_loggerName, "Errore in verifica checksum mail scaricate.", ex); _sendMessage(string.Format("Errore in verifca checksum mail scaricate. Exception:{0} - Stacktrace: {1}", ex.Message, _fullStacktrace(ex))); } FileLogger.Info(_loggerName, "Fine checksum mail scaricate"); return(statistics); }
/// <summary> /// Archiviazione dei file generati dalla ProcessFolder. /// Questa funzione racchiude tutte le funzioni di archiviazione su storage della mail (Biblos e DocSuite) /// I file vengono salvati in Biblos secondo la gerarchia indicata nel file ..._index.xml /// Genera il record PecMail e tutte i record di supporto per i file contenuti nella Pec (postacert.eml, daticert.xml, ecc...) /// Genera i record per PecMailAttachments /// </summary> public void ArchiveFiles() { FileLogger.Info(_loggerName, "Avvio archiviazione mail elaborate"); PECMail pecMail = null; int nRetry = MaxRetry; String errMsg = string.Empty; int waitingTime = 30000; try { String[] files = MailInfo.GetInfoFiles(_parameters.DropFolder); foreach (String filename in files) { try { if (_cancelRequest()) { FileLogger.Info(_loggerName, "Chiusura modulo invocata dall'utente."); return; } nRetry = MaxRetry; errMsg = string.Empty; waitingTime = 30000; IterationTracker iterationTracker = new IterationTracker(); while (--nRetry > 0) { IterationDescriptor currentIterationInfo = iterationTracker.AddIteration(); if (_storeFacade.ArchiveMail(_parameters.DropFolder, filename, _parameters.DebugModeEnabled, true, out pecMail, out errMsg, currentIterationInfo)) { FileLogger.Info(_loggerName, string.Format("Archiviazione di MailInfo [{0}] avvenuta con successo, passaggio ad elemento successivo.", filename)); break; } FileLogger.Warn(_loggerName, string.Format("E' avvenuto un errore di archiviazione, potenzialmente temporaneo. Verrà ritentata l'archiviazione altre {0} volte dopo una pausa di {1} sec.", nRetry, waitingTime / 1000)); //Errore di archiviazione, attendo 150 secondi diviso il tentativo prima di riprovare if (nRetry > 0) { #if !DEBUG Thread.Sleep(waitingTime); #endif waitingTime += waitingTime / nRetry; } } iterationTracker.Log(_loggerName); // Se mi trovo qui significa che ho esaurito i tentativi di archiviazione if (nRetry <= 0) { String errorMessage = string.Format("{0} - Eseguiti {1} tentativi di archiviazione senza successo.", errMsg, MaxRetry); if (pecMail != null) { String errorResult = string.Format("La PEC {0} non è stata correttamente inserita ed è stata disattivata (isActive = 255) e dovrà essere riattivata previa verifica dell'errore. {1}", pecMail.Id, errorMessage); pecMail.IsActive = ActiveType.Cast(ActiveType.PECMailActiveType.Error); try { MailStoreFacade.Factory.PECMailFacade.UpdateOnly(ref pecMail); MailStoreFacade.Factory.PECMailLogFacade.Error(ref pecMail, errorResult); } catch (Exception ex) { errorMessage = string.Concat(errorMessage, "\n", ex.Message); } } //throw new ApplicationException(errorMessage); } } catch (Exception ex_int) { FileLogger.Error(_loggerName, string.Format("Errore in archiviazione mail {0}. Il flusso normale proseguirà con le successive mail.", filename), ex_int); _sendMessage(string.Format("Errore in archiviazione mail. Il flusso normale proseguirà con le successive mail.{0}Exception: {1}{0}Stacktrace: {2}", Environment.NewLine, ex_int.Message, _fullStacktrace(ex_int))); } } } catch (Exception ex) { FileLogger.Error(_loggerName, "Errore in archiviazione globale mail.", ex); _sendMessage(string.Format("Errore in archiviazione globale mail.{0}Exception: {1}{0}Stacktrace: {2}", Environment.NewLine, ex.Message, _fullStacktrace(ex))); } FileLogger.Info(_loggerName, "Fine archiviazione mail scaricate e processate"); }
/// <summary> /// Verifica se la mail scaricata utilizzando l'hash md5 dell'intero Eml se questa è già presente nel db, e quindi non deve essere ri-elaborata. /// Allo stesso tempo aggiorna il campo Header Hash calcolato dalla nuova versione della gestione pec nella tabella PecMail per /// poter individuare da subito utilizzando il solo header se si tratta di una mail già processata /// Se la mail esiste lo status viene già portata ad Archivied affinche venga gestito la release con evenutale cancellazione e backup della mail. /// </summary> public void UpdateHeaderHash() { FileLogger.Info(_loggerName, "Verifica checksum mail scaricate"); try { String[] files = MailInfo.GetInfoFiles(_parameters.DropFolder); List <int> isActiveIn = new List <int> { 0, 1, 2 }; //rimuove o sposta le mail processate MailInfo mailInfo = null; foreach (String filename in files) { try { mailInfo = null; if (_cancelRequest()) { FileLogger.Info(_loggerName, "Chiusura modulo invocata dall'utente."); return; } mailInfo = MailInfo.Load(filename); if (mailInfo.Status != MailInfo.ProcessStatus.Downloaded) { continue; } //ok, la mail non esiste bisogna processarla if (!MailStoreFacade.Factory.PECMailFacade.ChecksumExists(mailInfo.EmlHash, mailInfo.MailBoxRecipient)) { continue; } //se esiste e mi trovo a questo punto, aggiorno il valore dell'headerChecksum IList <PECMail> results = MailStoreFacade.Factory.PECMailFacade.GetByChecksum(mailInfo.EmlHash, mailInfo.MailBoxRecipient, isActiveIn); foreach (PECMail pecMail in results.Where(item => string.IsNullOrEmpty(item.HeaderChecksum))) { PECMail temp = pecMail; temp.HeaderChecksum = mailInfo.HeaderHash; MailStoreFacade.Factory.PECMailFacade.Update(ref temp); FileLogger.Info(_loggerName, string.Format("HeaderHash aggiornato per la Mail Id:{0}.", temp.Id)); } //Old: Non serve più importare la mail perchè esiste già, verra rimossa nella fase di Release, quindi la segno come archiviata mailInfo.UpdateStatus(MailInfo.ProcessStatus.Archived); mailInfo.Save(); WashOnlinePecNotErased(mailInfo); } catch (Exception ex_int) { String pecName = filename; if (mailInfo != null) { pecName = mailInfo.Subject; } FileLogger.Error(_loggerName, string.Format("Errore in verifica checksum mail scaricate della mail {0}. Il flusso normale proseguirà con le successive mail.", pecName), ex_int); _sendMessage(string.Format("Errore in verifica checksum mail scaricate della mail {0}. Il flusso normale proseguirà con le successive mail. Exception: {1} - Stacktrace: {2}", pecName, ex_int.Message, _fullStacktrace(ex_int))); } } } catch (Exception ex) { FileLogger.Error(_loggerName, "Errore in verifica checksum mail scaricate.", ex); _sendMessage(string.Format("Errore in verifca checksum mail scaricate. Exception:{0} - Stacktrace: {1}", ex.Message, _fullStacktrace(ex))); } FileLogger.Info(_loggerName, "Fine checksum mail scaricate"); }