예제 #1
0
        /// <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");
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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);
        }
예제 #5
0
        /// <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);
        }
예제 #6
0
        /// <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");
        }
예제 #7
0
        /// <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");
        }