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 for each remote account to mirror locally:

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 {
	    location  = maildir:~/Mail
	    inbox     = yes
	    separator = /
	}
	namespace perso {
	    prefix    = perso/
	    location  = maildir:~/Mail/perso
	    separator = /
	}
	namespace work {
	    prefix    = work/
	    location  = maildir:~/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