Extend handling of GMail labels header
Format headers X-Label and Keywords as a space separated list and all other ones as comma-separated entities. This makes OfflineIMAP label handling to be compatible with some user agents that recognise these headers. Signed-off-by: Eygene Ryabinkin <rea@codelabs.ru>
This commit is contained in:

committed by
Eygene Ryabinkin

parent
0e4afa9132
commit
789e047734
@ -92,8 +92,8 @@ class GmailFolder(IMAPFolder):
|
||||
else:
|
||||
labels = set()
|
||||
labels = labels - self.ignorelabels
|
||||
labels = ', '.join(sorted(labels))
|
||||
body = self.addmessageheader(body, self.labelsheader, labels)
|
||||
labels_str = imaputil.format_labels_string(self.labelsheader, sorted(labels))
|
||||
body = self.addmessageheader(body, self.labelsheader, labels_str)
|
||||
|
||||
if len(body)>200:
|
||||
dbg_output = "%s...%s" % (str(body)[:150], str(body)[-50:])
|
||||
@ -183,11 +183,8 @@ class GmailFolder(IMAPFolder):
|
||||
if not self.synclabels:
|
||||
return super(GmailFolder, self).savemessage(uid, content, flags, rtime)
|
||||
|
||||
labels = self.getmessageheader(content, self.labelsheader)
|
||||
if labels:
|
||||
labels = set([lb.strip() for lb in labels.split(',') if len(lb.strip()) > 0])
|
||||
else:
|
||||
labels = set()
|
||||
labels = imaputil.labels_from_header(self.labelsheader,
|
||||
self.getmessageheader(content, self.labelsheader))
|
||||
|
||||
ret = super(GmailFolder, self).savemessage(uid, content, flags, rtime)
|
||||
self.savemessagelabels(ret, labels)
|
||||
|
@ -20,6 +20,7 @@ import os
|
||||
from .Maildir import MaildirFolder
|
||||
from offlineimap import OfflineImapError
|
||||
import offlineimap.accounts
|
||||
from offlineimap import imaputil
|
||||
|
||||
class GmailMaildirFolder(MaildirFolder):
|
||||
"""Folder implementation to support adding labels to messages in a Maildir.
|
||||
@ -78,12 +79,10 @@ class GmailMaildirFolder(MaildirFolder):
|
||||
content = file.read()
|
||||
file.close()
|
||||
|
||||
labels = self.getmessageheader(content, self.labelsheader)
|
||||
if labels:
|
||||
labels = set([lb.strip() for lb in labels.split(',') if len(lb.strip()) > 0])
|
||||
else:
|
||||
labels = set()
|
||||
self.messagelist[uid]['labels'] = labels
|
||||
self.messagelist[uid]['labels'] = \
|
||||
imaputil.labels_from_header(self.labelsheader,
|
||||
self.getmessageheader(content, self.labelsheader))
|
||||
|
||||
|
||||
return self.messagelist[uid]['labels']
|
||||
|
||||
@ -103,11 +102,8 @@ class GmailMaildirFolder(MaildirFolder):
|
||||
if not self.synclabels:
|
||||
return super(GmailMaildirFolder, self).savemessage(uid, content, flags, rtime)
|
||||
|
||||
labels = self.getmessageheader(content, self.labelsheader)
|
||||
if labels:
|
||||
labels = set([lb.strip() for lb in labels.split(',') if len(lb.strip()) > 0])
|
||||
else:
|
||||
labels = set()
|
||||
labels = imaputil.labels_from_header(self.labelsheader,
|
||||
self.getmessageheader(content, self.labelsheader))
|
||||
ret = super(GmailMaildirFolder, self).savemessage(uid, content, flags, rtime)
|
||||
|
||||
# Update the mtime and labels
|
||||
@ -130,12 +126,9 @@ class GmailMaildirFolder(MaildirFolder):
|
||||
content = file.read()
|
||||
file.close()
|
||||
|
||||
oldlabels = self.getmessageheader(content, self.labelsheader)
|
||||
oldlabels = imaputil.labels_from_header(self.labelsheader,
|
||||
self.getmessageheader(content, self.labelsheader))
|
||||
|
||||
if oldlabels:
|
||||
oldlabels = set([lb.strip() for lb in oldlabels.split(',') if len(lb.strip()) > 0])
|
||||
else:
|
||||
oldlabels = set()
|
||||
|
||||
labels = labels - ignorelabels
|
||||
ignoredlabels = oldlabels & ignorelabels
|
||||
@ -146,13 +139,14 @@ class GmailMaildirFolder(MaildirFolder):
|
||||
return
|
||||
|
||||
# Change labels into content
|
||||
labels_str = ', '.join(sorted(labels | ignoredlabels))
|
||||
labels_str = imaputil.format_labels_string(self.labelsheader,
|
||||
sorted(labels | ignoredlabels))
|
||||
content = self.addmessageheader(content, self.labelsheader, labels_str)
|
||||
rtime = self.messagelist[uid].get('rtime', None)
|
||||
|
||||
# write file with new labels to a unique file in tmp
|
||||
messagename = self.new_message_filename(uid, set())
|
||||
tmpname = self.save_tmp_file(messagename, content)
|
||||
tmpname = self.save_to_tmp_file(messagename, content)
|
||||
tmppath = os.path.join(self.getfullname(), tmpname)
|
||||
|
||||
# move to actual location
|
||||
|
Reference in New Issue
Block a user