diff options
author | Simon Ser <contact@emersion.fr> | 2019-12-02 18:21:45 +0100 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2019-12-02 18:21:45 +0100 |
commit | 39629b074063f4f33d8b82c22023d7207bc431de (patch) | |
tree | 96ff288aa5f65d6ef11fc75528564d3266e594c7 /imap.go | |
parent | e9d31b0940793542021b5218e406d6e0c668c185 (diff) | |
download | alps-39629b074063f4f33d8b82c22023d7207bc431de.tar.gz alps-39629b074063f4f33d8b82c22023d7207bc431de.zip |
Add basic message list
Diffstat (limited to 'imap.go')
-rw-r--r-- | imap.go | 48 |
1 files changed, 48 insertions, 0 deletions
@@ -1,6 +1,8 @@ package koushin import ( + "sort" + "github.com/emersion/go-imap" imapclient "github.com/emersion/go-imap/client" ) @@ -45,5 +47,51 @@ func listMailboxes(conn *imapclient.Client) ([]*imap.MailboxInfo, error) { return nil, err } + sort.Slice(mailboxes, func(i, j int) bool { + return mailboxes[i].Name < mailboxes[j].Name + }) return mailboxes, nil } + +func listMessages(conn *imapclient.Client, mboxName string) ([]*imap.Message, error) { + mbox := conn.Mailbox() + if mbox == nil || mbox.Name != mboxName { + var err error + mbox, err = conn.Select(mboxName, false) + if err != nil { + return nil, err + } + } + + n := uint32(10) + from := uint32(1) + to := mbox.Messages + if mbox.Messages > n { + from = mbox.Messages - n + } + seqSet := new(imap.SeqSet) + seqSet.AddRange(from, to) + + ch := make(chan *imap.Message, 10) + done := make(chan error, 1) + go func() { + done <- conn.Fetch(seqSet, []imap.FetchItem{imap.FetchEnvelope}, ch) + }() + + msgs := make([]*imap.Message, 0, n) + for msg := range ch { + msgs = append(msgs, msg) + } + + if err := <-done; err != nil { + return nil, err + } + + // Reverse list of messages + for i := len(msgs)/2-1; i >= 0; i-- { + opp := len(msgs)-1-i + msgs[i], msgs[opp] = msgs[opp], msgs[i] + } + + return msgs, nil +} |