/// <summary> /// Удаляет все сообщения из IMAP папки по фильтру subject /// </summary> public static void ClearImapFolder(string mailbox, string password, string folder, string subject) { using (var imapClient = new IMAP_Client()) { imapClient.Connect(Settings.Default.IMAPHost, Convert.ToInt32(Settings.Default.IMAPPort)); imapClient.Authenticate(mailbox, password); imapClient.SelectFolder(folder); var sequenceSet = new IMAP_SequenceSet(); sequenceSet.Parse("1:*", Int64.MaxValue); var items = String.IsNullOrEmpty(subject) ? imapClient.FetchMessages(sequenceSet, IMAP_FetchItem_Flags.UID, false, false) : imapClient.FetchMessages(sequenceSet, IMAP_FetchItem_Flags.UID | IMAP_FetchItem_Flags.Envelope, false, false); //производим фильтрацию, если параметр subject установлен if (!String.IsNullOrEmpty(subject) && items != null && items.Length > 0) { items = items .Where(i => i.Envelope.Subject?.Equals(subject, StringComparison.CurrentCultureIgnoreCase) == true) .ToArray(); } if ((items != null) && (items.Length > 0)) { var sequenceMessages = new IMAP_SequenceSet(); sequenceMessages.Parse(String.Join(",", items.Select(i => i.UID.ToString()).ToArray()), long.MaxValue); imapClient.DeleteMessages(sequenceMessages, true); } } }
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; } } }