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; } } }
public void ConnectToIMAP() { _imapClient.Connect(Settings.Default.IMAPHost, 143); ImapReader.IMAPAuth(_imapClient); _imapClient.SelectFolder(Settings.Default.IMAPSourceFolder); }