/head: changeset 37
Updated
This commit is contained in:
parent
75dcb0dd16
commit
8171027aa1
@ -35,6 +35,12 @@ metadata = ~/.imapsync
|
|||||||
|
|
||||||
accounts = Test
|
accounts = Test
|
||||||
|
|
||||||
|
# You can have imapsync continue running indefinately, automatically
|
||||||
|
# syncing your mail periodically. If you want that, specify how
|
||||||
|
# frequently to do that (in minutes) here.
|
||||||
|
|
||||||
|
# autorefresh = 5
|
||||||
|
|
||||||
##################################################
|
##################################################
|
||||||
# Mailbox name recorder
|
# Mailbox name recorder
|
||||||
##################################################
|
##################################################
|
||||||
|
@ -45,71 +45,88 @@ remoterepos = None
|
|||||||
localrepos = None
|
localrepos = None
|
||||||
mailboxes = []
|
mailboxes = []
|
||||||
|
|
||||||
for accountname in accounts:
|
def syncitall():
|
||||||
ui.acct(accountname)
|
for accountname in accounts:
|
||||||
accountmetadata = os.path.join(metadatadir, accountname)
|
ui.acct(accountname)
|
||||||
if not os.path.exists(accountmetadata):
|
accountmetadata = os.path.join(metadatadir, accountname)
|
||||||
os.mkdir(accountmetadata, 0700)
|
if not os.path.exists(accountmetadata):
|
||||||
host = config.get(accountname, "remotehost")
|
os.mkdir(accountmetadata, 0700)
|
||||||
user = config.get(accountname, "remoteuser")
|
host = config.get(accountname, "remotehost")
|
||||||
port = None
|
user = config.get(accountname, "remoteuser")
|
||||||
if config.has_option(accountname, "remoteport"):
|
port = None
|
||||||
port = config.getint(accountname, "remoteport")
|
if config.has_option(accountname, "remoteport"):
|
||||||
password = None
|
port = config.getint(accountname, "remoteport")
|
||||||
if config.has_option(accountname, "remotepass"):
|
password = None
|
||||||
password = config.get(accountname, "remotepass")
|
if config.has_option(accountname, "remotepass"):
|
||||||
else:
|
password = config.get(accountname, "remotepass")
|
||||||
password = ui.getpass(accountname, host, port, user)
|
else:
|
||||||
ssl = config.getboolean(accountname, "ssl")
|
password = ui.getpass(accountname, host, port, user)
|
||||||
|
# Save it for future reference.
|
||||||
|
config.set(accountname, "remotepass", password)
|
||||||
|
ssl = config.getboolean(accountname, "ssl")
|
||||||
|
|
||||||
# Connect to the remote server.
|
# Connect to the remote server.
|
||||||
server = imapserver.IMAPServer(user, password, host, port, ssl)
|
server = imapserver.IMAPServer(user, password, host, port, ssl)
|
||||||
remoterepos = repository.IMAP.IMAPRepository(config, accountname, server)
|
remoterepos = repository.IMAP.IMAPRepository(config, accountname, server)
|
||||||
|
|
||||||
# Connect to the Maildirs.
|
# Connect to the Maildirs.
|
||||||
localrepos = repository.Maildir.MaildirRepository(os.path.expanduser(config.get(accountname, "localfolders")))
|
localrepos = repository.Maildir.MaildirRepository(os.path.expanduser(config.get(accountname, "localfolders")))
|
||||||
|
|
||||||
# Connect to the local cache.
|
# Connect to the local cache.
|
||||||
statusrepos = repository.LocalStatus.LocalStatusRepository(accountmetadata)
|
statusrepos = repository.LocalStatus.LocalStatusRepository(accountmetadata)
|
||||||
|
|
||||||
ui.syncfolders(remoterepos, localrepos)
|
ui.syncfolders(remoterepos, localrepos)
|
||||||
remoterepos.syncfoldersto(localrepos)
|
remoterepos.syncfoldersto(localrepos)
|
||||||
|
|
||||||
for remotefolder in remoterepos.getfolders():
|
for remotefolder in remoterepos.getfolders():
|
||||||
mailboxes.append({'accountname': accountname,
|
mailboxes.append({'accountname': accountname,
|
||||||
'foldername': remotefolder.getvisiblename()})
|
'foldername': remotefolder.getvisiblename()})
|
||||||
# Load local folder.
|
# Load local folder.
|
||||||
localfolder = localrepos.getfolder(remotefolder.getvisiblename())
|
localfolder = localrepos.getfolder(remotefolder.getvisiblename())
|
||||||
if not localfolder.isuidvalidityok(remotefolder):
|
if not localfolder.isuidvalidityok(remotefolder):
|
||||||
ui.validityproblem(remotefolder)
|
ui.validityproblem(remotefolder)
|
||||||
continue
|
continue
|
||||||
ui.syncingfolder(remoterepos, remotefolder, localrepos, localfolder)
|
ui.syncingfolder(remoterepos, remotefolder, localrepos, localfolder)
|
||||||
ui.loadmessagelist(localrepos, localfolder)
|
ui.loadmessagelist(localrepos, localfolder)
|
||||||
localfolder.cachemessagelist()
|
localfolder.cachemessagelist()
|
||||||
ui.messagelistloaded(localrepos, localfolder, len(localfolder.getmessagelist().keys()))
|
ui.messagelistloaded(localrepos, localfolder, len(localfolder.getmessagelist().keys()))
|
||||||
|
|
||||||
# Load remote folder.
|
# Load remote folder.
|
||||||
ui.loadmessagelist(remoterepos, remotefolder)
|
ui.loadmessagelist(remoterepos, remotefolder)
|
||||||
remotefolder.cachemessagelist()
|
remotefolder.cachemessagelist()
|
||||||
ui.messagelistloaded(remoterepos, remotefolder,
|
ui.messagelistloaded(remoterepos, remotefolder,
|
||||||
len(remotefolder.getmessagelist().keys()))
|
len(remotefolder.getmessagelist().keys()))
|
||||||
|
|
||||||
# Load status folder.
|
# Load status folder.
|
||||||
statusfolder = statusrepos.getfolder(remotefolder.getvisiblename())
|
statusfolder = statusrepos.getfolder(remotefolder.getvisiblename())
|
||||||
statusfolder.cachemessagelist()
|
statusfolder.cachemessagelist()
|
||||||
|
|
||||||
if not statusfolder.isnewfolder():
|
if not statusfolder.isnewfolder():
|
||||||
ui.syncingmessages(localrepos, localfolder, remoterepos, remotefolder)
|
ui.syncingmessages(localrepos, localfolder, remoterepos, remotefolder)
|
||||||
localfolder.syncmessagesto(statusfolder, [remotefolder, statusfolder])
|
localfolder.syncmessagesto(statusfolder, [remotefolder, statusfolder])
|
||||||
|
|
||||||
# Synchronize remote changes.
|
# Synchronize remote changes.
|
||||||
ui.syncingmessages(remoterepos, remotefolder, localrepos, localfolder)
|
ui.syncingmessages(remoterepos, remotefolder, localrepos, localfolder)
|
||||||
remotefolder.syncmessagesto(localfolder)
|
remotefolder.syncmessagesto(localfolder)
|
||||||
|
|
||||||
# Make sure the status folder is up-to-date.
|
# Make sure the status folder is up-to-date.
|
||||||
ui.syncingmessages(localrepos, localfolder, statusrepos, statusfolder)
|
ui.syncingmessages(localrepos, localfolder, statusrepos, statusfolder)
|
||||||
localfolder.syncmessagesto(statusfolder)
|
localfolder.syncmessagesto(statusfolder)
|
||||||
statusfolder.save()
|
statusfolder.save()
|
||||||
|
server.close()
|
||||||
|
|
||||||
|
|
||||||
mbnames.genmbnames(config, mailboxes)
|
mbnames.genmbnames(config, mailboxes)
|
||||||
|
|
||||||
|
syncitall()
|
||||||
|
if config.has_option('general', 'autorefresh'):
|
||||||
|
refreshperiod = config.getint('general', 'autorefresh') * 60
|
||||||
|
while 1:
|
||||||
|
sleepamount = refreshperiod
|
||||||
|
abortsleep = 0
|
||||||
|
while sleepamount > 0 and not abortsleep:
|
||||||
|
abortsleep = ui.sleeping(1, sleepamount)
|
||||||
|
sleepamount -= 1
|
||||||
|
ui.sleeping(0, 0) # Done sleeping.
|
||||||
|
syncitall()
|
||||||
|
|
||||||
|
@ -64,7 +64,7 @@ class IMAPFolder(BaseFolder):
|
|||||||
|
|
||||||
def getmessage(self, uid):
|
def getmessage(self, uid):
|
||||||
assert(self.imapobj.select(self.getfullname())[0] == 'OK')
|
assert(self.imapobj.select(self.getfullname())[0] == 'OK')
|
||||||
return self.imapobj.uid('fetch', '%d' % uid, '(RFC822)')[1][0][1].replace("\r\n", "\n")
|
return self.imapobj.uid('fetch', '%d' % uid, '(BODY.PEEK[])')[1][0][1].replace("\r\n", "\n")
|
||||||
|
|
||||||
def getmessageflags(self, uid):
|
def getmessageflags(self, uid):
|
||||||
return self.getmessagelist()[uid]['flags']
|
return self.getmessagelist()[uid]['flags']
|
||||||
|
@ -67,4 +67,6 @@ class IMAPServer:
|
|||||||
self.imapobj = imapobj
|
self.imapobj = imapobj
|
||||||
return imapobj
|
return imapobj
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
self.imapobj.logout()
|
||||||
|
self.imapobj = None
|
||||||
|
@ -50,5 +50,6 @@ class IMAPRepository(BaseRepository):
|
|||||||
continue
|
continue
|
||||||
retval.append(folder.IMAP.IMAPFolder(self.imapserver, name,
|
retval.append(folder.IMAP.IMAPFolder(self.imapserver, name,
|
||||||
self.nametrans(imaputil.dequote(name))))
|
self.nametrans(imaputil.dequote(name))))
|
||||||
|
retval.sort()
|
||||||
self.folders = retval
|
self.folders = retval
|
||||||
return retval
|
return retval
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
from UIBase import UIBase
|
from UIBase import UIBase
|
||||||
from getpass import getpass
|
from getpass import getpass
|
||||||
|
import select, sys
|
||||||
|
|
||||||
class TTYUI(UIBase):
|
class TTYUI(UIBase):
|
||||||
def __init__(self, verbose = 0):
|
def __init__(self, verbose = 0):
|
||||||
@ -23,3 +24,18 @@ class TTYUI(UIBase):
|
|||||||
def messagelistloaded(s, repos, folder, count):
|
def messagelistloaded(s, repos, folder, count):
|
||||||
if s.verbose:
|
if s.verbose:
|
||||||
UIBase.messagelistloaded(s, repos, folder, count)
|
UIBase.messagelistloaded(s, repos, folder, count)
|
||||||
|
|
||||||
|
def sleeping(s, sleepsecs, remainingsecs):
|
||||||
|
if remainingsecs > 0:
|
||||||
|
sys.stdout.write("Next sync in %d:%02d (press Enter to sync now) \r" % \
|
||||||
|
(remainingsecs / 60, remainingsecs % 60))
|
||||||
|
sys.stdout.flush()
|
||||||
|
else:
|
||||||
|
sys.stdout.write("Wait done, proceeding with sync.... ")
|
||||||
|
|
||||||
|
if sleepsecs > 0:
|
||||||
|
if len(select.select([sys.stdin], [], [], sleepsecs)[0]):
|
||||||
|
return 1
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
|
||||||
from imapsync import repository
|
from imapsync import repository
|
||||||
import re
|
import re, time
|
||||||
|
|
||||||
class UIBase:
|
class UIBase:
|
||||||
################################################## UTILS
|
################################################## UTILS
|
||||||
@ -95,12 +95,22 @@ class UIBase:
|
|||||||
def addingflags(s, uid, flags, destlist):
|
def addingflags(s, uid, flags, destlist):
|
||||||
ds = s.folderlist(destlist)
|
ds = s.folderlist(destlist)
|
||||||
s._msg("Adding flags %s to message %d on %s" % \
|
s._msg("Adding flags %s to message %d on %s" % \
|
||||||
(flags.join(", "), uid, ds))
|
(", ".join(flags), uid, ds))
|
||||||
|
|
||||||
def deletingflags(s, uid, flags, destlist):
|
def deletingflags(s, uid, flags, destlist):
|
||||||
ds = s.folderlist(destlist)
|
ds = s.folderlist(destlist)
|
||||||
s._msg("Deleting flags %s to message %d on %s" % \
|
s._msg("Deleting flags %s to message %d on %s" % \
|
||||||
(flags.join(", "), uid, ds))
|
(", ".join(flags), uid, ds))
|
||||||
|
|
||||||
|
################################################## Other
|
||||||
|
|
||||||
|
def sleeping(s, sleepsecs, remainingsecs):
|
||||||
|
"""Sleep for sleepsecs, remainingsecs to go.
|
||||||
|
If sleepsecs is 0, indicates we're done sleeping.
|
||||||
|
|
||||||
|
Return 0 for normal sleep, or 1 to indicate a request
|
||||||
|
to sync immediately."""
|
||||||
|
s._msg("Next refresh in %d seconds" % remainingsec)
|
||||||
|
if sleepsecs > 0:
|
||||||
|
time.sleep(sleepsecs)
|
||||||
|
return 0
|
||||||
|
Loading…
Reference in New Issue
Block a user