Merge branch 'master' into next
This commit is contained in:
commit
e8c40a9285
148
README.md
148
README.md
@ -1,5 +1,5 @@
|
|||||||
OfflineImap README
|
OfflineImap
|
||||||
==================
|
===========
|
||||||
|
|
||||||
Description
|
Description
|
||||||
-----------
|
-----------
|
||||||
@ -24,9 +24,9 @@ it. In fact, you are encouraged to contribute to OfflineIMAP.
|
|||||||
Documentation
|
Documentation
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
The documentation is included (in .rst format) in the `docs` directory.
|
The documentation is included (in .rst format) in the `docs` directory.
|
||||||
Read it directly or generate nice html docs (python-sphinx needed) and/or
|
Read it directly or generate nice html docs (python-sphinx needed) and/or
|
||||||
the man page (python-docutils needed) while being in the `docs` dir via::
|
the man page (python-docutils needed) while being in the `docs` dir via:
|
||||||
|
|
||||||
'make doc' (user docs), 'make man' (man page only) or 'make' (both)
|
'make doc' (user docs), 'make man' (man page only) or 'make' (both)
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ Quick Start
|
|||||||
===========
|
===========
|
||||||
|
|
||||||
First, install OfflineIMAP. See docs/INSTALL.rst or read
|
First, install OfflineIMAP. See docs/INSTALL.rst or read
|
||||||
http://docs.offlineimap.org/en/latest/INSTALL.html.
|
http://docs.offlineimap.org/en/latest/INSTALL.html.
|
||||||
(hint: `sudo python setup.py install`)
|
(hint: `sudo python setup.py install`)
|
||||||
|
|
||||||
Second, set up your configuration file and run it! The distribution
|
Second, set up your configuration file and run it! The distribution
|
||||||
@ -50,23 +50,23 @@ provides you with the bare minimum of setting up OfflineIMAP. You can
|
|||||||
simply copy this file into your home directory and name it
|
simply copy this file into your home directory and name it
|
||||||
``.offlineimaprc``. A command such as ``cp offlineimap.conf.minimal
|
``.offlineimaprc``. A command such as ``cp offlineimap.conf.minimal
|
||||||
~/.offlineimaprc`` will do it. Or, if you prefer, you can just copy
|
~/.offlineimaprc`` will do it. Or, if you prefer, you can just copy
|
||||||
this text to ``~/.offlineimaprc``::
|
this text to ``~/.offlineimaprc``:
|
||||||
|
|
||||||
[general]
|
[general]
|
||||||
accounts = Test
|
accounts = Test
|
||||||
|
|
||||||
[Account Test]
|
[Account Test]
|
||||||
localrepository = Local
|
localrepository = Local
|
||||||
remoterepository = Remote
|
remoterepository = Remote
|
||||||
|
|
||||||
[Repository Local]
|
[Repository Local]
|
||||||
type = Maildir
|
type = Maildir
|
||||||
localfolders = ~/Test
|
localfolders = ~/Test
|
||||||
|
|
||||||
[Repository Remote]
|
[Repository Remote]
|
||||||
type = IMAP
|
type = IMAP
|
||||||
remotehost = examplehost
|
remotehost = examplehost
|
||||||
remoteuser = jgoerzen
|
remoteuser = jgoerzen
|
||||||
|
|
||||||
|
|
||||||
Now, edit the ``~/.offlineimaprc`` file with your favorite editor. All you have
|
Now, edit the ``~/.offlineimaprc`` file with your favorite editor. All you have
|
||||||
@ -79,9 +79,9 @@ up, ask you for a login password if necessary, synchronize your folders,
|
|||||||
and exit. See?
|
and exit. See?
|
||||||
|
|
||||||
You can just throw away the rest of the finely-crafted, perfectly-honed user
|
You can just throw away the rest of the finely-crafted, perfectly-honed user
|
||||||
manual! Of course, if you want to see how you can make OfflineIMAP
|
manual! Of course, if you want to see how you can make OfflineIMAP
|
||||||
FIVE TIMES FASTER FOR JUST $19.95 (err, well, $0), you have to read on our
|
FIVE TIMES FASTER FOR JUST $19.95 (err, well, $0), you have to read on our
|
||||||
full user documentation and peruse the sample offlineimap.conf (which
|
full user documentation and peruse the sample offlineimap.conf (which
|
||||||
includes all available options) for further tweaks!
|
includes all available options) for further tweaks!
|
||||||
|
|
||||||
|
|
||||||
@ -111,28 +111,28 @@ This example shows you how to set up OfflineIMAP to synchronize multiple
|
|||||||
accounts with the mutt mail reader.
|
accounts with the mutt mail reader.
|
||||||
|
|
||||||
Start by creating a directory to hold your folders by running ``mkdir ~/Mail``.
|
Start by creating a directory to hold your folders by running ``mkdir ~/Mail``.
|
||||||
Then, in your ``~/.offlineimaprc``, specify::
|
Then, in your ``~/.offlineimaprc``, specify:
|
||||||
|
|
||||||
accounts = Personal, Work
|
accounts = Personal, Work
|
||||||
|
|
||||||
|
|
||||||
Make sure that you have both an [Account Personal] and an [Account Work]
|
Make sure that you have both an [Account Personal] and an [Account Work]
|
||||||
section. The local repository for each account must have different localfolder
|
section. The local repository for each account must have different localfolder
|
||||||
path names. Also, make sure to enable [mbnames].
|
path names. Also, make sure to enable [mbnames].
|
||||||
|
|
||||||
In each local repository section, write something like this::
|
In each local repository section, write something like this:
|
||||||
|
|
||||||
localfolders = ~/Mail/Personal
|
localfolders = ~/Mail/Personal
|
||||||
|
|
||||||
|
|
||||||
Finally, add these lines to your ``~/.muttrc``::
|
Finally, add these lines to your ``~/.muttrc``:
|
||||||
|
|
||||||
source ~/path-to-mbnames-muttrc-mailboxes
|
source ~/path-to-mbnames-muttrc-mailboxes
|
||||||
folder-hook Personal set from="youremail@personal.com"
|
folder-hook Personal set from="youremail@personal.com"
|
||||||
folder-hook Work set from="youremail@work.com"
|
folder-hook Work set from="youremail@work.com"
|
||||||
set mbox_type=Maildir
|
set mbox_type=Maildir
|
||||||
set folder=$HOME/Mail
|
set folder=$HOME/Mail
|
||||||
spoolfile=+Personal/INBOX
|
spoolfile=+Personal/INBOX
|
||||||
|
|
||||||
|
|
||||||
That's it!
|
That's it!
|
||||||
@ -146,34 +146,34 @@ to get at their mailboxes, specifying a reference of ``~/Mail`` or ``#mh/``
|
|||||||
depending on the configuration. The below configuration from (originally from
|
depending on the configuration. The below configuration from (originally from
|
||||||
docwhat@gerf.org) shows using a reference of Mail, a nametrans that strips the
|
docwhat@gerf.org) shows using a reference of Mail, a nametrans that strips the
|
||||||
leading Mail/ off incoming folder names, and a folderfilter that limits the
|
leading Mail/ off incoming folder names, and a folderfilter that limits the
|
||||||
folders synced to just three::
|
folders synced to just three:
|
||||||
|
|
||||||
[Account Gerf]
|
[Account Gerf]
|
||||||
localrepository = GerfLocal
|
localrepository = GerfLocal
|
||||||
remoterepository = GerfRemote
|
remoterepository = GerfRemote
|
||||||
|
|
||||||
[Repository GerfLocal]
|
[Repository GerfLocal]
|
||||||
type = Maildir
|
type = Maildir
|
||||||
localfolders = ~/Mail
|
localfolders = ~/Mail
|
||||||
|
|
||||||
[Repository GerfRemote]
|
[Repository GerfRemote]
|
||||||
type = IMAP
|
type = IMAP
|
||||||
remotehost = gerf.org
|
remotehost = gerf.org
|
||||||
ssl = yes
|
ssl = yes
|
||||||
remoteuser = docwhat
|
remoteuser = docwhat
|
||||||
reference = Mail
|
reference = Mail
|
||||||
# Trims off the preceeding Mail on all the folder names.
|
# Trims off the preceeding Mail on all the folder names.
|
||||||
nametrans = lambda foldername: \
|
nametrans = lambda foldername: \
|
||||||
re.sub('^Mail/', '', foldername)
|
re.sub('^Mail/', '', foldername)
|
||||||
# Yeah, you have to mention the Mail dir, even though it
|
# Yeah, you have to mention the Mail dir, even though it
|
||||||
# would seem intuitive that reference would trim it.
|
# would seem intuitive that reference would trim it.
|
||||||
folderfilter = lambda foldername: foldername in [
|
folderfilter = lambda foldername: foldername in [
|
||||||
'Mail/INBOX',
|
'Mail/INBOX',
|
||||||
'Mail/list/zaurus-general',
|
'Mail/list/zaurus-general',
|
||||||
'Mail/list/zaurus-dev',
|
'Mail/list/zaurus-dev',
|
||||||
]
|
]
|
||||||
maxconnections = 1
|
maxconnections = 1
|
||||||
holdconnectionopen = no
|
holdconnectionopen = no
|
||||||
|
|
||||||
|
|
||||||
pythonfile Configuration File Option
|
pythonfile Configuration File Option
|
||||||
@ -184,34 +184,34 @@ configuration file options that are Python expressions. This example is based
|
|||||||
on one supplied by Tommi Virtanen for this feature.
|
on one supplied by Tommi Virtanen for this feature.
|
||||||
|
|
||||||
|
|
||||||
In ~/.offlineimaprc, he adds these options::
|
In ~/.offlineimaprc, he adds these options:
|
||||||
|
|
||||||
[general]
|
[general]
|
||||||
pythonfile=~/.offlineimap.py
|
pythonfile=~/.offlineimap.py
|
||||||
[Repository foo]
|
[Repository foo]
|
||||||
foldersort=mycmp
|
foldersort=mycmp
|
||||||
|
|
||||||
Then, the ~/.offlineimap.py file will contain::
|
Then, the ~/.offlineimap.py file will contain:
|
||||||
|
|
||||||
prioritized = ['INBOX', 'personal', 'announce', 'list']
|
prioritized = ['INBOX', 'personal', 'announce', 'list']
|
||||||
|
|
||||||
def mycmp(x, y):
|
def mycmp(x, y):
|
||||||
for prefix in prioritized:
|
for prefix in prioritized:
|
||||||
xsw = x.startswith(prefix)
|
xsw = x.startswith(prefix)
|
||||||
ysw = y.startswith(prefix)
|
ysw = y.startswith(prefix)
|
||||||
if xsw and ysw:
|
if xsw and ysw:
|
||||||
|
return cmp(x, y)
|
||||||
|
elif xsw:
|
||||||
|
return -1
|
||||||
|
elif ysw:
|
||||||
|
return +1
|
||||||
return cmp(x, y)
|
return cmp(x, y)
|
||||||
elif xsw:
|
|
||||||
return -1
|
|
||||||
elif ysw:
|
|
||||||
return +1
|
|
||||||
return cmp(x, y)
|
|
||||||
|
|
||||||
def test_mycmp():
|
def test_mycmp():
|
||||||
import os, os.path
|
import os, os.path
|
||||||
folders=os.listdir(os.path.expanduser('~/data/mail/tv@hq.yok.utu.fi'))
|
folders=os.listdir(os.path.expanduser('~/data/mail/tv@hq.yok.utu.fi'))
|
||||||
folders.sort(mycmp)
|
folders.sort(mycmp)
|
||||||
print folders
|
print folders
|
||||||
|
|
||||||
|
|
||||||
This code snippet illustrates how the foldersort option can be customized with a
|
This code snippet illustrates how the foldersort option can be customized with a
|
||||||
|
@ -234,7 +234,7 @@ remoterepository = RemoteExample
|
|||||||
# Messages older than maxage days will not be synced, their flags will
|
# Messages older than maxage days will not be synced, their flags will
|
||||||
# not be changed, they will not be deleted etc. For offlineimap it will
|
# not be changed, they will not be deleted etc. For offlineimap it will
|
||||||
# be like these messages do not exist. This will perform an IMAP search
|
# be like these messages do not exist. This will perform an IMAP search
|
||||||
# in the case of IMAP or Gmail and therefor requires that the server
|
# in the case of IMAP or Gmail and therefore requires that the server
|
||||||
# support server side searching. This will calculate the earliest day
|
# support server side searching. This will calculate the earliest day
|
||||||
# that would be included in the search and include all messages from
|
# that would be included in the search and include all messages from
|
||||||
# that day until today. e.g. maxage = 3 to sync only the last 3 days
|
# that day until today. e.g. maxage = 3 to sync only the last 3 days
|
||||||
@ -292,6 +292,7 @@ type = IMAP
|
|||||||
# "getcredentials" that parses a file "filename" and returns the account
|
# "getcredentials" that parses a file "filename" and returns the account
|
||||||
# details for "hostname".
|
# details for "hostname".
|
||||||
# remotehosteval = getcredentials("filename", "hostname", "hostname")
|
# remotehosteval = getcredentials("filename", "hostname", "hostname")
|
||||||
|
# remoteporteval = getcredentials("filename", "hostname", "port")
|
||||||
# remoteusereval = getcredentials("filename", "hostname", "user")
|
# remoteusereval = getcredentials("filename", "hostname", "user")
|
||||||
# remotepasseval = getcredentials("filename", "hostname", "passwd")
|
# remotepasseval = getcredentials("filename", "hostname", "passwd")
|
||||||
|
|
||||||
|
@ -367,7 +367,7 @@ class BaseFolder(object):
|
|||||||
raise
|
raise
|
||||||
except OfflineImapError as e:
|
except OfflineImapError as e:
|
||||||
if e.severity > OfflineImapError.ERROR.MESSAGE:
|
if e.severity > OfflineImapError.ERROR.MESSAGE:
|
||||||
raise # buble severe errors up
|
raise # bubble severe errors up
|
||||||
self.ui.error(e, exc_info()[2])
|
self.ui.error(e, exc_info()[2])
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.ui.error(e, "Copying message %s [acc: %s]:\n %s" %\
|
self.ui.error(e, "Copying message %s [acc: %s]:\n %s" %\
|
||||||
|
@ -556,7 +556,7 @@ class IMAPFolder(BaseFolder):
|
|||||||
imapobj = self.imapserver.acquireconnection()
|
imapobj = self.imapserver.acquireconnection()
|
||||||
if not retry_left:
|
if not retry_left:
|
||||||
raise OfflineImapError("Saving msg in folder '%s', "
|
raise OfflineImapError("Saving msg in folder '%s', "
|
||||||
"repository '%s' failed (abort). Server reponded: %s\n"
|
"repository '%s' failed (abort). Server responded: %s\n"
|
||||||
"Message content was: %s" %
|
"Message content was: %s" %
|
||||||
(self, self.getrepository(), str(e), dbg_output),
|
(self, self.getrepository(), str(e), dbg_output),
|
||||||
OfflineImapError.ERROR.MESSAGE)
|
OfflineImapError.ERROR.MESSAGE)
|
||||||
@ -568,7 +568,7 @@ class IMAPFolder(BaseFolder):
|
|||||||
self.imapserver.releaseconnection(imapobj, True)
|
self.imapserver.releaseconnection(imapobj, True)
|
||||||
imapobj = None
|
imapobj = None
|
||||||
raise OfflineImapError("Saving msg folder '%s', repo '%s'"
|
raise OfflineImapError("Saving msg folder '%s', repo '%s'"
|
||||||
"failed (error). Server reponded: %s\nMessage content was: "
|
"failed (error). Server responded: %s\nMessage content was: "
|
||||||
"%s" % (self, self.getrepository(), str(e), dbg_output),
|
"%s" % (self, self.getrepository(), str(e), dbg_output),
|
||||||
OfflineImapError.ERROR.MESSAGE)
|
OfflineImapError.ERROR.MESSAGE)
|
||||||
# Checkpoint. Let it write out stuff, etc. Eg searches for
|
# Checkpoint. Let it write out stuff, etc. Eg searches for
|
||||||
|
@ -148,6 +148,13 @@ class IMAPRepository(BaseRepository):
|
|||||||
|
|
||||||
|
|
||||||
def getport(self):
|
def getport(self):
|
||||||
|
port = None
|
||||||
|
|
||||||
|
if self.config.has_option(self.getsection(), 'remoteporteval'):
|
||||||
|
port = self.getconf('remoteporteval')
|
||||||
|
if port != None:
|
||||||
|
return self.localeval.eval(port)
|
||||||
|
|
||||||
return self.getconfint('remoteport', None)
|
return self.getconfint('remoteport', None)
|
||||||
|
|
||||||
def getssl(self):
|
def getssl(self):
|
||||||
|
Loading…
Reference in New Issue
Block a user