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