From 5fb5ec9775bfd497e89f5ccb31e95137627f3128 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Wed, 29 Jan 2020 14:59:45 +0100 Subject: [PATCH] imap: expose folders as mailboxes --- imap/mailbox.go | 16 ++++++++++++++++ imap/user.go | 27 +++++++++++++++++++-------- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/imap/mailbox.go b/imap/mailbox.go index 5661352..197fd7a 100644 --- a/imap/mailbox.go +++ b/imap/mailbox.go @@ -31,6 +31,22 @@ type mailbox struct { deleted map[string]struct{} } +func newMailbox(name string, label string, flags []string, u *user) (*mailbox, error) { + mboxDB, err := u.db.Mailbox(label) + if err != nil { + return nil, err + } + + return &mailbox{ + name: name, + label: label, + flags: flags, + u: u, + db: mboxDB, + deleted: make(map[string]struct{}), + }, nil +} + func (mbox *mailbox) Name() string { return mbox.name } diff --git a/imap/user.go b/imap/user.go index a160e9e..322796c 100644 --- a/imap/user.go +++ b/imap/user.go @@ -110,18 +110,29 @@ func (u *user) initMailboxes() error { u.mailboxes = make(map[string]*mailbox) for _, data := range systemMailboxes { - mboxDB, err := u.db.Mailbox(data.label) + var err error + u.mailboxes[data.label], err = newMailbox(data.name, data.label, data.flags, u) if err != nil { return err } + } - u.mailboxes[data.label] = &mailbox{ - name: data.name, - label: data.label, - flags: data.flags, - u: u, - db: mboxDB, - deleted: make(map[string]struct{}), + labels, err := u.c.ListLabels() + if err != nil { + return err + } + + for _, label := range labels { + if label.Exclusive != 1 { + continue + } + if _, ok := u.mailboxes[label.ID]; ok { + continue + } + + u.mailboxes[label.ID], err = newMailbox(label.Name, label.ID, nil, u) + if err != nil { + return err } }