Go to file
Tobias Thierer caef9a72fc Fix IMAP folder throwing away time zone when parsing email Date headers
Fix imapfolder.getmessageinternaldate misparsing the Date:
header from emails due to a bug or surprising behaviour by
email.utils.parsedate. This is because email.utils.parsedate's
return value contains the unadjusted hour value from the string
parsed but does not include information about the time zone in
which it is specified. For example (Python 2.7.3):

$ python -c "import email.utils;
  print email.utils.parsedate('Mon, 20 Nov 1995 19:12:08 -0500')"
 (1995, 11, 20, 19, 12, 8, 0, 1, -1)

(the -1 is the isdst field); the -0500 time zone is completely
ignored, so e.g. the same input with time "19:12:08 +0300" has
the same result. When passed to time.struct_time as allowed per
the parsedate documentation, this time is interpreted in GMT and
thus deviates from the correct value by the timezone offset
(in this example, -5 hours).

I consider this a bug in email.utils.parsedate: In my opinion,
since the return value of the parsetime doesn't include a timezone,
it should be expressed in terms of UTC rather than in terms of the
time zone from the Date header; the existence of
email.utils.parsedate_tz, to which I've switched, indicates that
maybe the authors were aware of this problem.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
2012-10-03 11:16:13 +02:00
bin Convert to use OptionParser for command line handling. 2010-12-15 20:02:27 +01:00
docs docs: update links to the newly created github organization 2012-08-20 14:45:43 +02:00
offlineimap Fix IMAP folder throwing away time zone when parsing email Date headers 2012-10-03 11:16:13 +02:00
test Fix str.format() calls for Python 2.6. 2012-06-02 18:25:51 +02:00
.gitignore v6.5.3 release 2012-04-02 23:47:32 +02:00
Changelog.maint.rst v6.3.2.1 2011-03-16 20:46:18 +01:00
Changelog.rst Fix IMAP folder throwing away time zone when parsing email Date headers 2012-10-03 11:16:13 +02:00
COPYING Declutter root dir: COPYRIGHT --> COPYING 2012-02-24 11:30:45 +01:00
MAINTAINERS add official maintainers list with minimal informations 2012-09-03 19:38:16 +02:00
Makefile documentation: Make top-level README a plain text file. 2012-02-24 14:46:14 +01:00
offlineimap.conf Implement the "createfolders" setting for repositories 2012-05-08 16:56:45 +02:00
offlineimap.conf.minimal Improve nametrans user documentation 2012-02-13 16:07:33 +01:00
offlineimap.py Convert to use OptionParser for command line handling. 2010-12-15 20:02:27 +01:00
README docs: update links to the newly created github organization 2012-08-20 14:45:43 +02:00
setup.py tests: add delete remote folder helper function 2012-02-17 10:12:53 +01:00

OfflineImap README
==================

Description
-----------

OfflineIMAP is a tool to simplify your e-mail reading. With OfflineIMAP, you can
read the same mailbox from multiple computers. You get a current copy of your
messages on each computer, and changes you make one place will be visible on all
other systems. For instance, you can delete a message on your home computer, and
it will appear deleted on your work computer as well. OfflineIMAP is also useful
if you want to use a mail reader that does not have IMAP support, has poor IMAP
support, or does not provide disconnected operation. It's homepage at
http://offlineimap.org contains more information, source code, and online
documentation.

OfflineIMAP does not require additional python dependencies beyond python >=2.6
(although python-sqlite is strongly recommended).

OfflineIMAP is a Free Software project licensed under the GNU General Public
License version 2 (or later). You can download it for free, and you can modify
it. In fact, you are encouraged to contribute to OfflineIMAP.

Documentation
-------------

The documentation is included (in .rst format) in the `docs` directory. 
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::

    'make doc' (user docs), 'make man' (man page only) or 'make' (both)

    (`make html` will simply create html versions of all *.rst files in /docs)

The resulting user documentation will be in `docs/html`. The full user
docs are also at: http://docs.offlineimap.org. Please see there for
detailed information on how to install and configure OfflineImap.

Quick Start
===========

First, install OfflineIMAP. See docs/INSTALL.rst or read
http://docs.offlineimap.org/en/latest/INSTALL.html. 
(hint: `sudo python setup.py install`)

Second, set up your configuration file and run it! The distribution
includes offlineimap.conf.minimal (Debian users may find this at
``/usr/share/doc/offlineimap/examples/offlineimap.conf.minimal``) that
provides you with the bare minimum of setting up OfflineIMAP.  You can
simply copy this file into your home directory and name it
``.offlineimaprc``.  A command such as ``cp offlineimap.conf.minimal
~/.offlineimaprc`` will do it.  Or, if you prefer, you can just copy
this text to ``~/.offlineimaprc``::

  [general]
  accounts = Test

  [Account Test]
  localrepository = Local
  remoterepository = Remote

  [Repository Local]
  type = Maildir
  localfolders = ~/Test

  [Repository Remote]
  type = IMAP
  remotehost = examplehost
  remoteuser = jgoerzen


Now, edit the ``~/.offlineimaprc`` file with your favorite editor.  All you have
to do is specify a directory for your folders to be in (on the localfolders
line), the host name of your IMAP server (on the remotehost line), and your
login name on the remote (on the remoteuser line).  That's it!

To run OfflineIMAP, you just have to say `offlineimap` ― it will fire
up, ask you for a login password if necessary, synchronize your folders,
and exit.  See?

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 
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 
includes all available options) for further tweaks!


Mailing list & bug reporting
----------------------------

The user discussion, development and all exciting stuff take place in the
OfflineImap mailing list at
http://lists.alioth.debian.org/mailman/listinfo/offlineimap-project. You do not
need to subscribe to send emails.

Bugs, issues and contributions should be reported to the mailing list. Bugs can
also be reported in the issue tracker at
https://github.com/OfflineIMAP/offlineimap/issues.

Configuration Examples
======================

Here are some example configurations for various situations.  Please e-mail any
other examples you have that may be useful to me.


Multiple Accounts with Mutt
---------------------------

This example shows you how to set up OfflineIMAP to synchronize multiple
accounts with the mutt mail reader.

Start by creating a directory to hold your folders by running ``mkdir ~/Mail``.
Then, in your ``~/.offlineimaprc``, specify::

  accounts = Personal, 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
path names.  Also, make sure to enable [mbnames].

In each local repository section, write something like this::

	localfolders = ~/Mail/Personal


Finally, add these lines to your ``~/.muttrc``::

  source ~/path-to-mbnames-muttrc-mailboxes
  folder-hook Personal set from="youremail@personal.com"
  folder-hook Work set from="youremail@work.com"
  set mbox_type=Maildir
  set folder=$HOME/Mail
  spoolfile=+Personal/INBOX


That's it!


UW-IMAPD and References
-----------------------

Some users with a UW-IMAPD server need to use OfflineIMAP's "reference" feature
to get at their mailboxes, specifying a reference of ``~/Mail`` or ``#mh/``
depending on the configuration.  The below configuration from (originally from
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
folders synced to just three::

  [Account Gerf]
  localrepository = GerfLocal
  remoterepository = GerfRemote

  [Repository GerfLocal]
  type = Maildir
  localfolders = ~/Mail

  [Repository GerfRemote]
  type = IMAP
  remotehost = gerf.org
  ssl = yes
  remoteuser = docwhat
  reference = Mail
  # Trims off the preceeding Mail on all the folder names.
  nametrans = lambda foldername: \
    re.sub('^Mail/', '', foldername)
  # Yeah, you have to mention the Mail dir, even though it
  # would seem intuitive that reference would trim it.
  folderfilter = lambda foldername: foldername in [
    'Mail/INBOX',
    'Mail/list/zaurus-general',
    'Mail/list/zaurus-dev',
  ]
  maxconnections = 1
  holdconnectionopen = no


pythonfile Configuration File Option
-------------------------------------

You can have OfflineIMAP load up a Python file before evaluating the
configuration file options that are Python expressions.  This example is based
on one supplied by Tommi Virtanen for this feature.


In ~/.offlineimaprc, he adds these options::

  [general]
  pythonfile=~/.offlineimap.py
  [Repository foo]
  foldersort=mycmp

Then, the ~/.offlineimap.py file will contain::

  prioritized = ['INBOX', 'personal', 'announce', 'list']

  def mycmp(x, y):
    for prefix in prioritized:
      xsw = x.startswith(prefix)
      ysw = y.startswith(prefix)
      if xsw and ysw:
        return cmp(x, y)
      elif xsw:
        return -1
      elif ysw:
        return +1
    return cmp(x, y)

  def test_mycmp():
    import os, os.path
    folders=os.listdir(os.path.expanduser('~/data/mail/tv@hq.yok.utu.fi'))
    folders.sort(mycmp)
    print folders


This code snippet illustrates how the foldersort option can be customized with a
Python function from the pythonfile to always synchronize certain folders first.