public override async Task ExecuteAsync(CancellationToken cancellationToken) { Mailbox mailbox = await _mailstore.GetMailBoxAsync(_channel.AuthenticatedUser, _mailbox, true, cancellationToken); if (mailbox == null) { await EndWithResultAsync(_channel, CommandResult.No, "no mailbox with that name", cancellationToken); return; } var messageData = new List <IMessageData>(); if (_items.Contains("MESSAGES")) { messageData.Add(new AtomMessageData("MESSAGES")); messageData.Add(new NumberMessageData(mailbox.Messages.Count)); } if (_items.Contains("RECENT")) { messageData.Add(new AtomMessageData("RECENT")); messageData.Add(new NumberMessageData(mailbox.Recent.Count)); } if (_items.Contains("UIDNEXT")) { messageData.Add(new AtomMessageData("UIDNEXT")); messageData.Add(new NumberMessageData(mailbox.NextUid)); } if (_items.Contains("UIDVALIDITY")) { messageData.Add(new AtomMessageData("UIDVALIDITY")); messageData.Add(new NumberMessageData(mailbox.UidValidity)); } if (_items.Contains("UNSEEN")) { messageData.Add(new AtomMessageData("UNSEEN")); messageData.Add(new NumberMessageData(mailbox.Messages.Count(m => m.Flags.Contains(Tags.Seen)))); } await _channel.SendMessageAsync( new ImapMessage(UntaggedTag, CommandName, new ListMessageData(messageData)), cancellationToken); await EndOkAsync(_channel, cancellationToken); }
public override async Task ExecuteAsync(CancellationToken cancellationToken) { Mailbox mailbox = await _mailstore.GetMailBoxAsync(_channel.AuthenticatedUser, _mailbox, IsExamine, cancellationToken); if (mailbox == null) { await EndWithResultAsync(_channel, CommandResult.No, "no such mailbox", cancellationToken); return; } if (!mailbox.IsSelectable) { await EndWithResultAsync(_channel, CommandResult.No, "cannot select mailbox", cancellationToken); return; } SelectedMailbox selected = await _mailboxPointer.SelectMailboxAsync(mailbox, cancellationToken); await _channel.SendMessageAsync( new ImapMessage(UntaggedTag, new NumberMessageData(mailbox.Messages.Count), new AtomMessageData("EXISTS")), CancellationToken.None); await _channel.SendMessageAsync( new ImapMessage(UntaggedTag, new NumberMessageData(mailbox.Recent.Count), new AtomMessageData("RECENT")), CancellationToken.None); int unseenSequence = mailbox.FirstUnseen; int uidNext = mailbox.NextUid; int uidValidity = mailbox.UidValidity; await _channel.SendMessageAsync( new ImapMessage( UntaggedTag, "OK", new TagMessageData( new AtomMessageData("UNSEEN"), new NumberMessageData(unseenSequence)), new ServerMessageData($"Messsage {unseenSequence} is the first unseen")), cancellationToken); await _channel.SendMessageAsync( new ImapMessage( UntaggedTag, "OK", new TagMessageData( new AtomMessageData("UIDVALIDITY"), new NumberMessageData(uidValidity)), new ServerMessageData("UIDs valied")), cancellationToken); await _channel.SendMessageAsync( new ImapMessage( UntaggedTag, "OK", new TagMessageData( new AtomMessageData("UIDNEXT"), new NumberMessageData(uidNext)), new ServerMessageData("Predicted next UID")), cancellationToken); await _channel.SendMessageAsync( new ImapMessage( UntaggedTag, "FLAGS", new ListMessageData(mailbox.Flags.Select(f => new AtomMessageData(f)))), cancellationToken); await _channel.SendMessageAsync( new ImapMessage( UntaggedTag, "OK", new TagMessageData( new AtomMessageData("PERMANENTFLAGS"), new ListMessageData(selected.PermanentFlags.Select(f => new AtomMessageData(f))))), cancellationToken); string readWrite = mailbox.IsReadOnly ? "READ-ONLY" : "READ-WRITE"; await EndWithResultAsync( _channel, CommandResult.Ok, new TagMessageData(new AtomMessageData(readWrite)), null, cancellationToken); }