Browse Source

Added imaputils module

Blallo 3 years ago
parent
commit
54a31ad825
2 changed files with 93 additions and 0 deletions
  1. 60 0
      imaputils/connection.go
  2. 33 0
      imaputils/info.go

+ 60 - 0
imaputils/connection.go

@@ -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 - 0
imaputils/info.go

@@ -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
+}