Example #1
0
        /// <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;
                }
            }
        }