Merge branch 'maxage'
Conflicts: offlineimap/folder/IMAP.py
This commit is contained in:
@ -178,16 +178,22 @@ class AccountSynchronizationMixin:
|
||||
|
||||
# Connect to the local cache.
|
||||
self.statusrepos = offlineimap.repository.LocalStatus.LocalStatusRepository(self.getconf('localrepository'), self)
|
||||
|
||||
|
||||
#might need changes here to ensure that one account sync does not crash others...
|
||||
if not self.refreshperiod:
|
||||
|
||||
self.sync(siglistener)
|
||||
self.ui.acctdone(self.name)
|
||||
|
||||
return
|
||||
|
||||
|
||||
looping = 1
|
||||
while looping:
|
||||
self.sync(siglistener)
|
||||
looping = self.sleeper(siglistener) != 2
|
||||
self.ui.acctdone(self.name)
|
||||
self.ui.acctdone(self.name)
|
||||
|
||||
|
||||
def getaccountmeta(self):
|
||||
return os.path.join(self.metadatadir, 'Account-' + self.name)
|
||||
|
@ -24,6 +24,7 @@ from offlineimap.version import versionstr
|
||||
import rfc822, time, string, random, binascii, re
|
||||
from StringIO import StringIO
|
||||
from copy import copy
|
||||
import time
|
||||
|
||||
|
||||
class IMAPFolder(BaseFolder):
|
||||
@ -116,6 +117,7 @@ class IMAPFolder(BaseFolder):
|
||||
|
||||
return False
|
||||
|
||||
# TODO: Make this so that it can define a date that would be the oldest messages etc.
|
||||
def cachemessagelist(self):
|
||||
imapobj = self.imapserver.acquireconnection()
|
||||
self.messagelist = {}
|
||||
@ -123,20 +125,62 @@ class IMAPFolder(BaseFolder):
|
||||
try:
|
||||
# Primes untagged_responses
|
||||
imapobj.select(self.getfullname(), readonly = 1, force = 1)
|
||||
try:
|
||||
# Some mail servers do not return an EXISTS response if
|
||||
# the folder is empty.
|
||||
maxmsgid = long(imapobj.untagged_responses['EXISTS'][0])
|
||||
except KeyError:
|
||||
return
|
||||
if maxmsgid < 1:
|
||||
# No messages; return
|
||||
return
|
||||
|
||||
maxage = self.config.getdefaultint("Account " + self.accountname, "maxage", -1)
|
||||
maxsize = self.config.getdefaultint("Account " + self.accountname, "maxsize", -1)
|
||||
|
||||
if (maxage != -1) | (maxsize != -1):
|
||||
try:
|
||||
search_condition = "(";
|
||||
|
||||
if(maxage != -1):
|
||||
#find out what the oldest message is that we should look at
|
||||
oldest_time_struct = time.gmtime(time.time() - (60*60*24*maxage))
|
||||
|
||||
#format this manually - otherwise locales could cause problems
|
||||
monthnames_standard = ["Jan", "Feb", "Mar", "Apr", "May", \
|
||||
"June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"]
|
||||
|
||||
our_monthname = monthnames_standard[oldest_time_struct[1]-1]
|
||||
daystr = "%(day)02d" % {'day' : oldest_time_struct[2]}
|
||||
date_search_str = "SINCE " + daystr + "-" + our_monthname \
|
||||
+ "-" + str(oldest_time_struct[0])
|
||||
|
||||
search_condition += date_search_str
|
||||
|
||||
if(maxsize != -1):
|
||||
if(maxage != 1): #There are two conditions - add a space
|
||||
search_condition += " "
|
||||
|
||||
search_condition += "SMALLER " + self.config.getdefault("Account " + self.accountname, "maxsize", -1)
|
||||
|
||||
search_condition += ")"
|
||||
searchresult = imapobj.search(None, search_condition)
|
||||
|
||||
#result would come back seperated by space - to change into a fetch
|
||||
#statement we need to change space to comma
|
||||
messagesToFetch = searchresult[1][0].replace(" ", ",")
|
||||
except KeyError:
|
||||
return
|
||||
if len(messagesToFetch) < 1:
|
||||
# No messages; return
|
||||
return
|
||||
else:
|
||||
try:
|
||||
# Some mail servers do not return an EXISTS response if
|
||||
# the folder is empty.
|
||||
|
||||
maxmsgid = long(imapobj.untagged_responses['EXISTS'][0])
|
||||
messagesToFetch = '1:%d' % maxmsgid;
|
||||
except KeyError:
|
||||
return
|
||||
if maxmsgid < 1:
|
||||
#no messages; return
|
||||
return
|
||||
# Now, get the flags and UIDs for these.
|
||||
# We could conceivably get rid of maxmsgid and just say
|
||||
# '1:*' here.
|
||||
response = imapobj.fetch('1:%d' % maxmsgid, '(FLAGS UID)')[1]
|
||||
response = imapobj.fetch(messagesToFetch, '(FLAGS UID)')[1]
|
||||
finally:
|
||||
self.imapserver.releaseconnection(imapobj)
|
||||
for messagestr in response:
|
||||
|
@ -29,6 +29,7 @@ except ImportError:
|
||||
|
||||
uidmatchre = re.compile(',U=(\d+)')
|
||||
flagmatchre = re.compile(':.*2,([A-Z]+)')
|
||||
timestampmatchre = re.compile('(\d+)');
|
||||
|
||||
timeseq = 0
|
||||
lasttime = long(0)
|
||||
@ -72,6 +73,28 @@ class MaildirFolder(BaseFolder):
|
||||
token."""
|
||||
return 42
|
||||
|
||||
#Checks to see if the given message is within the maximum age according
|
||||
#to the maildir name which should begin with a timestamp
|
||||
def _iswithinmaxage(self, messagename, maxage):
|
||||
#In order to have the same behaviour as SINCE in an IMAP search
|
||||
#we must convert this to the oldest time and then strip off hrs/mins
|
||||
#from that day
|
||||
oldest_time_utc = time.time() - (60*60*24*maxage)
|
||||
oldest_time_struct = time.gmtime(oldest_time_utc)
|
||||
oldest_time_today_seconds = ((oldest_time_struct[3] * 3600) \
|
||||
+ (oldest_time_struct[4] * 60) \
|
||||
+ oldest_time_struct[5])
|
||||
oldest_time_utc -= oldest_time_today_seconds
|
||||
|
||||
timestampmatch = timestampmatchre.search(messagename)
|
||||
timestampstr = timestampmatch.group()
|
||||
timestamplong = long(timestampstr)
|
||||
if(timestamplong < oldest_time_utc):
|
||||
return False
|
||||
else:
|
||||
return True
|
||||
|
||||
|
||||
def _scanfolder(self):
|
||||
"""Cache the message list. Maildir flags are:
|
||||
R (replied)
|
||||
@ -92,6 +115,25 @@ class MaildirFolder(BaseFolder):
|
||||
filename in os.listdir(fulldirname))
|
||||
for file in files:
|
||||
messagename = os.path.basename(file)
|
||||
|
||||
#check if there is a parameter for maxage / maxsize - then see if this
|
||||
#message should be considered or not
|
||||
maxage = self.config.getdefaultint("Account " + self.accountname, "maxage", -1)
|
||||
maxsize = self.config.getdefaultint("Account " + self.accountname, "maxsize", -1)
|
||||
|
||||
if(maxage != -1):
|
||||
isnewenough = self._iswithinmaxage(messagename, maxage)
|
||||
if(isnewenough != True):
|
||||
#this message is older than we should consider....
|
||||
continue
|
||||
|
||||
#Check and see if the message is too big if the maxsize for this account is set
|
||||
if(maxsize != -1):
|
||||
filesize = os.path.getsize(file)
|
||||
if(filesize > maxsize):
|
||||
continue
|
||||
|
||||
|
||||
foldermatch = messagename.find(folderstr) != -1
|
||||
if not foldermatch:
|
||||
# If there is no folder MD5 specified, or if it mismatches,
|
||||
|
Reference in New Issue
Block a user