eMail-Postfächer synchronisieren mit imapsync
Einer der wenigen Artikel, die sich nicht um PHP drehen, aber trotzdem sehr interessant sind 😉
So häufig braucht es der Normalanwender nicht, aber wenn man mal seinen Email-Provider wechselt oder eine Kopie aller seiner Mails auf einem anderen Server haben möchte, gibt es nichts einfacheres als das imapsync-Script von Gilles Lamiral.
imapsync ist ein Perl-Script, das unter Linux, Windows und Mac läuft und die Emails zweier IMAP-Konten abgleichen kann. Dabei kopiert es nicht nur die Emails selbst, sondern auch deren Flags und das Interne Datum der Mails. Jede Nachricht wird auch nur einmal kopiert, sodass möglichst wenig Datentransfer stattfindet. Es ist also sowohl für Backupzwecke als auch Migrationszwecke von großem Nutzen, denn es unterstützt eine Vielzahl von verschiedenen IMAP-Servern.
Wenn ich hier alle Optionen aufzählen würde, die das Script unterstützt, würde der Artikel sehr lang werden. Das lassen wir also schön bleiben, nur ein paar Stichworte seien verraten: Es unterstützt SSL, Ordner können übersprungen werden, man kann Quellordner auf andere Zielordner mappen, Mails können nach der Synchronisierung gelöscht werden (dann ist es eher ein Verschieben von Mails statt einer Synchronisierung), Mails die größer als ein Limit sind können übersprungen werden, nur Mails der letzten X Tage können synchronisiert werden usw usw.
Genug Informationen, um es mal auszuprobieren? Dann los:
sudo apt-get install imapsync
Schon ist es installiert und wir können anfangen zu synchronisieren. Erstmal machen wir einen Trockendurchlauf (–dry), es wird also nur simuliert:
imapsync --dry --host1 10.0.0.2 --user1 "mkliewe@mail.de" --password1 "Passwort1" --host2 10.0.0.3 --user2 "backup@mail.de" --password2 "Passwort2"
Die Ausgabe sieht dann beispielsweise so aus:
$RCSfile: imapsync,v $ $Revision: 1.286 $ $Date: 2009/07/24 15:53:04 $ Here is a [linux] system (Linux xxxxx01 2.6.31-14-server #48-Ubuntu SMP Fri Oct 16 15:07:34 UTC 2009 x86_64) with perl 5.10.0 Mail::IMAPClient 3.21 IO::Socket 1.30_01 IO::Socket::SSL Digest::MD5 2.36_01 Digest::HMAC_MD5 Term::ReadKey Date::Manip and the module Mail::IMAPClient version used here is 3.21 Command line used: /usr/bin/imapsync --dry --host1 10.0.0.2 --user1 mkliewe@mail.de --password1 MASKED --host2 10.0.0.3 --user2 backup@mail.de --password2 MASKED Turned ON syncinternaldates, will set the internal dates (arrival dates) on host2 same as host1. TimeZone:[europe/berlin] Will try to use CRAM-MD5 authentication on host1 Will try to use CRAM-MD5 authentication on host2 From imap server [10.0.0.2] port [143] user [mkliewe@mail.de] To imap server [10.0.0.3] port [143] user [backup@mail.de] Banner: * OK mail.de Dovecot ready. Host 10.0.0.2 says it has CAPABILITY for AUTHENTICATE CRAM-MD5 Success login on [10.0.0.2] with user [mkliewe@mail.de] auth [CRAM-MD5] Banner: * OK mail.de Dovecot ready. Host 10.0.0.3 says it has CAPABILITY for AUTHENTICATE CRAM-MD5 Success login on [10.0.0.3] with user [backup@mail.de] auth [CRAM-MD5] host1: state Authenticated host2: state Authenticated From separator and prefix: [.][] To separator and prefix: [.][] ++++ Calculating sizes ++++ From Folder [INBOX] Size: 37258 Messages: 3 From Folder [Test2] Size: 0 Messages: 0 From Folder [Trash] Size: 0 Messages: 0 Total size: 37258 Total messages: 3 Time: 0 s ++++ Calculating sizes ++++ To Folder [INBOX] Size: 0 Messages: 0 To Folder [Test2] does not exist yet To Folder [Trash] does not exist yet Total size: 0 Total messages: 0 Time: 0 s ++++ Listing folders ++++ From folders list: [INBOX] [Test2] [Trash] To folders list: [INBOX] ++++ Looping on each folder ++++ From Folder [INBOX] To Folder [INBOX] ++++ From [INBOX] Parse 1 ++++ ++++ To [INBOX] Parse 1 ++++ ++++ Verifying [INBOX] -> [INBOX] ++++ + NO msg #1 [jM2q9dB8TAvtUZDi0mNMyQ:30262] in INBOX + Copying msg #1:30262 to folder INBOX flags from: [$notjunk]["21-Dec-2009 15:15:25 +0100"] + NO msg #2 [0RLbKdGjywBv4mLEANRUtg:5553] in INBOX + Copying msg #2:5553 to folder INBOX flags from: [$notjunk]["21-Dec-2009 17:19:02 +0100"] + NO msg #3 [ctDrRzmFgf4W2lUbu/KlBQ:1443] in INBOX + Copying msg #3:1443 to folder INBOX flags from: [$notjunk]["19-Dec-2009 19:34:30 +0100"] Time: 1 s From Folder [Test2] To Folder [Test2] To Folder Test2 does not exist Creating folder [Test2] From Folder [Trash] To Folder [Trash] To Folder Trash does not exist Creating folder [Trash] ++++ End looping on each folder ++++ ++++ Statistics ++++ Time : 1 sec Messages transferred : 0 (could be 3 without dry mode) Messages skipped : 0 Total bytes transferred: 0 Total bytes skipped : 0 Total bytes error : 0 Detected 0 errors
In diesem Fall gibt es also 3 Ordner auf dem Quellserver. Die Ordner „Trash“ und „Test2“ gibt es auf dem Zielserver noch nicht, sie würden also angelegt. Es existieren auch 3 Emails in der INBOX, die synchronisiert werden.
Wenn man den selben Befehl nochmal ohne –dry ausführt, dann wird wirklich synchroniert von host1 nach host2.
Um dann die Synchronisation stündlich zu wiederholen eignet sich ein Cronjob:
sudo crontab -u root -e
mit dem Inhalt
0 * * * 1-5 /usr/local/bin/myimapsync.sh
wobei in der myimapsync.sh natürlich der Befehl stehen sollte, beispielsweise:
#!/bin/bash imapsync --dry --host1 imap.domain.de --user1 "user@domain.de" --password1 "Passwort1" --host2 10.0.0.3 --user2 "backup@domain.de" --password2 "Passwort2" >> /var/log/myimapsync.log
Hier für Administratoren noch ein kleines hilfreichen Script, welches mehrere Konten synchronisiert:
#!/bin/bash inputfile="/etc/imapsyncbatch.conf" host1="imap.domain.de" host2="10.0.0.3" logfile="/var/log/imapsyncbatch.log" if [ ! -f $inputfile ] then { echo "The input file does not exist! Exiting..." >> $logfile exit; } fi date=`date +%X_-_%x` echo "$date IMAPSync started..." >> $logfile tr "," " " <$inputfile | while read u1 p1 u2 p2 do date=`date +%X_-_%x` echo "$date Start Syncing User $u1 to $u2" >> $logfile imapsync $1 --buffersize 8192000 --nosyncacls --syncinternaldates \ --host1 $host1 --user1 "$u1" --password1 "$p1" --ssl1 --port1 993 \ --host2 $host2 --user2 "$u2" --password2 "$p2" --ssl2 --port2 993 \ --noauthmd5 date=`date +%X_-_%x` echo "$date Finished $u1 to $u2" >> $logfile done date=`date +%X_-_%x` echo "$date IMAPSync Finished..." >> $logfile echo "$date ------------------------------------" >> $logfile
wobei in der /etc/imapsyncbatch.conf die Zugangsdaten stehen:
user1@domain.de,Passwort1,user2@domain.de,Passwort2 bernd@domain.de,PasswortBernd,backup@domain.de,PasswortBernd
Falls mehrere Personen Zugriff auf diesen Rechner haben, sollte diese Datei gut geschützt werden (beispielsweise mit „sudo chmod 700 /etc/imapsyncbatch.conf“). Da das Script selbst keinen Root-Zugriff auf den Rechner braucht, kann man es auch mit einem normalen Benutzeraccount starten, dann muß allerdings der Lesezugriff auf die /etc/imapsyncbatch.conf und der Schreibzugriff auf /var/log/imapsyncbatch.log gewährleistet sein.
Toller Tip!!! Die nächste Gelegenheit zum Test kommt mit Sicherheit. Danke!
Fladi
21 Dez 09 at 21:32
[…] eMail-Postfächer synchronisieren mit imapsync | PHP Gangsta – Der … […]
Lieber Chef « Der LOLator
7 Jan 10 at 16:24
Das script ist schlecht, denn es verschluckt den imapsync output. Kene gute Idee, nicht nachmachen!
Bughunter
1 Aug 11 at 02:06
Nicht mehr kostenlos und damit nicht mehr via apt-get install einfach zu haben 🙁
benni
6 Jan 12 at 14:35
@benni: Das stimmt nur halb soweit ich weiß, es gibt nach wie vor gratis Versionen wenn man sie findet, nur wenn man es von der Homepage lädt kostet es Geld.
http://freecode.com/projects/imapsync/announcements/795-imapsync-is-ten-years-old
http://www.linux-france.org/prj/imapsync_list/msg00726.html
Auf meinem Ubuntu 10.10 scheint es noch zu existieren:
$ sudo apt-get update
$ apt-cache search imapsync
imapcopy – IMAP backup, copy and migration tool
imapsync – IMAP synchronization, copy and migration tool
Michael Kliewe
6 Jan 12 at 15:31