]> code.delx.au - offlineimap/blob - head/offlineimap.py
/head: changeset 39
[offlineimap] / head / offlineimap.py
1 #!/usr/bin/python2.2
2
3 # Copyright (C) 2002 John Goerzen
4 # <jgoerzen@complete.org>
5 #
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
20 from offlineimap import imaplib, imaputil, imapserver, repository, folder, mbnames
21 import re, os, os.path, offlineimap, sys
22 from ConfigParser import ConfigParser
23
24 ui = offlineimap.ui.TTY.TTYUI()
25 ui.init_banner()
26
27 config = ConfigParser()
28 configfilename = os.path.expanduser("~/.offlineimaprc")
29 if not os.path.exists(configfilename):
30 sys.stderr.write(" *** Config file %s does not exist; aborting!\n" % configfilename)
31 sys.exit(1)
32
33 config.read(configfilename)
34
35 metadatadir = os.path.expanduser(config.get("general", "metadata"))
36 if not os.path.exists(metadatadir):
37 os.mkdir(metadatadir, 0700)
38
39 accounts = config.get("general", "accounts")
40 accounts = accounts.replace(" ", "")
41 accounts = accounts.split(",")
42
43 server = None
44 remoterepos = None
45 localrepos = None
46 mailboxes = []
47
48 def syncitall():
49 for accountname in accounts:
50 ui.acct(accountname)
51 accountmetadata = os.path.join(metadatadir, accountname)
52 if not os.path.exists(accountmetadata):
53 os.mkdir(accountmetadata, 0700)
54 host = config.get(accountname, "remotehost")
55 user = config.get(accountname, "remoteuser")
56 port = None
57 if config.has_option(accountname, "remoteport"):
58 port = config.getint(accountname, "remoteport")
59 password = None
60 if config.has_option(accountname, "remotepass"):
61 password = config.get(accountname, "remotepass")
62 else:
63 password = ui.getpass(accountname, host, port, user)
64 # Save it for future reference.
65 config.set(accountname, "remotepass", password)
66 ssl = config.getboolean(accountname, "ssl")
67
68 # Connect to the remote server.
69 server = imapserver.IMAPServer(user, password, host, port, ssl)
70 remoterepos = repository.IMAP.IMAPRepository(config, accountname, server)
71
72 # Connect to the Maildirs.
73 localrepos = repository.Maildir.MaildirRepository(os.path.expanduser(config.get(accountname, "localfolders")))
74
75 # Connect to the local cache.
76 statusrepos = repository.LocalStatus.LocalStatusRepository(accountmetadata)
77
78 ui.syncfolders(remoterepos, localrepos)
79 remoterepos.syncfoldersto(localrepos)
80
81 for remotefolder in remoterepos.getfolders():
82 mailboxes.append({'accountname': accountname,
83 'foldername': remotefolder.getvisiblename()})
84 # Load local folder.
85 localfolder = localrepos.getfolder(remotefolder.getvisiblename())
86 if not localfolder.isuidvalidityok(remotefolder):
87 ui.validityproblem(remotefolder)
88 continue
89 ui.syncingfolder(remoterepos, remotefolder, localrepos, localfolder)
90 ui.loadmessagelist(localrepos, localfolder)
91 localfolder.cachemessagelist()
92 ui.messagelistloaded(localrepos, localfolder, len(localfolder.getmessagelist().keys()))
93
94 # Load remote folder.
95 ui.loadmessagelist(remoterepos, remotefolder)
96 remotefolder.cachemessagelist()
97 ui.messagelistloaded(remoterepos, remotefolder,
98 len(remotefolder.getmessagelist().keys()))
99
100 # Load status folder.
101 statusfolder = statusrepos.getfolder(remotefolder.getvisiblename())
102 statusfolder.cachemessagelist()
103
104 if not statusfolder.isnewfolder():
105 ui.syncingmessages(localrepos, localfolder, remoterepos, remotefolder)
106 localfolder.syncmessagesto(statusfolder, [remotefolder, statusfolder])
107
108 # Synchronize remote changes.
109 ui.syncingmessages(remoterepos, remotefolder, localrepos, localfolder)
110 remotefolder.syncmessagesto(localfolder)
111
112 # Make sure the status folder is up-to-date.
113 ui.syncingmessages(localrepos, localfolder, statusrepos, statusfolder)
114 localfolder.syncmessagesto(statusfolder)
115 statusfolder.save()
116 server.close()
117
118
119 mbnames.genmbnames(config, mailboxes)
120
121 syncitall()
122 if config.has_option('general', 'autorefresh'):
123 refreshperiod = config.getint('general', 'autorefresh') * 60
124 while 1:
125 sleepamount = refreshperiod
126 abortsleep = 0
127 while sleepamount > 0 and not abortsleep:
128 abortsleep = ui.sleeping(1, sleepamount)
129 sleepamount -= 1
130 ui.sleeping(0, 0) # Done sleeping.
131 syncitall()
132