offlineimap/head/offlineimap.py

116 lines
4.4 KiB
Python
Raw Normal View History

2002-06-21 07:54:27 +02:00
#!/usr/bin/python2.2
2002-06-19 04:21:27 +02:00
# Copyright (C) 2002 John Goerzen
# <jgoerzen@complete.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2002-06-21 08:51:21 +02:00
from imapsync import imaplib, imaputil, imapserver, repository, folder, mbnames
2002-06-21 07:54:27 +02:00
import re, os, os.path, imapsync, sys
2002-06-20 04:55:24 +02:00
from ConfigParser import ConfigParser
2002-06-19 04:21:27 +02:00
2002-06-21 07:54:27 +02:00
ui = imapsync.ui.TTY.TTYUI()
ui.init_banner()
2002-06-20 04:55:24 +02:00
config = ConfigParser()
2002-06-21 07:54:27 +02:00
configfilename = os.path.expanduser("~/.imapsyncrc")
if not os.path.exists(configfilename):
sys.stderr.write(" *** Config file %s does not exist; aborting!\n" % configfilename)
sys.exit(1)
config.read(configfilename)
2002-06-20 04:55:24 +02:00
metadatadir = os.path.expanduser(config.get("general", "metadata"))
if not os.path.exists(metadatadir):
os.mkdir(metadatadir, 0700)
2002-06-19 04:21:27 +02:00
2002-06-20 04:55:24 +02:00
accounts = config.get("general", "accounts")
accounts = accounts.replace(" ", "")
accounts = accounts.split(",")
server = None
remoterepos = None
localrepos = None
2002-06-21 08:51:21 +02:00
mailboxes = []
2002-06-20 04:55:24 +02:00
for accountname in accounts:
2002-06-21 07:29:12 +02:00
ui.acct(accountname)
2002-06-20 04:55:24 +02:00
accountmetadata = os.path.join(metadatadir, accountname)
if not os.path.exists(accountmetadata):
os.mkdir(accountmetadata, 0700)
host = config.get(accountname, "remotehost")
user = config.get(accountname, "remoteuser")
port = None
if config.has_option(accountname, "remoteport"):
port = config.getint(accountname, "remoteport")
password = None
if config.has_option(accountname, "remotepass"):
password = config.get(accountname, "remotepass")
else:
2002-06-21 07:29:12 +02:00
password = ui.getpass(accountname, host, port, user)
2002-06-20 04:55:24 +02:00
ssl = config.getboolean(accountname, "ssl")
# Connect to the remote server.
2002-06-20 04:55:24 +02:00
server = imapserver.IMAPServer(user, password, host, port, ssl)
2002-06-21 08:51:21 +02:00
remoterepos = repository.IMAP.IMAPRepository(config, accountname, server)
# Connect to the Maildirs.
2002-06-20 04:55:24 +02:00
localrepos = repository.Maildir.MaildirRepository(os.path.expanduser(config.get(accountname, "localfolders")))
# Connect to the local cache.
statusrepos = repository.LocalStatus.LocalStatusRepository(accountmetadata)
2002-06-21 07:29:12 +02:00
ui.syncfolders(remoterepos, localrepos)
2002-06-20 04:55:24 +02:00
remoterepos.syncfoldersto(localrepos)
2002-06-21 07:29:12 +02:00
2002-06-20 04:55:24 +02:00
for remotefolder in remoterepos.getfolders():
2002-06-21 08:51:21 +02:00
mailboxes.append({'accountname': accountname,
'foldername': remotefolder.getvisiblename()})
2002-06-21 04:31:05 +02:00
# Load local folder.
2002-06-21 08:51:21 +02:00
localfolder = localrepos.getfolder(remotefolder.getvisiblename())
2002-06-21 04:31:05 +02:00
if not localfolder.isuidvalidityok(remotefolder):
2002-06-21 07:29:12 +02:00
ui.validityproblem(remotefolder)
2002-06-21 04:31:05 +02:00
continue
2002-06-21 07:29:12 +02:00
ui.syncingfolder(remoterepos, remotefolder, localrepos, localfolder)
ui.loadmessagelist(localrepos, localfolder)
localfolder.cachemessagelist()
2002-06-21 07:29:12 +02:00
ui.messagelistloaded(localrepos, localfolder, len(localfolder.getmessagelist().keys()))
2002-06-21 04:31:05 +02:00
# Load remote folder.
2002-06-21 07:29:12 +02:00
ui.loadmessagelist(remoterepos, remotefolder)
2002-06-21 04:31:05 +02:00
remotefolder.cachemessagelist()
2002-06-21 07:29:12 +02:00
ui.messagelistloaded(remoterepos, remotefolder,
len(remotefolder.getmessagelist().keys()))
2002-06-21 04:31:05 +02:00
# Load status folder.
2002-06-21 08:51:21 +02:00
statusfolder = statusrepos.getfolder(remotefolder.getvisiblename())
2002-06-21 06:04:47 +02:00
statusfolder.cachemessagelist()
2002-06-21 04:31:05 +02:00
2002-06-21 07:29:12 +02:00
if not statusfolder.isnewfolder():
ui.syncingmessages(localrepos, localfolder, remoterepos, remotefolder)
2002-06-21 04:31:05 +02:00
localfolder.syncmessagesto(statusfolder, [remotefolder, statusfolder])
# Synchronize remote changes.
2002-06-21 07:29:12 +02:00
ui.syncingmessages(remoterepos, remotefolder, localrepos, localfolder)
2002-06-21 06:04:47 +02:00
remotefolder.syncmessagesto(localfolder)
2002-06-21 04:31:05 +02:00
# Make sure the status folder is up-to-date.
2002-06-21 07:29:12 +02:00
ui.syncingmessages(localrepos, localfolder, statusrepos, statusfolder)
2002-06-21 04:31:05 +02:00
localfolder.syncmessagesto(statusfolder)
statusfolder.save()
2002-06-20 04:55:24 +02:00
2002-06-21 08:51:21 +02:00
mbnames.genmbnames(config, mailboxes)