This project is read-only.

Delete new Message and \Recent Flag Bug

Topics: Issues
Mar 20, 2014 at 1:55 AM
Edited Mar 20, 2014 at 2:21 AM
Добрый день, Павел. Извиняюсь что на русском языке, но так я смогу более подробней объяснить суть проблемы. В общем, при поступлении нового письма, и при получении его флагов с сервера IMAP, в свойстве-коллекции c флагами ImapX.Message.Flags будет находить \Recent. При попытке удалить такое письмо вызовом метода ImapX.Message.Remove():
 public bool Remove()
 {
            if (!Flags.Add(MessageFlags.Deleted)|| !Folder.Expunge()) return false;
            Folder.Messages.RemoveInternal(this);
            return true;
 }
происходит добавления флага MessageFlags.Deleted:
     public bool AddRange(IEnumerable<string> flags)
        {
            if (Client == null)
            {
                base.AddRangeInternal(flags);
                return true;
            }

            if (Client.SelectedFolder != _message.Folder)
                _message.Folder.Select();

            IList<string> data = new List<string>();
            if (!Client.SendAndReceive(string.Format(ImapCommands.Store,
                _message.UId, AddType,
                string.Join(" ",
                    __this__.Concat(flags.Where(_ => !string.IsNullOrEmpty(_)))
                        .Distinct()
                        .Select(_ => (AddQuotes ? "\"" : "") + _ + (AddQuotes ? "\"" : ""))
                        .Select(_ =>  (IsUTF7 ? ImapUTF7.Encode(_) : _)).ToArray())),
                ref data)) return false;

            AddRangeInternal(flags.Except(List));

            return true;
        }
Проблема кроется в том, что для LINQ конкатенации используется this, а у нас уже там находиться флаг \Recent, а поскольку этот флаг не должен устанавливается клиентом, то при Client.SendAndReceive нам будет возвращено false и в конечно итоге, ни одно сообщения, которое сервер возвращает с флагом \Recent не будет удалено.
Вот моя вариаци баг фикса этой проблемы:
        public bool AddRange(IEnumerable<string> flags)
        {
            if (Client == null)
            {
                base.AddRangeInternal(flags);
                return true;
            }

            IList<string> data = new List<string>();
            if (!Client.SendAndReceive(string.Format(ImapCommands.Store,
                _message.UId, AddType,
                string.Join(" ",
                    this.Concat(flags.Where(_ => !string.IsNullOrEmpty(_)))
                               .Where(_=>!_.Equals(Flags.MessageFlags.Recent))
                               .Distinct()
                               .Select(_ => (AddQuotes ? "\"" : "") + _ + (AddQuotes ? "\"" : ""))
                               .Select(_ =>  (IsUTF7 ? ImapUTF7.Encode(_) : _)).ToArray())),
                ref data)) 
                 return false;

            AddRangeInternal(flags.Except(List));

            return true;
        }
Mar 20, 2014 at 1:52 PM
Добрый вечер TheByteMan,

без проблем, спасибо большое за правки, включу в новую сборку!

С уважением,

Павел