Esempio n. 1
0
        /// <summary>
        /// Elimina dal server online le PECMail che non sono state cancellate a seguito di un  precedente tentativo di cancellazione fallito
        /// Se e' attiva la cancellazione online, scarica l'INTERO eml nella drop folder. Successivamente confronta l'eml con quello già archiviato in biblos.
        /// Nel caso in cui i due file coincidono cancella la PECMail e pulisce la drop.
        /// Nel caso in cui invece i due file non coincidono prosegue col processo normale come se fosse una nuova PECMail.
        /// </summary>
        private void WashOnlinePecNotErased(MailInfo mailInfo, string password)
        {
            PECMailBox box = _storeFacade.GetMailBox(mailInfo.IDPECMailBox);

            if (!box.Configuration.DeleteMailFromServer.GetValueOrDefault(false))
            {
                if (IsEmlArchiviedInBiblos(mailInfo))
                {
                    DeleteFromServer(mailInfo, box, password);
                    mailInfo.RemoveFiles(_parameters.DropFolder);
                }
            }
        }
Esempio n. 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);
        }