Added imaputils module

This commit is contained in:
Blallo 2021-01-31 01:14:37 +01:00
parent 5fb994bd68
commit 54a31ad825
No known key found for this signature in database
GPG key ID: 0CBE577C9B72DC3F
2 changed files with 93 additions and 0 deletions

60
imaputils/connection.go Normal file
View file

@ -0,0 +1,60 @@
package imaputils
import (
"crypto/tls"
"errors"
"fmt"
"os"
"git.lattuga.net/blallo/papero/config"
"github.com/emersion/go-imap/client"
)
var ErrMissingConfig = errors.New("missing configuration stanza")
var ErrUnencrypted = errors.New("the connection is unencrypted")
type IMAPConnection struct {
config *config.AccountData
client *client.Client
}
func NewConnection(conf *config.AccountData) *IMAPConnection {
conn := &IMAPConnection{}
conn.config = conf
return conn
}
func (c *IMAPConnection) Start(debug bool) error {
var err error
c.client, err = tryConnection(c.config.Host, c.config.Port)
if err != nil {
// TODO: allow unencrypted connections
return err
}
if debug {
c.client.SetDebug(os.Stderr)
}
return c.client.Login(c.config.Username, c.config.Password)
}
func (c *IMAPConnection) Close() {
c.client.Logout()
}
func tryConnection(host string, port int) (*client.Client, error) {
connString := fmt.Sprintf("%s:%d", host, port)
c, err := client.DialTLS(connString, nil)
if err == nil {
return c, err
}
c, err = client.Dial(connString)
if err != nil {
return c, err
}
err = c.StartTLS(&tls.Config{ServerName: host})
if err != nil {
err = ErrUnencrypted
}
return c, err
}

33
imaputils/info.go Normal file
View file

@ -0,0 +1,33 @@
package imaputils
import (
"git.lattuga.net/blallo/papero/config"
"github.com/emersion/go-imap"
)
func ListMailboxes(conf *config.AccountData, debug bool) ([]*imap.MailboxInfo, error) {
var mailboxes []*imap.MailboxInfo
conn := NewConnection(conf)
err := conn.Start(debug)
if err != nil {
return mailboxes, err
}
defer conn.Close()
mboxChan := make(chan *imap.MailboxInfo, 10)
done := make(chan error, 1)
go func() {
done <- conn.client.List("", "*", mboxChan)
}()
for m := range mboxChan {
mailboxes = append(mailboxes, m)
}
if err := <-done; err != nil {
return mailboxes, err
}
return mailboxes, nil
}