about summary refs log tree commit diff stats
path: root/worker/imap/worker.go
diff options
context:
space:
mode:
Diffstat (limited to 'worker/imap/worker.go')
-rw-r--r--worker/imap/worker.go28
1 files changed, 22 insertions, 6 deletions
diff --git a/worker/imap/worker.go b/worker/imap/worker.go
index 55469cf..80d861d 100644
--- a/worker/imap/worker.go
+++ b/worker/imap/worker.go
@@ -3,6 +3,7 @@ package imap
 import (
 	"crypto/tls"
 	"fmt"
+	"net"
 	"net/url"
 	"strings"
 
@@ -214,29 +215,44 @@ func (w *IMAPWorker) handleImapUpdate(update client.Update) {
 
 func (w *IMAPWorker) connect() (*client.Client, error) {
 	var (
-		c   *client.Client
-		err error
+		conn *net.TCPConn
+		c    *client.Client
 	)
+
+	addr, err := net.ResolveTCPAddr("tcp", w.config.addr)
+	if err != nil {
+		return nil, err
+	}
+
+	conn, err = net.DialTCP("tcp", nil, addr)
+	if err != nil {
+		return nil, err
+	}
+
+	serverName, _, _ := net.SplitHostPort(w.config.addr)
+	tlsConfig := &tls.Config{ServerName: serverName}
+
 	switch w.config.scheme {
 	case "imap":
-		c, err = client.Dial(w.config.addr)
+		c, err = client.New(conn)
 		if err != nil {
 			return nil, err
 		}
-
 		if !w.config.insecure {
-			if err := c.StartTLS(&tls.Config{}); err != nil {
+			if err = c.StartTLS(tlsConfig); err != nil {
 				return nil, err
 			}
 		}
 	case "imaps":
-		c, err = client.DialTLS(w.config.addr, &tls.Config{})
+		tlsConn := tls.Client(conn, tlsConfig)
+		c, err = client.New(tlsConn)
 		if err != nil {
 			return nil, err
 		}
 	default:
 		return nil, fmt.Errorf("Unknown IMAP scheme %s", w.config.scheme)
 	}
+
 	c.ErrorLog = w.worker.Logger
 
 	if w.config.user != nil {