 340c2f9a89
			
		
	
	340c2f9a89
	
	
	
		
			
			Improve wording, and integrate the MANUAL and INSTALL and FAQ documents into our complete user manual that is hosted online. Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
		
			
				
	
	
		
			730 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			730 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| ====================
 | |
|  OfflineIMAP Manual
 | |
| ====================
 | |
| 
 | |
| --------------------------------------------------------
 | |
| Powerful IMAP/Maildir synchronization and reader support
 | |
| --------------------------------------------------------
 | |
| 
 | |
| :Author: John Goerzen <jgoerzen@complete.org> & contributors
 | |
| :Date: 2011-01-15
 | |
| :Copyright: GPL v2
 | |
| :Manual section: 1
 | |
| 
 | |
| .. TODO: :Manual group:
 | |
| 
 | |
| 
 | |
| DESCRIPTION
 | |
| ===========
 | |
| 
 | |
| OfflineImap operates on a REMOTE and a LOCAL repository and synchronizes
 | |
| emails between them, so that you can read the same mailbox from multiple
 | |
| computers. The REMOTE repository is some IMAP server, while LOCAL can be
 | |
| either a local Maildir or another IMAP server.
 | |
| 
 | |
| Missing folders will be automatically created on both sides if
 | |
| needed. No folders will be deleted at the moment.
 | |
| 
 | |
| Configuring OfflineImap in basic mode is quite easy, however it provides
 | |
| an amazing amount of flexibility for those with special needs.  You can
 | |
| specify the number of connections to your IMAP server, use arbitrary
 | |
| python functions (including regular expressions) to limit the number of
 | |
| folders being synchronized. You can transpose folder names between
 | |
| repositories using any python function, to mangle and modify folder
 | |
| names on the LOCAL repository. There are six different ways to hand the
 | |
| IMAP password to OfflineImap from console input, specifying in the
 | |
| configuration file, .netrc support, specifying in a separate file, to
 | |
| using arbitrary python functions that somehow return the
 | |
| password. Finally, you can use IMAPs IDLE infrastructure to always keep
 | |
| a connection to your IMAP server open and immediately be notified (and
 | |
| synchronized) when a new mail arrives (aka Push mail).
 | |
| 
 | |
| Most configuration is done via the configuration file.  However, any setting can also be overriden by command line options handed to OfflineIMAP.
 | |
| 
 | |
| OfflineImap is well suited to be frequently invoked by cron jobs, or can run in daemon mode to periodically check your email (however, it will exit in some error situations).
 | |
| 
 | |
| .. _configuration:
 | |
| 
 | |
| Configuration
 | |
| =============
 | |
| 
 | |
| `OfflineIMAP`_ is regulated by a configuration file that is normally stored in
 | |
| `~/.offlineimaprc`.  `OfflineIMAP`_ ships with a file named `offlineimap.conf`
 | |
| that you should copy to that location and then edit.  This file is vital to
 | |
| proper operation of the system; it sets everything you need to run
 | |
| `OfflineIMAP`_.  Full documentation for the configuration file is included
 | |
| within the sample file.
 | |
| 
 | |
| 
 | |
| `OfflineIMAP`_ also ships a file named `offlineimap.conf.minimal` that you can
 | |
| also try.  It's useful if you want to get started with the most basic feature
 | |
| set, and you can read about other features later with `offlineimap.conf`.
 | |
| 
 | |
| Check out the `Use Cases`_ section for some example configurations.
 | |
| 
 | |
| 
 | |
| OPTIONS
 | |
| =======
 | |
| 
 | |
| 
 | |
| -1                Disable most multithreading operations
 | |
| 
 | |
|   Use solely a single-connection sync.  This effectively sets the
 | |
|   maxsyncaccounts and all maxconnections configuration file variables to 1.
 | |
| 
 | |
| 
 | |
| -P                profiledir
 | |
| 
 | |
|   Sets OfflineIMAP into profile mode.  The program will create profiledir (it
 | |
|   must not already exist).  As it runs, Python profiling information about each
 | |
|   thread is logged into profiledir.  Please note: This option is present for
 | |
|   debugging and optimization only, and should NOT be used unless you have a
 | |
|   specific reason to do so.  It will significantly slow program performance, may
 | |
|   reduce reliability, and can generate huge amounts of data.  You must use the
 | |
|   -1 option when you use -P.
 | |
| 
 | |
| 
 | |
| -a                accountlist
 | |
| 
 | |
|   Overrides the accounts option in the general section of the configuration
 | |
|   file.  You might use this to exclude certain accounts, or to sync some
 | |
|   accounts that you normally prefer not to.  Separate the accounts by commas,
 | |
|   and use no embedded spaces.
 | |
| 
 | |
| 
 | |
| -c                configfile
 | |
| 
 | |
|   Specifies a configuration file to use in lieu of the default,
 | |
|   ``~/.offlineimaprc``.
 | |
| 
 | |
| 
 | |
| -d                debugtype[,...]
 | |
| 
 | |
|   Enables debugging for OfflineIMAP.  This is useful if you are trying to track
 | |
|   down a malfunction or figure out what is going on under the hood.  I suggest
 | |
|   that you use this with -1 to make the results more sensible.
 | |
| 
 | |
|   -d requires one or more debugtypes, separated by commas.  These define what
 | |
|   exactly will be debugged, and include three options: imap, maildir, and
 | |
|   thread.  The imap option will enable IMAP protocol stream and parsing
 | |
|   debugging.  Note that the output may contain passwords, so take care to remove
 | |
|   that from the debugging output before sending it to anyone else.  The maildir
 | |
|   option will enable debugging for certain Maildir operations.  And thread will
 | |
|   debug the threading model.
 | |
| 
 | |
| 
 | |
| -f                foldername[,foldername]
 | |
| 
 | |
|   Only sync the specified folders.  The foldernames are the untranslated
 | |
|   foldernames.  This command-line option overrides any folderfilter and
 | |
|   folderincludes options in the configuration file.
 | |
| 
 | |
| 
 | |
| -k                [section:]option=value
 | |
| 
 | |
|   Override configuration file option.  If "section" is omitted, it defaults to
 | |
|   general.  Any underscores "_" in the section name are replaced with spaces:
 | |
|   for instance, to override option autorefresh in the "[Account Personal]"
 | |
|   section in the config file one would use "-k Account_Personal:autorefresh=30".
 | |
|   You may give more than one -k on the command line if you wish.
 | |
| 
 | |
| 
 | |
| -l                filename
 | |
| 
 | |
|   Enables logging to filename.  This will log everything that goes to the screen
 | |
|   to the specified file.  Additionally, if any debugging is specified with -d,
 | |
|   then debug messages will not go to the screen, but instead to the logfile
 | |
|   only.
 | |
| 
 | |
| 
 | |
| -o                Run only once,
 | |
| 
 | |
|   ignoring all autorefresh settings in the configuration file.
 | |
| 
 | |
| 
 | |
| -q                Run only quick synchronizations.
 | |
| 
 | |
|   Ignore any flag updates on IMAP servers.
 | |
| 
 | |
| 
 | |
| -h|--help         Show summary of options.
 | |
| 
 | |
| 
 | |
| -u                interface
 | |
| 
 | |
|   Specifies an alternative user interface module to use.  This overrides the
 | |
|   default specified in the configuration file.  The pre-defined options are
 | |
|   listed in the User Interfaces section. The interface name is case insensitive.
 | |
| 
 | |
| 
 | |
| User Interfaces
 | |
| ===============
 | |
| 
 | |
| OfflineIMAP has various user interfaces that let you choose how the
 | |
| program communicates information to you. The 'ui' option in the
 | |
| configuration file specifies the user interface.  The -u command-line
 | |
| option overrides the configuration file setting.  The available values
 | |
| for the configuration file or command-line are described in this
 | |
| section.
 | |
| 
 | |
| 
 | |
| Blinkenlights
 | |
| ---------------
 | |
| 
 | |
| Blinkenlights is an interface designed to be sleek, fun to watch, and
 | |
| informative of the overall picture of what OfflineIMAP is doing.
 | |
| 
 | |
| Blinkenlights contains a row of "LEDs" with command buttons and a log.
 | |
| The  log shows more detail about what is happening and is color-coded to match
 | |
| the color of the lights.
 | |
| 
 | |
| Each light in the Blinkenlights interface represents a thread of execution --
 | |
| that is, a particular task that OfflineIMAP is performing right now.  The colors
 | |
| indicate what task the particular thread is performing, and are as follows:
 | |
| 
 | |
| * Black:
 | |
|     indicates that this light's thread has terminated; it will light up again
 | |
|     later when new threads start up.  So, black indicates no activity.
 | |
| 
 | |
| * Red (Meaning 1):
 | |
|     is the color of the main program's thread, which basically does nothing but
 | |
|     monitor the others.  It might remind you of HAL 9000 in 2001.
 | |
| 
 | |
| * Gray:
 | |
|     indicates that the thread is establishing a new connection to the IMAP
 | |
|     server.
 | |
| 
 | |
| * Purple:
 | |
|     is the color of an account synchronization thread that is monitoring the
 | |
|     progress of the folders in that account (not generating any I/O).
 | |
| 
 | |
| * Cyan:
 | |
|     indicates that the thread is syncing a folder.
 | |
| 
 | |
| * Green:
 | |
|     means that a folder's message list is being loaded.
 | |
| 
 | |
| * Blue:
 | |
|     is the color of a message synchronization controller thread.
 | |
| 
 | |
| * Orange:
 | |
|     indicates that an actual message is being copied.  (We use fuchsia for fake
 | |
|     messages.)
 | |
| 
 | |
| * Red (meaning 2):
 | |
|     indicates that a message is being deleted.
 | |
| 
 | |
| * Yellow / bright orange:
 | |
|     indicates that message flags are being added.
 | |
| 
 | |
| * Pink / bright red:
 | |
|     indicates that message flags are being removed.
 | |
| 
 | |
| * Red / Black Flashing:
 | |
|     corresponds to the countdown timer that runs between synchronizations.
 | |
| 
 | |
| 
 | |
| The name of this interfaces derives from a bit of computer history.  Eric
 | |
| Raymond's Jargon File defines blinkenlights, in part, as:
 | |
| 
 | |
|   Front-panel diagnostic lights on a computer, esp. a dinosaur. Now that
 | |
|   dinosaurs are rare, this term usually refers to status lights on a modem,
 | |
|   network hub, or the like.
 | |
| 
 | |
| This term derives from the last word of the famous blackletter-Gothic sign in
 | |
| mangled pseudo-German that once graced about half the computer rooms in the
 | |
| English-speaking world. One version ran in its entirety as follows:
 | |
| 
 | |
| | ACHTUNG!  ALLES LOOKENSPEEPERS!
 | |
| |
 | |
| | Das computermachine ist nicht fuer gefingerpoken und mittengrabben.
 | |
| | Ist easy schnappen der springenwerk, blowenfusen und poppencorken
 | |
| | mit spitzensparken.  Ist nicht fuer gewerken bei das dumpkopfen.
 | |
| | Das rubbernecken sichtseeren keepen das cotten-pickenen hans in das
 | |
| | pockets muss; relaxen und watchen das blinkenlichten.
 | |
| 
 | |
| 
 | |
| TTYUI
 | |
| ------
 | |
| 
 | |
| TTYUI interface is for people running in terminals.  It prints out basic
 | |
| status messages and is generally friendly to use on a console or xterm.
 | |
| 
 | |
| 
 | |
| Basic
 | |
| ------
 | |
| 
 | |
| Basic is designed for situations in which OfflineIMAP will be run
 | |
| non-attended and the status of its execution will be logged.  This user
 | |
| interface is not capable of reading a password from the keyboard;
 | |
| account passwords must be specified using one of the configuration file
 | |
| options. For example, it will not print periodic sleep announcements and tends to be a tad less verbose, in general.
 | |
| 
 | |
| 
 | |
| Quiet
 | |
| -----
 | |
| 
 | |
| It will output nothing except errors and serious warnings.  Like Basic,
 | |
| this user interface is not capable of reading a password from the
 | |
| keyboard; account passwords must be specified using one of the
 | |
| configuration file options.
 | |
| 
 | |
| MachineUI
 | |
| ---------
 | |
| 
 | |
| MachineUI generates output in a machine-parsable format.  It is designed
 | |
| for other programs that will interface to OfflineIMAP.
 | |
| 
 | |
| 
 | |
| Synchronization Performance
 | |
| ===========================
 | |
| 
 | |
| By default, we use fairly conservative settings that are safe for
 | |
| syncing but that might not be the best performing one. Once you got
 | |
| everything set up and running, you might want to look into speeding up
 | |
| your synchronization. Here are a couple of hints and tips on how to
 | |
| achieve this.
 | |
| 
 | |
|  1) Use maxconnections > 1. By default we only use one connection to an
 | |
|     IMAP server. Using 2 or even 3 speeds things up considerably in most
 | |
|     cases. This setting goes into the [Repository XXX] section.
 | |
| 
 | |
|  2) Use folderfilters. The quickest sync is a sync that can ignore some
 | |
|     folders. I sort my inbox into monthly folders, and ignore every
 | |
|     folder that is more than 2-3 months old, this lets me only inspect a
 | |
|     fraction of my Mails on every sync. If you haven't done this yet, do
 | |
|     it :). See the folderfilter section the example offlineimap.conf.
 | |
| 
 | |
|  3) The default status cache is a plain text file that will write out
 | |
|     the complete file for each single new message (or even changed flag)
 | |
|     to a temporary file. If you have plenty of files in a folder, this
 | |
|     is a few hundred kilo to megabytes for each mail and is bound to
 | |
|     make things slower. I recommend to use the sqlite backend for
 | |
|     that. See the status_backend = sqlite setting in the example
 | |
|     offlineimap.conf. You will need to have python-sqlite installed in
 | |
|     order to use this. This will save you plenty of disk activity. Do
 | |
|     note that the sqlite backend is still considered experimental as it
 | |
|     has only been included recently (although a loss of your status
 | |
|     cache should not be a tragedy as that file can be rebuild
 | |
|     automatically)
 | |
| 
 | |
|  4) Use quick sync. A regular sync will request all flags and all UIDs
 | |
|     of all mails in each folder which takes quite some time. A 'quick'
 | |
|     sync only compares the number of messages in a folder on the IMAP
 | |
|     side (it will detect flag changes on the Maildir side of things
 | |
|     though). A quick sync on my smallish account will take 7 seconds
 | |
|     rather than 40 seconds. Eg, I run a cron script that does a regular
 | |
|     sync once a day, and does quick syncs (-q) only synchronizing the
 | |
|     "-f INBOX" in between.
 | |
| 
 | |
|  5) Turn off fsync. In the [general] section you can set fsync to True
 | |
|     or False. If you want to play 110% safe and wait for all operations
 | |
|     to hit the disk before continueing, you can set this to True. If you
 | |
|     set it to False, you lose some of that safety, trading it for speed.
 | |
| 
 | |
| 
 | |
| Upgrading from plain text cache to SQLITE based cache
 | |
| =====================================================
 | |
| 
 | |
| OfflineImap uses a cache to store the last know status of mails (flags etc). Historically that has meant plain text files, but recently we introduced sqlite-based cache, which helps with performance and CPU usage on large folders. Here is how to upgrade existing plain text cache installations to sqlite based one:
 | |
| 
 | |
|  1) Sync to make sure things are reasonably similar
 | |
|  3) Change the account section to status_backend = sqlite
 | |
|  4) A new sync will convert your plain text cache to an sqlite cache (but
 | |
|  leave the old plain text cache around for easy reverting)
 | |
|     This should be quick and not involve any mail up/downloading.
 | |
|  5) See if it works :-)
 | |
|  6a) If it does not work, go back to the old version or set
 | |
|      status_backend=plain
 | |
|  6b) Or once you are sure it works, you can delete the
 | |
|  .offlineimap/Account-foo/LocalStatus folder (the new cache will be in
 | |
|  the LocalStatus-sqlite folder)
 | |
| 
 | |
| 
 | |
| Security and SSL
 | |
| ================
 | |
| 
 | |
| Some words on OfflineImap and its use of SSL/TLS. By default, we will
 | |
| connect using any method that openssl supports, that is SSLv2, SSLv3, or
 | |
| TLSv1. Do note that SSLv2 is notoriously insecure and deprecated.
 | |
| Unfortunately, python2 does not offer easy ways to disable SSLv2. It is
 | |
| recommended you test your setup and make sure that the mail server does
 | |
| not use an SSLv2 connection. Use e.g. "openssl s_client -host
 | |
| mail.server -port 443" to find out the connection that is used by
 | |
| default.
 | |
| 
 | |
| Certificate checking
 | |
| --------------------
 | |
| 
 | |
| Unfortunately, by default we will not verify the certificate of an IMAP
 | |
| TLS/SSL server we connect to, so connecting by SSL is no guarantee
 | |
| against man-in-the-middle attacks. While verifying a server certificate
 | |
| fingerprint is being planned, it is not implemented yet. There is
 | |
| currently only one safe way to ensure that you connect to the correct
 | |
| server in an encrypted manner: You can specify a 'sslcacertfile' setting
 | |
| in your repository section of offlineimap.conf pointing to a file that
 | |
| contains (among others) a CA Certificate in PEM format which validating
 | |
| your server certificate. In this case, we will check that: 1) The server
 | |
| SSL certificate is validated by the CA Certificate 2) The server host
 | |
| name matches the SSL certificate 3) The server certificate is not past
 | |
| its expiration date. The FAQ contains an entry on how to create your own
 | |
| certificate and CA certificate.
 | |
| 
 | |
| StartTLS
 | |
| --------
 | |
| 
 | |
| If you have not configured your account to connect via SSL anyway,
 | |
| OfflineImap will still attempt to set up an SSL connection via the
 | |
| STARTTLS function, in case the imap server supports it. Do note, that
 | |
| there is no certificate or fingerprint checking involved at all, when
 | |
| using STARTTLS (the underlying imaplib library does not support this
 | |
| yet). This means that you will be protected against passively listening
 | |
| eavesdroppers and they will not be able to see your password or email
 | |
| contents. However, this will not protect you from active attacks, such
 | |
| as Man-In-The-Middle attacks which cause you to connect to the wrong
 | |
| server and pretend to be your mail server. DO NOT RELY ON STARTTLS AS A
 | |
| SAFE CONNECTION GUARANTEEING THE AUTHENTICITY OF YOUR IMAP SERVER!
 | |
| 
 | |
| UNIX Signals
 | |
| ============
 | |
| 
 | |
| OfflineImap listens to the unix signals SIGUSR1 and SIGUSR2.
 | |
| 
 | |
| If sent a SIGUSR1 it will abort any current (or next future) sleep of all
 | |
| accounts that are configured to "autorefresh". In effect, this will trigger a
 | |
| full sync of all accounts to be performed as soon as possible.
 | |
| 
 | |
| If sent a SIGUSR2, it will stop "autorefresh mode" for all accounts. That is,
 | |
| accounts will abort any current sleep and will exit after a currently running
 | |
| synchronization has finished. This signal can be used to gracefully exit out of
 | |
| a running offlineimap "daemon".
 | |
| 
 | |
| Folder filtering and Name translation
 | |
| =====================================
 | |
| 
 | |
| OfflineImap provides advanced and potentially complex possibilities for
 | |
| filtering and translating folder names. If you don't need this, you can
 | |
| safely skip this section.
 | |
| 
 | |
| folderfilter
 | |
| ------------
 | |
| 
 | |
| If you do not want to synchronize all your filters, you can specify a folderfilter function that determines which folders to include in a sync and which to exclude. Typically, you would set a folderfilter option on the remote repository only, and it would be a lambda or any other python function.
 | |
| 
 | |
| If the filter function returns True, the folder will be synced, if it
 | |
| returns False, it. The folderfilter operates on the *UNTRANSLATED* name
 | |
| (before any nametrans translation takes place).
 | |
| 
 | |
| Example 1: synchronizing only INBOX and Sent::
 | |
| 
 | |
|    folderfilter = lambda foldername: foldername in ['INBOX', 'Sent']
 | |
| 
 | |
| Example 2: synchronizing everything except Trash::
 | |
| 
 | |
|    folderfilter = lambda foldername: foldername not in ['Trash']
 | |
| 
 | |
| Example 3: Using a regular expression to exclude Trash and all folders
 | |
| containing the characters "Del"::
 | |
| 
 | |
|     folderfilter = lambda foldername: not re.search('(^Trash$|Del)', foldername)
 | |
| 
 | |
| If folderfilter is not specified, ALL remote folders will be
 | |
| synchronized.
 | |
| 
 | |
| You can span multiple lines by indenting the others.  (Use backslashes
 | |
| at the end when required by Python syntax)  For instance::
 | |
| 
 | |
|  folderfilter = lambda foldername: foldername in
 | |
|         ['INBOX', 'Sent Mail', 'Deleted Items',
 | |
|          'Received']
 | |
| 
 | |
| You only need a folderfilter option on the local repository if you want to prevent some folders on the local repository to be created on the remote one.
 | |
| 
 | |
| Even if you filtered out folders, You can specify folderincludes to
 | |
| include additional folders.  It should return a Python list.  This might
 | |
| be used to include a folder that was excluded by your folderfilter rule,
 | |
| to include a folder that your server does not specify with its LIST
 | |
| option, or to include a folder that is outside your basic reference. The
 | |
| 'reference' value will not be prefixed to this folder name, even if you
 | |
| have specified one.  For example::
 | |
| 
 | |
|    folderincludes = ['debian.user', 'debian.personal']
 | |
| 
 | |
| nametrans
 | |
| ----------
 | |
| 
 | |
| Sometimes, folders need to have different names on the remote and the
 | |
| local repositories. To achieve this you can specify a folder name
 | |
| translator.  This must be a eval-able Python expression that takes a
 | |
| foldername arg and returns the new value.  I suggest a lambda.  This
 | |
| example below will remove "INBOX." from the leading edge of folders
 | |
| (great for Courier IMAP users)::
 | |
| 
 | |
|    nametrans = lambda foldername: re.sub('^INBOX\.', '', foldername)
 | |
| 
 | |
| Using Courier remotely and want to duplicate its mailbox naming
 | |
| locally?  Try this::
 | |
| 
 | |
|    nametrans = lambda foldername: re.sub('^INBOX\.*', '.', foldername)
 | |
| 
 | |
| 
 | |
| WARNING: you MUST construct nametrans rules such that it NEVER returns
 | |
| the same value for two folders, UNLESS the second values are
 | |
| filtered out by folderfilter below. That is, two filters on one side may never point to the same folder on the other side. Failure to follow this rule
 | |
| will result in undefined behavior. See also *Sharing a maildir with multiple IMAP servers* in the `PITFALLS & ISSUES`_ section.
 | |
| 
 | |
| Where to put nametrans rules, on the remote and/or local repository?
 | |
| ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 | |
| 
 | |
| If you never intend to create new folders on the LOCAL repository that
 | |
| need to be synced to the REMOTE repository, it is sufficient to create a
 | |
| nametrans rule on the remote Repository section. This will be used to
 | |
| determine the names of new folder names on the LOCAL repository, and to
 | |
| match existing folders that correspond.
 | |
| 
 | |
| *IF* you create folders on the local repository, that are supposed to be
 | |
|  automatically created on the remote repository, you will need to create
 | |
|  a nametrans rule that provides the reverse name translation.
 | |
| 
 | |
| (A nametrans rule provides only a one-way translation of names and in
 | |
| order to know which names folders on the LOCAL side would have on the
 | |
| REMOTE side, you need to specify the reverse nametrans rule on the local
 | |
| repository)
 | |
| 
 | |
| OfflineImap will complain if it needs to create a new folder on the
 | |
| remote side and a back-and-forth nametrans-lation does not yield the
 | |
| original foldername (as that could potentially lead to infinite folder
 | |
| creation cycles).
 | |
| 
 | |
| What folder separators do I need to use in nametrans rules?
 | |
| +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 | |
| 
 | |
| **Q:** If I sync from an IMAP server with folder separator '/' to a
 | |
|   Maildir using the default folder separator '.' which do I need to use
 | |
|   in nametrans rules?::
 | |
| 
 | |
|   nametrans = lambda f: "INBOX/" + f
 | |
| or::
 | |
|   nametrans = lambda f: "INBOX." + f
 | |
| 
 | |
| **A:** Generally use the folder separator as defined in the repository
 | |
|   you write the nametrans rule for. That is, use '/' in the above
 | |
|   case. We will pass in the untranslated name of the IMAP folder as
 | |
|   parameter (here `f`). The translated name will ultimately have all
 | |
|   folder separators be replaced with the destination repositories'
 | |
|   folder separator.
 | |
| 
 | |
| So if 'f' was "Sent", the first nametrans yields the translated name
 | |
| "INBOX/Sent" to be used on the other side. As that repository uses the
 | |
| folder separator '.' rather than '/', the ultimate name to be used will
 | |
| be "INBOX.Sent".
 | |
| 
 | |
| (As a final note, the smart will see that both variants of the above
 | |
| nametrans rule would have worked identically in this case)
 | |
| 
 | |
| KNOWN BUGS
 | |
| ==========
 | |
| 
 | |
| * SSL3 write pending:
 | |
|     users enabling SSL may hit a bug about "SSL3 write pending". If so, the
 | |
|     account(s) will stay unsynchronised from the time the bug appeared. Running
 | |
|     OfflineIMAP again can help. We are still working on this bug.  Patches or
 | |
|     detailed bug reports would be appreciated. Please check you're running the
 | |
|     last stable version and send us a report to the mailing list including the
 | |
|     full log.
 | |
| 
 | |
| * IDLE support is incomplete and experimental.  Bugs may be encountered.
 | |
| 
 | |
|   * No hook exists for "run after an IDLE response".  Email will
 | |
|     show up, but may not be processed until the next refresh cycle.
 | |
| 
 | |
|   * nametrans may not be supported correctly.
 | |
| 
 | |
|   * IMAP IDLE <-> IMAP IDLE doesn't work yet.
 | |
| 
 | |
|   * IDLE may only work "once" per refresh.  If you encounter this bug,
 | |
|     please send a report to the list!
 | |
| 
 | |
| * Maildir support in Windows drive
 | |
|     Maildir uses colon caracter (:) in message file names. Colon is however
 | |
|     forbidden character in windows drives. There are several workarounds for
 | |
|     that situation:
 | |
| 
 | |
|    * Use "maildir-windows-compatible = yes" account OfflineIMAP configuration.
 | |
|       - That makes OfflineIMAP to use exclamation mark (!) instead of colon for
 | |
|         storing messages. Such files can be written to windows partitions. But
 | |
|         you will probably loose compatibility with other programs trying to
 | |
|         read the same Maildir.
 | |
|       - Exclamation mark was chosen because of the note in
 | |
|         http://docs.python.org/library/mailbox.html
 | |
|       - If you have some messages already stored without this option, you will
 | |
|         have to re-sync them again
 | |
| 
 | |
|    * Enable file name character translation in windows registry (not tested)
 | |
|       - http://support.microsoft.com/kb/289627
 | |
| 
 | |
|    * Use cygwin managed mount (not tested)
 | |
|       - not available anymore since cygwin 1.7
 | |
| 
 | |
| 
 | |
| PITFALLS & ISSUES
 | |
| =================
 | |
| 
 | |
| Sharing a maildir with multiple IMAP servers
 | |
| --------------------------------------------
 | |
| 
 | |
|  Generally a word of caution mixing IMAP repositories on the same
 | |
|  Maildir root. You have to be careful that you *never* use the same
 | |
|  maildir folder for 2 IMAP servers. In the best case, the folder MD5
 | |
|  will be different, and you will get a loop where it will upload your
 | |
|  mails to both servers in turn (infinitely!) as it thinks you have
 | |
|  placed new mails in the local Maildir. In the worst case, the MD5 is
 | |
|  the same (likely) and mail UIDs overlap (likely too!) and it will fail to
 | |
|  sync some mails as it thinks they are already existent.
 | |
| 
 | |
|  I would create a new local Maildir Repository for the Personal Gmail and
 | |
|  use a different root to be on the safe side here. You could e.g. use
 | |
|  `~/mail/Pro` as Maildir root for the ProGmail and
 | |
|  `~/mail/Personal` as root for the personal one.
 | |
| 
 | |
|  If you then point your local mutt, or whatever MUA you use to `~/mail/`
 | |
|  as root, it should still recognize all folders. (see the 2 IMAP setup
 | |
|  in the `Use Cases`_ section.
 | |
| 
 | |
| USE CASES
 | |
| =========
 | |
| 
 | |
| Sync from GMail to another IMAP server
 | |
| --------------------------------------
 | |
| 
 | |
| This is an example of a setup where "TheOtherImap" requires all folders to be under INBOX::
 | |
| 
 | |
|     [Repository Gmailserver-foo]
 | |
|     #This is the remote repository
 | |
|     type = Gmail
 | |
|     remotepass = XXX
 | |
|     remoteuser = XXX
 | |
|     # The below will put all GMAIL folders as sub-folders of the 'local' INBOX,
 | |
|     # assuming that your path separator on 'local' is a dot.
 | |
|     nametrans = lambda x: 'INBOX.' + x
 | |
|     
 | |
|     [Repository TheOtherImap]
 | |
|     #This is the 'local' repository
 | |
|     type = IMAP
 | |
|     remotehost = XXX
 | |
|     remotepass = XXX
 | |
|     remoteuser = XXX
 | |
|     #Do not use nametrans here.
 | |
| 
 | |
| Selecting only a few folders to sync
 | |
| ------------------------------------
 | |
| Add this to the remote gmail repository section to only sync mails which are in a certain folder::
 | |
| 
 | |
|     folderfilter = lambda folder: folder.startswith('MyLabel')
 | |
| 
 | |
| To only get the All Mail folder from a Gmail account, you would e.g. do::
 | |
| 
 | |
|     folderfilter = lambda folder: folder.startswith('[Gmail]/All Mail') 
 | |
| 
 | |
| 
 | |
| Another nametrans transpose example
 | |
| -----------------------------------
 | |
| 
 | |
| Put everything in a GMX. subfolder except for the boxes INBOX, Draft,
 | |
| and Sent which should keep the same name::
 | |
| 
 | |
|      nametrans: lambda folder: folder if folder in ['INBOX', 'Drafts', 'Sent'] \
 | |
|                                else re.sub(r'^', r'GMX.', folder)
 | |
| 
 | |
| 2 IMAP using name translations
 | |
| ------------------------------
 | |
| 
 | |
| Synchronizing 2 IMAP accounts to local Maildirs that are "next to each
 | |
| other", so that mutt can work on both. Full email setup described by
 | |
| Thomas Kahle at `http://dev.gentoo.org/~tomka/mail.html`_
 | |
| 
 | |
| offlineimap.conf::
 | |
| 
 | |
|     [general]
 | |
|     accounts = acc1, acc2
 | |
|     maxsyncaccounts = 2
 | |
|     ui = ttyui
 | |
|     pythonfile=~/bin/offlineimap-helpers.py
 | |
|     socktimeout = 90
 | |
|     
 | |
|     [Account acc1]
 | |
|     localrepository = acc1local
 | |
|     remoterepository = acc1remote
 | |
|     autorefresh = 2
 | |
|     
 | |
|     [Account acc2]
 | |
|     localrepository = acc2local
 | |
|     remoterepository = acc2remote
 | |
|     autorefresh = 4
 | |
|     
 | |
|     [Repository acc1local]
 | |
|     type = Maildir
 | |
|     localfolders = ~/Mail/acc1
 | |
|     
 | |
|     [Repository acc2local]
 | |
|     type = Maildir
 | |
|     localfolders = ~/Mail/acc2
 | |
|     
 | |
|     [Repository acc1remote]
 | |
|     type = IMAP
 | |
|     remotehost = imap.acc1.com
 | |
|     remoteusereval = get_username("imap.acc1.net")
 | |
|     remotepasseval = get_password("imap.acc1.net")
 | |
|     nametrans = oimaptransfolder_acc1
 | |
|     ssl = yes
 | |
|     maxconnections = 2
 | |
|     # Folders to get:
 | |
|     folderfilter = lambda foldername: foldername in [
 | |
|                  'INBOX', 'Drafts', 'Sent', 'archiv']
 | |
|     
 | |
|     [Repository acc2remote]
 | |
|     type = IMAP
 | |
|     remotehost = imap.acc2.net
 | |
|     remoteusereval = get_username("imap.acc2.net")
 | |
|     remotepasseval = get_password("imap.acc2.net")
 | |
|     nametrans = oimaptransfolder_acc2
 | |
|     ssl = yes
 | |
|     maxconnections = 2
 | |
| 
 | |
| One of the coolest things about offlineimap is that you can call
 | |
| arbitrary python code from your configuration.  To do this, specify a
 | |
| pythonfile with::
 | |
| 
 | |
|     pythonfile=~/bin/offlineimap-helpers.py
 | |
| 
 | |
| Your pythonfile needs to contain implementations for the functions
 | |
| that you want to use in offflineimaprc.  The example uses it for two
 | |
| purposes: Fetching passwords from the gnome-keyring and translating
 | |
| folder names on the server to local foldernames.  An example
 | |
| implementation of get_username and get_password showing how to query
 | |
| gnome-keyring is contained in
 | |
| `http://dev.gentoo.org/~tomka/mail-setup.tar.bz2`_ The folderfilter is
 | |
| a lambda term that, well, filters which folders to get. The function
 | |
| `oimaptransfolder_acc2` translates remote folders into local folders
 | |
| with a very simple logic. The `INBOX` folder will have the same name
 | |
| as the account while any other folder will have the account name and a
 | |
| dot as a prefix. This is useful for hierarchichal display in mutt.
 | |
| Offlineimap handles the renaming correctly in both directions::
 | |
| 
 | |
|     import re
 | |
|     def oimaptransfolder_acc1(foldername):
 | |
|         if(foldername == "INBOX"):
 | |
|             retval = "acc1"
 | |
|         else:
 | |
|             retval = "acc1." + foldername
 | |
|         retval = re.sub("/", ".", retval)
 | |
|         return retval
 | |
|     
 | |
|     def oimaptransfolder_acc2(foldername):
 | |
|         if(foldername == "INBOX"):
 | |
|             retval = "acc2"
 | |
|         else:
 | |
|             retval = "acc2." + foldername
 | |
|         retval = re.sub("/", ".", retval)
 | |
|         return retval
 |