Update to match semantics of new imaplib2
The biggest change here is that imapobj.untagged_responses is no longer a dictionary, but a list. To access it, I use the semi-private _get_untagged_response method. * offlineimap/folder/IMAP.py (IMAPFolder.quickchanged, IMAPFolder.cachemessagelist): imaplib2 now explicitly removes its EXISTS response on select(), so instead we use the return values from select() to get the number of messages. * offlineimap/imapserver.py (UsefulIMAPMixIn.select): imaplib2 now stores untagged_responses for different mailboxes, which confuses us because it seems like our mailboxes are "still" in read-only mode when we just re-opened them. Additionally, we have to return the value from imaplib2's select() so that the above thing works. * offlineimap/imapserver.py (UsefulIMAPMixIn._mesg): imaplib2 now calls _mesg with the name of a thread, so we display this information in debug output. This requires a corresponding change to imaplibutil.new_mesg. * offlineimap/imaplibutil.py: We override IMAP4_SSL.open, whose default arguments have changed, so update the default arguments. We also subclass imaplib.IMAP4 in a few different places, which now relies on having a read_fd file descriptor to poll on. Signed-off-by: Ethan Glasser-Camp <ethan@betacantrips.com> Signed-off-by: Nicolas Sebrecht <nicolas.s-dev@laposte.net>
This commit is contained in:

committed by
Nicolas Sebrecht

parent
f9413226b8
commit
1bf4bee5e6
@ -71,7 +71,7 @@ class IMAPFolder(BaseFolder):
|
||||
try:
|
||||
# Primes untagged_responses
|
||||
self.selectro(imapobj)
|
||||
return long(imapobj.untagged_responses['UIDVALIDITY'][0])
|
||||
return long(imapobj._get_untagged_response('UIDVALIDITY', True)[0])
|
||||
finally:
|
||||
self.imapserver.releaseconnection(imapobj)
|
||||
|
||||
@ -82,17 +82,16 @@ class IMAPFolder(BaseFolder):
|
||||
imapobj = self.imapserver.acquireconnection()
|
||||
try:
|
||||
# Primes untagged_responses
|
||||
imapobj.select(self.getfullname(), readonly = 1, force = 1)
|
||||
try:
|
||||
# 1. Some mail servers do not return an EXISTS response
|
||||
# if the folder is empty. 2. ZIMBRA servers can return
|
||||
# multiple EXISTS replies in the form 500, 1000, 1500,
|
||||
# 1623 so check for potentially multiple replies.
|
||||
maxmsgid = 0
|
||||
for msgid in imapobj.untagged_responses['EXISTS']:
|
||||
maxmsgid = max(long(msgid), maxmsgid)
|
||||
except KeyError:
|
||||
imaptype, imapdata = imapobj.select(self.getfullname(), readonly = 1, force = 1)
|
||||
# 1. Some mail servers do not return an EXISTS response
|
||||
# if the folder is empty. 2. ZIMBRA servers can return
|
||||
# multiple EXISTS replies in the form 500, 1000, 1500,
|
||||
# 1623 so check for potentially multiple replies.
|
||||
if imapdata == [None]:
|
||||
return True
|
||||
maxmsgid = 0
|
||||
for msgid in imapdata:
|
||||
maxmsgid = max(long(msgid), maxmsgid)
|
||||
|
||||
# Different number of messages than last time?
|
||||
if maxmsgid != len(statusfolder.getmessagelist()):
|
||||
@ -127,7 +126,7 @@ class IMAPFolder(BaseFolder):
|
||||
|
||||
try:
|
||||
# Primes untagged_responses
|
||||
imapobj.select(self.getfullname(), readonly = 1, force = 1)
|
||||
imaptype, imapdata = imapobj.select(self.getfullname(), readonly = 1, force = 1)
|
||||
|
||||
maxage = self.config.getdefaultint("Account " + self.accountname, "maxage", -1)
|
||||
maxsize = self.config.getdefaultint("Account " + self.accountname, "maxsize", -1)
|
||||
@ -169,17 +168,20 @@ class IMAPFolder(BaseFolder):
|
||||
# No messages; return
|
||||
return
|
||||
else:
|
||||
try:
|
||||
# 1. Some mail servers do not return an EXISTS response
|
||||
# if the folder is empty. 2. ZIMBRA servers can return
|
||||
# multiple EXISTS replies in the form 500, 1000, 1500,
|
||||
# 1623 so check for potentially multiple replies.
|
||||
maxmsgid = 0
|
||||
for msgid in imapobj.untagged_responses['EXISTS']:
|
||||
maxmsgid = max(long(msgid), maxmsgid)
|
||||
messagesToFetch = '1:%d' % maxmsgid;
|
||||
except KeyError:
|
||||
# 1. Some mail servers do not return an EXISTS response
|
||||
# if the folder is empty. 2. ZIMBRA servers can return
|
||||
# multiple EXISTS replies in the form 500, 1000, 1500,
|
||||
# 1623 so check for potentially multiple replies.
|
||||
if imapdata == [None]:
|
||||
return
|
||||
|
||||
maxmsgid = 0
|
||||
for msgid in imapdata:
|
||||
maxmsgid = max(long(msgid), maxmsgid)
|
||||
|
||||
maxmsgid = long(imapdata[0])
|
||||
messagesToFetch = '1:%d' % maxmsgid;
|
||||
|
||||
if maxmsgid < 1:
|
||||
#no messages; return
|
||||
return
|
||||
@ -437,10 +439,11 @@ class IMAPFolder(BaseFolder):
|
||||
# get the new UID from the APPENDUID response, it could look like
|
||||
# OK [APPENDUID 38505 3955] APPEND completed
|
||||
# with 38505 bein folder UIDvalidity and 3955 the new UID
|
||||
if not imapobj.untagged_responses.has_key('APPENDUID'):
|
||||
self.ui.warn("Server supports UIDPLUS but got no APPENDUID appending a message.")
|
||||
if not imapobj._get_untagged_response('APPENDUID', True):
|
||||
self.ui.warn("Server supports UIDPLUS but got no APPENDUID "
|
||||
"appending a message.")
|
||||
return 0
|
||||
uid = long(imapobj.untagged_responses['APPENDUID'][-1].split(' ')[1])
|
||||
uid = long(imapobj._get_untagged_response('APPENDUID', True)[-1].split(' ')[1])
|
||||
|
||||
else:
|
||||
# we don't support UIDPLUS
|
||||
|
Reference in New Issue
Block a user