diff --git a/offlineimap/imaplibutil.py b/offlineimap/imaplibutil.py index c88d04b..44338f6 100644 --- a/offlineimap/imaplibutil.py +++ b/offlineimap/imaplibutil.py @@ -19,6 +19,7 @@ import fcntl import time import subprocess import threading +import rfc6555 import socket import errno import zlib @@ -78,8 +79,15 @@ class UsefulIMAPMixIn(object): def open_socket(self): """open_socket() Open socket choosing first address family available.""" + if self.af == socket.AF_UNSPEC: + # happy-eyeballs! + return rfc6555.create_connection((self.host, self.port)) + else: + return self._open_socket_for_af(self.af) + + def _open_socket_for_af(self, af): msg = (-1, 'could not open socket') - for res in socket.getaddrinfo(self.host, self.port, self.af, socket.SOCK_STREAM): + for res in socket.getaddrinfo(self.host, self.port, af, socket.SOCK_STREAM): af, socktype, proto, canonname, sa = res try: # use socket of our own, possiblly socksified socket. diff --git a/requirements.txt b/requirements.txt index 3b1819e..1e2a2ae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ six gssapi[kerberos] portalocker[cygwin] +rfc6555