Files
imap2asana/imap2asana.go

78 lines
1.2 KiB
Go
Raw Normal View History

2022-10-30 20:31:51 +00:00
package main
import (
"fmt"
"os"
"github.com/emersion/go-imap"
"github.com/emersion/go-imap/client"
)
func main() {
ic, err := NewImapClient(
os.Getenv("IMAP_HOST"),
os.Getenv("IMAP_USERNAME"),
os.Getenv("IMAP_PASSWORD"),
)
if err != nil {
panic(err)
}
defer ic.Close()
mboxs, err := ic.List("", "*")
if err != nil {
panic(err)
}
for _, mbox := range mboxs {
fmt.Printf("%#v\n", mbox)
}
}
// go-imap's API is a pile of stupid; wrap it
type ImapClient struct {
cli *client.Client
}
func NewImapClient(host, user, pass string) (*ImapClient, error) {
c, err := client.DialTLS(host, nil)
if err != nil {
return nil, err
}
err = c.Login(user, pass)
if err != nil {
c.Logout()
return nil, err
}
return &ImapClient{
cli: c,
}, nil
}
func (ic *ImapClient) Close() {
ic.cli.Logout()
}
func (ic *ImapClient) List(ref, name string) ([]*imap.MailboxInfo, error) {
ch := make(chan *imap.MailboxInfo, 10)
2022-10-30 20:33:28 +00:00
done := make(chan error)
2022-10-30 20:31:51 +00:00
go func() {
2022-10-30 20:33:28 +00:00
done <- ic.cli.List(ref, name, ch)
2022-10-30 20:31:51 +00:00
}()
ret := []*imap.MailboxInfo{}
for mbox := range ch {
ret = append(ret, mbox)
}
2022-10-30 20:33:28 +00:00
err := <-done
2022-10-30 20:31:51 +00:00
if err != nil {
return nil, err
} else {
return ret, nil
}
}