offlineimap erlaubt mehrere Remote-IMAP-Accounts mit einer lokalen Maildir-Verzeichnisstruktur zu synchronisieren. Werden mehrere IMAP-Accounts in ein lokales Maildir synchronisiert, muß man sich überlegen, wie man die Verzeichnisse anlegt. Der folgende Artikel beschreibt ein Setup für posteo.de.
Die lokale Maildir-Struktur (unterhalb von ~/Maildir) sieht dabei folgendermaßen aus :
.posteo .posteo.ablage .posteo.ablage.2020 .posteo.ablage.2021 .posteo.Drafts .posteo.Sent .posteo.Trash .otheraccount .otheraccount.folder
Die Benahmung der Ordner orientiert sich an Maildir++, wie sie von Courier und Dovecot unterstützt wird. Es ist somit möglich, das lokale Maildir selbst wieder über einen IMAP-Server anzubieten. Die Ordner-Struktur eines Account wird jeweils auf einen Unterordner abgebildet (im Beispiel sind alle posteo-Ordner) unterhalb von posteo verfügbar.
Damit dies funktioniert, muß in der offlineimaprc die Option nametrans und folderfilter entsprechend konfiguriert werden:
[general]
pythonfile = ~/.offlineimaprc_pythonfile.py
...
[Account posteo]
localrepository = posteo-local
remoterepository = posteo-remote
...
[Repository posteo-local]
type = Maildir
localfolders = ~/Maildir
sep = .
...
[Repository posteo-remote]
type = IMAP
remotehost = posteo.de
ssl = yes
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
remoteuser = xyz@posteo.de
nametrans = oimaptransfolder_posteo
folderfilter = lambda foldername: foldername in [
'INBOX', 'Drafts', 'Sent',
'ablage.2020', 'ablage.2021'
]
oimaptransfolder_posteo ist eine Python-Funktion, die in der Datei ~/.offlineimaprc_pythonfile.py definiert ist:
def oimaptransfolder_posteo(foldername):
'''Translates posteo folder names to local folder names'''
if foldername == "INBOX":
retval = ".posteo"
else:
retval = ".posteo." + foldername
return retval
Damit wird die Inbox im Ordner .posteo gemappt und alle Unter-Ordner tauchen jeweils auch unterhalb auf.
Posteo benutzt den Punkt . als IMAP-Folderseperator und alle Ordner sind auf der Ebene der INBOX. GMX benutzt beispielsweise / als Folderseperator, die die Konfiguration sieht dann folgendermaßen aus:
def oimaptransfolder_gmx(foldername):
'''Translates GMX IMAP folder names to local folder names'''
if foldername == "INBOX":
retval = ".gmx"
else:
retval = ".gmx." + foldername
retval = re.sub("/", ".", retval)
return retval
mailbox.org hat ebenfalls / als Folderseperator; dort sind aber alle Ordner Unterordner von INBOX, somit muß “INBOX” entfernt werden:
def oimaptransfolder_mailboxorg(foldername):
'''Translates mailbox.org IMAP folder names to local folder names'''
# On mailbox.org server all folders are subfolder of INBOX
retval = re.sub('^INBOX', '.roots', foldername)
retval = re.sub("/", ".", retval)
return retval