connection.go 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. package imaputils
  2. import (
  3. "crypto/tls"
  4. "errors"
  5. "fmt"
  6. "os"
  7. "git.sr.ht/~blallo/papero/config"
  8. "github.com/emersion/go-imap/client"
  9. )
  10. var ErrUnencrypted = errors.New("the connection is unencrypted")
  11. type IMAPConnection struct {
  12. config *config.AccountData
  13. client *client.Client
  14. }
  15. func NewConnection(conf *config.AccountData) *IMAPConnection {
  16. conn := &IMAPConnection{}
  17. conn.config = conf
  18. return conn
  19. }
  20. func (c *IMAPConnection) Start(debug bool) error {
  21. var err error
  22. c.client, err = tryConnection(c.config.Host, c.config.Port)
  23. if err != nil {
  24. // TODO: allow unencrypted connections
  25. return err
  26. }
  27. if debug {
  28. c.client.SetDebug(os.Stderr)
  29. }
  30. return c.client.Login(c.config.Username, c.config.Password)
  31. }
  32. func (c *IMAPConnection) Close() {
  33. c.client.Logout()
  34. }
  35. func tryConnection(host string, port int) (*client.Client, error) {
  36. connString := fmt.Sprintf("%s:%d", host, port)
  37. c, err := client.DialTLS(connString, nil)
  38. if err == nil {
  39. return c, err
  40. }
  41. c, err = client.Dial(connString)
  42. if err != nil {
  43. return c, err
  44. }
  45. err = c.StartTLS(&tls.Config{ServerName: host})
  46. if err != nil {
  47. err = ErrUnencrypted
  48. }
  49. return c, err
  50. }