Multi-remote setup for InterIMAP
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:
- 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 localINBOX
. (Per RFC 3501 theINBOX
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 asperso/INBOX
missing fromLIST
responses when the mailbox is used as the localINBOX
; or confusion betweenperso/work/foo
andwork/foo
whenperso/
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 {
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