Exemple #1
0
        public void ProcessIMAPFolder()
        {
            using (var imapClient = new IMAP_Client()) {
                _imapClient = imapClient;
                ConnectToIMAP();

                try {
                    var items    = Enumerable.Empty <IMAP_FetchItem>().ToArray();
                    var toDelete = new List <IMAP_FetchItem>();
                    do
                    {
                        toDelete.Clear();
                        ImapReader.PingReader();
                        items = FetchUIDs();
                        if (log.IsDebugEnabled)
                        {
                            log.DebugFormat("Получено {0} UIDs", items.Length);
                        }
                        //обрабатываем мисьма пачками что бы уменьшить вероятность появления дублей
                        //при остановке шатной или аварийной остановке
                        items = items.Take(100).ToArray();
                        ImapReader.PingReader();

                        foreach (var item in items)
                        {
                            if (log.IsDebugEnabled)
                            {
                                log.DebugFormat("Обработка {0} UID", item.UID);
                            }

                            IMAP_FetchItem[] OneItem = null;
                            try {
                                OneItem = FetchMessages(item.UID);

                                Message = Mime.Parse(OneItem[0].MessageData);

                                CurrentUID = item.UID;

                                ImapReader.PingReader();
                                ImapReader.ProcessMime(Message);
                                toDelete.Add(item);
                            }
                            catch (Exception ex) {
                                if (log.IsDebugEnabled)
                                {
                                    log.Debug(String.Format("Не удалось обработать письмо {0} UID", item.UID), ex);
                                }
                                Message = null;
                                var errorInfo = GetErrorInfo(item.UID);
                                if (UIDTimeout(errorInfo))
                                {
                                    ErrorInfos.Remove(errorInfo);
                                    toDelete.Add(item);
                                    ImapReader.ProcessBrokenMessage(item, OneItem, ex);
                                }
                            }
                        }

                        //Производим удаление писем
                        if (toDelete.Count > 0)
                        {
                            var sequence = new IMAP_SequenceSet();

                            sequence.Parse(String.Join(",", toDelete.Select(i => i.UID.ToString())), long.MaxValue);
                            imapClient.DeleteMessages(sequence, true);
                        }
                    } while (items.Length > 0 && toDelete.Count > 0);
                }
                finally {
                    Message = null;
                }
            }
        }
Exemple #2
0
 public void ConnectToIMAP()
 {
     _imapClient.Connect(Settings.Default.IMAPHost, 143);
     ImapReader.IMAPAuth(_imapClient);
     _imapClient.SelectFolder(Settings.Default.IMAPSourceFolder);
 }