/// <summary> Возвращает список id для всех сообщений в почтовом ящике удовлетворяющих критерию поиска </summary> /// <returns> criteria => "from=*s.belo* subject=FW:*"</returns> /// <remarks> Сообщения, помеченные для удаления, не перечисляются.</remarks> public List <int> GetMessageList(string criteria, Encoding encoding = null) { var result = new List <int>(); var filters = ParseCriteria(criteria); var oldEncoding = Encoding; Encoding = encoding ?? Encoding; try { foreach (var v in GetMessageList()) { var m = new MimeReader(GetResponse("TOP {0} 0".FormatStr(v), true).Data); foreach (var f in filters) { if (!MimeReader.DecodeWord(m.Headers[f.Key] + "").Trim().IsMatch(f.Value)) { m = null; break; } } if (m != null) { result.Add(v); } } } finally { Encoding = oldEncoding; } return(result); }
public MailMimeMessage(MimeReader reader, Encoding defaultEncoding) { if (defaultEncoding != null) { DefaultEncoding = defaultEncoding; } if (!reader.ContentType.Boundary.IsEmpty()) { BuildMultiPartMessage(reader); } else if (reader.ContentType.MediaType == "message/rfc822") { if (reader.Children.Count == 0) { throw new Exception("Invalid child count on message/rfc822 entity."); } BuildMultiPartMessage(reader.Children[0]); //заголовок внутри сообщения } else if (reader.ContentDisposition != null && reader.ContentDisposition.DispositionType == "attachment") //fix dong bug { AddAttachment(reader); } else { BuildSinglePartMessage(reader); } string value = ""; foreach (string key in reader.Headers.AllKeys) { value = reader.Headers[key].IfEmpty(" "); try { Headers.Add(key, value); } catch (FormatException) //value not ASCII (т.е. не Subject: =?koi8-r?B?79TQ1dPLwQ==?=) { Headers.Add(key, @"=?{0}?B?{1}?=".FormatStr(DefaultEncoding.WebName, Convert.ToBase64String(DefaultEncoding.GetBytes(value)))); //некоторые присылают не ascii (c FW4 - поддерживается UTF-8 ) } value = MimeReader.DecodeWord(value); switch (key) { case "bcc": if (!IsUndisclosed(value)) { Array.ForEach(SplitAddresses(value), Bcc.Add); } break; case "cc": if (!IsUndisclosed(value)) { Array.ForEach(SplitAddresses(value), CC.Add); } break; case "from": if (!IsUndisclosed(value)) { From = CreateMailAddress(value); } break; case "reply-to": if (!IsUndisclosed(value)) { Array.ForEach(SplitAddresses(value), ReplyToList.Add); } //ReplyTo = CreateMailAddress(value); break; case "subject": Subject = value.ReplaceAny("", Environment.NewLine); SubjectEncoding = Encoding.UTF8; break; case "to": if (!IsUndisclosed(value)) { Array.ForEach(SplitAddresses(value), To.Add); } break; } } }