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:
#Diese Dateien müssen nun auf den neuen Postfix-Server an die richtigen Stellen kopiert werden.
# 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
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.
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 .Hier die dovecot Variante:
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
drwx------ 10 vmail vmail 4096 Jan 17 09:06 .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.
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
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 -emptyKurze Erklärung:
./.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
- -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/Hier sieht man schön, dass das alte Postfach mehrere "Gesendet Ordner" hatte, die wir nun schön zusammenfassen.
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/
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/