diff --git a/offlineimap.conf b/offlineimap.conf index df5ed95..6f05dcc 100644 --- a/offlineimap.conf +++ b/offlineimap.conf @@ -580,6 +580,18 @@ type = GmailMaildir type = IMAP +# This option stands in the [Repository RemoteExample] section. +# +# Configure which address family to use for the connection. If not specified, +# AF_UNSPEC is used as a fallback (default). +# +# AF_INET6: +#ipv6 = True +# +# AF_INET: +#ipv6 = False + + # These options stands in the [Repository RemoteExample] section. # # The following can fetch the account credentials via a python expression that diff --git a/offlineimap/imaplibutil.py b/offlineimap/imaplibutil.py index 952404a..9b1095b 100644 --- a/offlineimap/imaplibutil.py +++ b/offlineimap/imaplibutil.py @@ -74,7 +74,7 @@ class UsefulIMAPMixIn(object): """open_socket() Open socket choosing first address family available.""" msg = (-1, 'could not open socket') - for res in socket.getaddrinfo(self.host, self.port, socket.AF_UNSPEC, socket.SOCK_STREAM): + for res in socket.getaddrinfo(self.host, self.port, self.af, socket.SOCK_STREAM): af, socktype, proto, canonname, sa = res try: # use socket of our own, possiblly socksified socket. @@ -175,6 +175,9 @@ class WrappedIMAP4_SSL(UsefulIMAPMixIn, IMAP4_SSL): """Improved version of imaplib.IMAP4_SSL overriding select().""" def __init__(self, *args, **kwargs): + if "af" in kwargs: + self.af = kwargs['af'] + del kwargs['af'] if "use_socket" in kwargs: self.socket = kwargs['use_socket'] del kwargs['use_socket'] @@ -209,6 +212,9 @@ class WrappedIMAP4(UsefulIMAPMixIn, IMAP4): """Improved version of imaplib.IMAP4 overriding select().""" def __init__(self, *args, **kwargs): + if "af" in kwargs: + self.af = kwargs['af'] + del kwargs['af'] if "use_socket" in kwargs: self.socket = kwargs['use_socket'] del kwargs['use_socket'] diff --git a/offlineimap/imapserver.py b/offlineimap/imapserver.py index cbe8d23..a604993 100644 --- a/offlineimap/imapserver.py +++ b/offlineimap/imapserver.py @@ -23,6 +23,7 @@ import base64 import json import urllib +import socket import time import errno from sys import exc_info @@ -80,6 +81,13 @@ class IMAPServer: self.goodpassword = None self.usessl = repos.getssl() + self.useipv6 = repos.getipv6() + if self.useipv6 == True: + self.af = socket.AF_INET6 + elif self.useipv6 == False: + self.af = socket.AF_INET + else: + self.af = socket.AF_UNSPEC self.hostname = \ None if self.preauth_tunnel else repos.gethost() self.port = repos.getport() @@ -487,6 +495,7 @@ class IMAPServer: fingerprint=self.fingerprint, use_socket=self.proxied_socket, tls_level=self.tlslevel, + af=self.af, ) else: self.ui.connecting(self.hostname, self.port) @@ -494,6 +503,7 @@ class IMAPServer: self.hostname, self.port, timeout=socket.getdefaulttimeout(), use_socket=self.proxied_socket, + af=self.af, ) if not self.preauth_tunnel: diff --git a/offlineimap/repository/IMAP.py b/offlineimap/repository/IMAP.py index 7a2a98c..60d5a08 100644 --- a/offlineimap/repository/IMAP.py +++ b/offlineimap/repository/IMAP.py @@ -194,6 +194,9 @@ class IMAPRepository(BaseRepository): return self.getconfint('remoteport', None) + def getipv6(self): + return self.getconfboolean('ipv6', None) + def getssl(self): return self.getconfboolean('ssl', 1)