From ab8b5f7678da886eb55216832ef47a730f5a4830 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 1 May 2023 16:34:56 +0200 Subject: Use LIST-STATUS to fetch unread message count for all mailboxes --- plugins/base/imap.go | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'plugins/base/imap.go') diff --git a/plugins/base/imap.go b/plugins/base/imap.go index e3720d0..bce1dc1 100644 --- a/plugins/base/imap.go +++ b/plugins/base/imap.go @@ -46,14 +46,28 @@ func (mbox *MailboxInfo) HasAttr(flag string) bool { } func listMailboxes(conn *imapclient.Client) ([]MailboxInfo, error) { + var options imap.ListOptions + if conn.Caps().Has(imap.CapListStatus) { + options.ReturnStatus = &imap.StatusOptions{ + NumMessages: true, + UIDValidity: true, + NumUnseen: true, + } + } + var mailboxes []MailboxInfo - list := conn.List("", "*", nil) + list := conn.List("", "*", &options) for { - mbox := list.Next() - if mbox == nil { + data := list.Next() + if data == nil { break } - mailboxes = append(mailboxes, MailboxInfo{mbox, false, -1, -1}) + mbox := MailboxInfo{data, false, -1, -1} + if mbox.Status != nil { + mbox.Unseen = int(*mbox.Status.NumUnseen) + mbox.Total = int(*mbox.Status.NumMessages) + } + mailboxes = append(mailboxes, mbox) } if err := list.Close(); err != nil { return nil, fmt.Errorf("failed to list mailboxes: %v", err) -- cgit v1.2.3-59-g8ed1b