protected override bool RunInternal(ImapCommand cmd)
        {
            // <sequnce set> mbox
            // NO - Wrong name
            Context.CommandProvider.Write("* " + cmd.Args + "\r\n");
            var match = Regex.Match(cmd.Args, "(?<sq>[^ ]+) (?<mbox>[^ ]+)$");

            if (!match.Success || !match.Groups["mbox"].Success || !match.Groups["sq"].Success ||
                string.IsNullOrWhiteSpace(match.Groups["mbox"].Value))
            {
                Context.CommandProvider.Write($"{cmd.Tag} BAD\r\n");
                return(true);
            }

            var mailbox     = match.Groups["mbox"].Value;
            var sqString    = match.Groups["sq"].Value;
            var isUid       = Context.States.Any(s => s.State == ImapState.Uid);
            var idType      = isUid ? MessageIdType.Uid : MessageIdType.Id;
            var sequenceSet = ImapCommon.GetMessageSequenceSet(sqString);
            var uids        = ImapCommon.ExtractRealMessageIds(Context, sequenceSet, idType);

            if (!Context.EntityProvider.DirectoryProvider.Copy(mailbox, uids.ToArray()))
            {
                Context.CommandProvider.Write($"{cmd.Tag} NO\r\n");
                return(true);
            }

            if (!isUid)
            {
                Context.CommandProvider.Write($"{cmd.Tag} OK COPY\r\n");
            }
            return(true);
        }
        protected override bool RunInternal(ImapCommand cmd)
        {
            var args = cmd.Args.Split(' ');

            if (args.Length < 1)
            {
                Context.CommandProvider.Write($"{cmd.Tag} BAD\r\n");
            }
            var range = ImapCommon.GetMessageSequenceSet(args[0]);

            if (range.Item1 == ImapCommon.MessageSequenceType.None)
            {
                Context.CommandProvider.Write($"{cmd.Tag} BAD\r\n");
            }

            var dataItemsString = string.Join(' ', args.Skip(1));

            var idType     = Context.States.Any(s => s.State == ImapState.Uid) ? MessageIdType.Uid : MessageIdType.Id;
            var messageIds = ImapCommon.ExtractRealMessageIds(Context, range, idType).ToList();

            if (!messageIds.Any())
            {
                Context.CommandProvider.Write($"{cmd.Tag} NO\r\n");
            }
            foreach (var messageId in messageIds)
            {
                var fetchData = ParseDataItems(dataItemsString);
                if (!FetchMessage(messageId, fetchData))
                {
                    Context.CommandProvider.Write($"{cmd.Tag} BAD");
                    return(false);
                }
            }

            // Если команда была вызвана из SELECT ящика
            // не из UID и не из STORE
            if (Context.PrePeekState.State == ImapState.Selected)
            {
                Context.CommandProvider.Write($"{cmd.Tag} OK FETCH\r\n");
            }

            return(true);
        }
示例#3
0
        protected override bool RunInternal(ImapCommand cmd)
        {
            var args        = cmd.Args.Split(' ');
            var sequenceSet = ImapCommon.GetMessageSequenceSet(args[0]);
            var idType      = Context.States.Any(s => s.State == ImapState.Uid) ? MessageIdType.Uid : MessageIdType.Id;

            var messageIds = ImapCommon.ExtractRealMessageIds(Context, sequenceSet, idType).ToArray();
            var flagsData  = ParseStoreFlagData(cmd.Args);

            if (flagsData == null)
            {
                Context.CommandProvider.Write($"{cmd.Tag} BAD\r\n");
                return(true);
            }

            if (!ApplyStore(messageIds, flagsData))
            {
                return(false);
            }

            Context.CommandProvider.Write($"{cmd.Tag} OK STORE completed\r\n");
            return(true);
        }