BUG: Gmail FETCH error with synclabels enabled

If synclabels is enabled then offlineimap is sending '1:*' to imaplib2,
and imaplib2 while creating the FETCH command is quoting the sequence
and the command becomes:
b"JFFJ10 FETCH '1:*' (FLAGS X-GM-LABELS UID)\r\n"

Remove the single-quotes to prevent that and also consider the response
as bytes.

Closes: #52

Signed-off-by: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
This commit is contained in:
Sudip Mukherjee 2021-02-20 00:27:08 +00:00
parent 9e8e30794c
commit 8b88441759

View File

@ -125,11 +125,10 @@ class GmailFolder(IMAPFolder):
if not msgsToFetch: if not msgsToFetch:
return # No messages to sync return # No messages to sync
# Get the flags and UIDs for these. single-quotes prevent # Get the flags and UIDs for these.
# imaplib2 from quoting the sequence.
# #
# NB: msgsToFetch are sequential numbers, not UID's # NB: msgsToFetch are sequential numbers, not UID's
res_type, response = imapobj.fetch("'%s'" % msgsToFetch, res_type, response = imapobj.fetch("%s" % msgsToFetch,
'(FLAGS X-GM-LABELS UID)') '(FLAGS X-GM-LABELS UID)')
if res_type != 'OK': if res_type != 'OK':
raise OfflineImapError( raise OfflineImapError(
@ -147,6 +146,9 @@ class GmailFolder(IMAPFolder):
# Discard initial message number. # Discard initial message number.
if messagestr is None: if messagestr is None:
continue continue
# We need a str messagestr
if isinstance(messagestr, bytes):
messagestr = messagestr.decode(encoding='utf-8')
messagestr = messagestr.split(' ', 1)[1] messagestr = messagestr.split(' ', 1)[1]
# e.g.: {'X-GM-LABELS': '("Webserver (RW.net)" "\\Inbox" GInbox)', 'FLAGS': '(\\Seen)', 'UID': '275440'} # e.g.: {'X-GM-LABELS': '("Webserver (RW.net)" "\\Inbox" GInbox)', 'FLAGS': '(\\Seen)', 'UID': '275440'}
options = imaputil.flags2hash(messagestr) options = imaputil.flags2hash(messagestr)
@ -164,6 +166,8 @@ class GmailFolder(IMAPFolder):
else: else:
labels = set() labels = set()
labels = labels - self.ignorelabels labels = labels - self.ignorelabels
if isinstance(messagestr, str):
messagestr = bytes(messagestr, 'utf-8')
rtime = imaplibutil.Internaldate2epoch(messagestr) rtime = imaplibutil.Internaldate2epoch(messagestr)
self.messagelist[uid] = {'uid': uid, 'flags': flags, 'labels': labels, 'time': rtime} self.messagelist[uid] = {'uid': uid, 'flags': flags, 'labels': labels, 'time': rtime}