Postfix - wie migriert man die E-Mails aus einem IMAP-Postfach

Administratoren eines Postfix-Servers stehen sehr wahrscheinlich irgendwann vor der Situation, dass die IMAP-Postfächer auf einen neuen Postfix-Server übertragen werden müssen. Klassische Ursachen sind der Ausfall des Postfix-Servers (inkl. Wiederherstellung des Backups), eine komplette Neuinstallation oder das Zusammenlegen von Postfix-Servern. In allen Fällen müssen die E-Mail-Konten inklusive der E-Mails migriert werden.

In diesem Artikel zeigen wir, wie man die E-Mails von einem Postfix- auf den anderen Postfix-Server migriert. Die Benutzerkonten oder Postfächer sind nicht Teil dieses Artikels, da sie in der Regel in einer MySQL-Datenbank abgelegt und separat importiert werden müssen.

E-Mails sind Dateien

Postfix legt alle E-Mails als Textdateien auf der Festplatte ab. Typische Orte sind /var/vmail oder /var/mail/domains/. Dort befinden sich dann die Ordner für Domains und Postfächer, dort wiederum die E-Mails:

#
# Emails legt Postfix als Datei auf der Festplatte ab
#

$ sudo ls -la /var/vmail/pc-erfahrung.de/mschmidt/cur/
-rw-------  1 vmail vmail    2412 Nov  5  2019 1383650063.V803I5c597M676114.xxx:2,RS
-rw-------  1 vmail vmail  948775 Nov 13  2019 1384346867.V803I5cab5M501437.xxx:2,RS
-rw-------  1 vmail vmail  892106 Nov 14  2019 1384447035.V803I5c99dM767478.xxx:2,RS
 Diese Dateien müssen nun auf den neuen Postfix-Server an die richtigen Stellen kopiert werden.

IMAP-Struktur

Wir können den Domain-Ordner nicht einfach kopieren, sondern die einzelnen E-Mails separat. Hintergrund ist, dass die Verzeichnisse der IMAP-Struktur sich unterscheiden können. So gibt es viele Variante für gelöschte E-Mails: "trash", "Papierkorb", "papierkorb", "deleted items", "Gel&APY-schte Objekte" usw. Kopieren wir die Ordner blind, so hat man später mehrere redundante Ordner, wo sich die E-Mails unnötigerweise verteilen.

Postfix IMAP Verzeichnisstruktur

Ein weiterer Grund ist, dass die IMAP-Implementierungen wie dovecot oder courier zusätzliche Informationen ablegen. Diese möchte (und sollte) man nicht mit übertragen.

IMAP setzt grundlegend die Ordner cur, new und tmp voraus. Das gilt für alle Unterordner. Hier zwei Beispiele (courier und dovecot), wie die Ordnerstruktur aussehen kann.

drwxr-xr-x 11 mail mail  4096 Jan 13 03:35 .
drwxr-xr-x  4 mail mail  4096 Mar 24  2011 ..
drwxr-xr-x  6 mail mail  4096 Sep 14 09:45 .Drafts
drwx------  6 mail mail  4096 Feb 21  2014 .Junk
drwxr-xr-x  6 mail mail  4096 Dec  2 15:11 .Sent
drwx------  6 mail mail  4096 Sep 29 13:18 .Sent Items
drwxr-xr-x  6 mail mail  4096 Jan 13 03:35 .Trash
drwxr-xr-x  2 mail mail  4096 Jan 13 03:35 courierimapkeywords
-rw-r--r--  1 mail mail    47 Sep 28 13:11 courierimapsubscribed
-rw-r--r--  1 mail mail 34456 Jan 13 03:35 courierimapuiddb
-rwxr-xr-x  1 mail mail  6445 Nov 23  2013 courierpop3dsizelist
drwxr-xr-x  2 mail mail 65536 Jan 13 03:35 cur
drwxr-xr-x  2 mail mail  4096 Jan 13 03:28 new
drwxr-xr-x  2 mail mail  4096 Jan 13 04:00 tmp
Hier die dovecot Variante:

drwx------ 10 vmail vmail   4096 Jan 17 09:06 .
drwx------  3 vmail vmail   4096 Jan 16 09:51 ..
drwx------  5 vmail vmail   4096 Jan 16 16:24 .Archive
drwx------  5 vmail vmail   4096 Jan 17 08:57 .Deleted Items
drwx------  5 vmail vmail   4096 Jan 16 14:24 .Drafts
drwx------  5 vmail vmail   4096 Jan 16 11:56 .Junk E-mail
drwx------  5 vmail vmail   4096 Jan 17 09:06 .Sent
drwx------  2 vmail vmail  69632 Jan 17 08:55 cur
-rw-------  1 vmail vmail  36691 Jan 17 09:01 dovecot-uidlist
-rw-------  1 vmail vmail      8 Jan 16 11:56 dovecot-uidvalidity
-r--r--r--  1 vmail vmail      0 Jan 16 09:51 dovecot-uidvalidity.5e202420
-rw-------  1 vmail vmail  16520 Jan 17 08:56 dovecot.index
-rw-------  1 vmail vmail 239104 Jan 17 09:01 dovecot.index.cache
-rw-------  1 vmail vmail  26064 Jan 17 09:01 dovecot.index.log
-rw-------  1 vmail vmail    888 Jan 16 12:03 dovecot.list.index
-rw-------  1 vmail vmail   8156 Jan 17 09:06 dovecot.list.index.log
-rw-------  1 vmail vmail    120 Jan 16 11:56 dovecot.mailbox.log
-rw-------  1 vmail vmail      0 Jan 16 09:51 maildirfolder
drwx------  2 vmail vmail   4096 Jan 17 08:51 new
-rw-------  1 vmail vmail     51 Jan 16 11:56 subscriptions
drwx------  2 vmail vmail   4096 Jan 17 08:30 tmp
Wichtig zu wissen ist, dass im Hauptverzeichnis der Ordner "cur" den Posteingang wiederspiegelt. Die hidden folder wie .Drafts, .Sent usw. entsprechen Entwürfe, Gesendet usw.

Anleitung: E-Mails kopieren

Schritt 1: Postfach auf neuem Server

Kommen wir zur eigentlichen Migrationen der E-Mails. Voraussetzung ist, dass die Domain und das Postfach auf dem neuen Mailserver erstellt wurde, damit die Ordner und Verzeichnisse vorhanden sind.

Schritt 2: Wo liegen die Mails

Im Prinzip, brauchen wir nur nach "cur"-Verzeichnissen suchen. Das tun wir mit folgendem Befehl:

$ find . -type d -name "cur" -not -empty
./.Sent/cur
./.Gesendet/cur
./.Junk/cur
./.Gel&APY-schte Objekte/cur
./.Gesendete Objekte/cur
./cur
./.Entw&APw-rfe/cur
./.Papierkorb/cur
./.Drafts/cur
./.Trash/cur
./.Deleted Items/cur
Kurze Erklärung:

  • -type d : suche nur nach Verzeichnissen
  • -name "cur" : Verzeichnis muss cur heißen
  • -not -empty : keine leeren Verzeihnisse

Schritt 3: Mapping (IMAP-Verzeichnisse unterscheiden sich)

Wie oben bereits erwähnt, können die Verzeichnisse unterschiedlich heißen. Gerne existieren auch mehrere Ordner zum gleichem Thema. Hier müssen wir die Quelle mit dem Ziel richtig verknüpfen:

cp --preserve=timestamps ./alt/.Trash/cur/*       /neu/.Deleted Items/cur/
cp --preserve=timestamps ./alt/.Drafts/cur/*      /neu/.Drafts/cur/
cp --preserve=timestamps ./alt/.Junk/cur/*        /neu/.Junk\ E-mail/cur/
cp --preserve=timestamps ./alt/.Sent/cur/*        /neu/.Sent/cur/
cp --preserve=timestamps ./alt/.Sent\ Items/cur/* /neu/.Sent/cur/
cp --preserve=timestamps ./alt/cur/*              /neu/cur/
Hier sieht man schön, dass das alte Postfach mehrere "Gesendet Ordner" hatte, die wir nun schön zusammenfassen.

WICHTIG: beim Kopieren sollte der Parameter --preserve=timestamps gesetzt werden, damit die kopierten Dateien das ursprüngliche Erstelldatum beibehalten. Hierüber wird das Empfangen/Gesendet Datum bei vielen Webmailern gesteuert. Vergisst man dies, sind alle Mails der letzten Jahre am selben Tag verschickt/versendet worden.

Schritt 4: Berechtigungen setzen

Abschließend noch die Berechtigungen setzen und wir sind fertig!

sudo chown -R vmail:vmail /var/vmail/pc-erfahrung.de/mschmidt/