diff --git a/imapserver/imapmemserver/mailbox.go b/imapserver/imapmemserver/mailbox.go index 88c156bf..9c2ffe02 100644 --- a/imapserver/imapmemserver/mailbox.go +++ b/imapserver/imapmemserver/mailbox.go @@ -454,7 +454,7 @@ func (mbox *MailboxView) staticNumSet(numSet imap.NumSet) imap.NumSet { switch numSet := numSet.(type) { case imap.SeqSet: - max := uint32(len(mbox.l)) + max := mbox.tracker.EncodeNumMessages() for i := range numSet { r := &numSet[i] staticNumRange(&r.Start, &r.Stop, max) diff --git a/imapserver/tracker.go b/imapserver/tracker.go index b22958cd..c615bdcf 100644 --- a/imapserver/tracker.go +++ b/imapserver/tracker.go @@ -282,3 +282,20 @@ func (t *SessionTracker) EncodeSeqNum(seqNum uint32) uint32 { } return seqNum } + +// EncodeNumMessages returns the number of messages in the mailbox from the +// client point-of-view. +func (t *SessionTracker) EncodeNumMessages() uint32 { + n := t.mailbox.numMessages + for i := len(t.queue) - 1; i >= 0; i-- { + update := t.queue[i] + // TODO: this doesn't handle increments > 1 + if update.numMessages != 0 { + n-- + } + if update.expunge != 0 { + n++ + } + } + return n +}