% Multi-remote setup for InterIMAP
% [Guilhem Moulin](mailto:guilhem@fripost.org)

This document describes the setup of InterIMAP against two remotes
accounts, a *personal* account at `imap.example.net`, and a *work*
account at `imap.example.com`.  (The same setup can be adapted to remote
accounts or more.)  These remotes accounts are to be synchronized
locally, each being mirrored to its own local namespace in a
bidirectional fashion.

We assume familiarity with the [Getting Started] tutorial.
Prerequisites, such as installing dependencies, creating directories,
etc., won't be repeated here.


Layout
======

For this example we assume the *personal* account has the following
mailbox hierarchy (with delimiter `/`):

    INBOX
    debian
    debian/debian-devel
    debian/debian-project
    debian/debian-security
    archives

And the *work* account the following mailbox hierarchy (with delimiter `.`):

    INBOX
    INBOX.todo
    attic

These remote mailbox hierarchies are to be mirrored locally as:

    INBOX
    perso/INBOX
    perso/debian
    perso/debian/debian-devel
    perso/debian/debian-project
    perso/debian/debian-security
    perso/archives
    work/INBOX
    work/INBOX/todo
    work/attic

Using again (arbitrarily) `/` as local hierarchy delimiter.  (Since 0.5
each server can choose its own hierarchy delimiter independently on the
other ones, and even change it — for instance after changing the server
software — without breaking synchronization.)

Note that there are alternative layouts (one can for instance replace
the prefix `perso/` with the empty string), however for this example
we'll focus on the above layout.


Local Dovecot configuration
===========================

Although it's not required (it's possible to use the default namespace
for everything), we propose to use a dedicated [IMAP namespace][RFC
2342] for each remote account to mirror locally:

 * It provides better isolation of the locally mirrored accounts: one
   can use entirely independent mail storage for instance, and even
   different hierarchy delimiters.
 * One can use `perso/INBOX` as the local `INBOX`.  (Per [RFC 3501] the
   `INBOX` mailbox has a special nature.)  Or even alias a particular
   namespace to the default namespace.  That being said, one should use
   aliases with care as they might have undesired side effects, such as
   `perso/INBOX` missing from `LIST` responses when the mailbox is used
   as the local `INBOX`; or confusion between `perso/work/foo` and
   `work/foo` when `perso/` is aliased to the default namespace.

We define 3 namespaces: a default namespace holding the local `INBOX`,
as well as a dedicated namespace — with a suitable prefix — for each
remote account to mirror locally.  Consult the [Dovecot namespaces]
documentation for more information.  Note that mailboxes (and the
messages they contain) residing in the default namespace won't be copied
over: they will only live on the local instance.

    $ cat >${XDG_CONFIG_HOME:-~/.config}/dovecot/dovecot.conf <<-EOF
		ssl = no
		namespace indbox {
		    mail_driver = maildir
		    mail_path   = ~/Mail
		    inbox       = yes
		    separator   = /
		}
		namespace perso {
		    prefix      = perso/
		    mail_driver = maildir
		    mail_path   = ~/Mail/perso
		    separator   = /
		}
		namespace work {
		    prefix      = work/
		    mail_driver = maildir
		    mail_path   = ~/Mail/work
		    separator   = /
		}
	EOF


We can see the three namespaces using the `` `~/.local/bin/dovecot-imap` ``
wrapper defined in the [Getting Started] tutorial.

    $ ~/.local/bin/dovecot-imap
    S: * PREAUTH [CAPABILITY IMAP4rev1 …] Logged in as myuser
    C: a NAMESPACE
    S: * NAMESPACE (("" "/")("work/" "/")("perso/" "/")) NIL NIL
    S: a OK Namespace completed (0.001 + 0.000 secs).
    C: b LIST "" "*"
    S: * LIST (\Noselect \HasNoChildren) "/" work
    S: * LIST (\Noselect \HasNoChildren) "/" perso
    S: * LIST (\HasNoChildren) "/" INBOX
    S: b OK List completed (0.001 + 0.000 secs).
    C: q LOGOUT
    S: * BYE Logging out
    S: q OK Logout completed (0.001 + 0.000 secs).


InterIMAP configuration
=======================

We use a dedicated [`interimap`(1)] instance for each remote account to
synchronize, starting with the *personal* account.  Again, see the
[Getting Started] guide for details about the configuration file and its
settings.

    $ install -m0600 /dev/null ${XDG_CONFIG_HOME:-~/.config}/interimap/personal
<!-- -->
    $ cat >${XDG_CONFIG_HOME:-~/.config}/interimap/personal <<-EOF
		database = personal.db

		[local]
		type = tunnel
		list-reference = perso/
		command = exec ~/.local/bin/dovecot-imap

		[remote]
		type = imaps
		host = imap.example.net
		username = myname
		password = xxxxxxxx
	EOF
<!-- -->
    $ interimap --config=personal
    Creating new schema in database file …/personal.db
    database: Created mailbox INBOX
    local: Created mailbox perso/INBOX
    […]

And similarly for the *work* account:

    $ install -m0600 /dev/null ${XDG_CONFIG_HOME:-~/.config}/interimap/work
<!-- -->
    $ cat >${XDG_CONFIG_HOME:-~/.config}/interimap/work <<-EOF
		database = work.db

		[local]
		type = tunnel
		list-reference = work/
		command = exec ~/.local/bin/dovecot-imap

		[remote]
		type = imaps
		host = imap.example.com
		username = myname2
		password = xxxxxxxx
	EOF
<!-- -->
    $ interimap --config=work
    Creating new schema in database file …/work.db
    database: Created mailbox INBOX
    local: Created mailbox work/INBOX
    […]

The local mail storage should now have the desired local layout:

    $ ~/.local/bin/dovecot-imap
    S: * PREAUTH [CAPABILITY IMAP4rev1 …] Logged in as myuser
    C: b LIST "" "*"
    S: * LIST (\Noselect \HasChildren) "/" work
    S: * LIST (\HasNoChildren) "/" work/attic
    S: * LIST (\HasChildren) "/" work/INBOX
    S: * LIST (\HasChildren) "/" work/INBOX
    S: * LIST (\HasNoChildren) "/" work/INBOX/todo
    S: * LIST (\Noselect \HasChildren) "/" perso
    S: * LIST (\HasNoChildren) "/" perso/INBOX
    S: * LIST (\HasChildren) "/" perso/debian
    S: * LIST (\HasNoChildren) "/" perso/debian/debian-security
    S: * LIST (\HasNoChildren) "/" perso/debian/debian-project
    S: * LIST (\HasNoChildren) "/" perso/debian/debian-devel
    S: * LIST (\HasNoChildren) "/" perso/archives
    S: * LIST (\HasNoChildren) "/" INBOX
    S: a OK List completed (0.003 + 0.000 + 0.002 secs).
    C: q LOGOUT
    S: * BYE Logging out
    S: q OK Logout completed (0.001 + 0.000 secs).

Template user unit for systemd are provided in order to run these
[`interimap`(1)] instances as services:

    $ systemctl --user enable --now interimap@{personal,work}.service

[Getting Started]: getting-started.html
[RFC 2342]: https://tools.ietf.org/html/rfc2342
[RFC 3501]: https://tools.ietf.org/html/rfc3501
[Dovecot namespaces]: https://doc.dovecot.org/latest/core/config/namespaces.html
[`interimap`(1)]: interimap.1.html
