PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Archive for the ‘IMAP Konten’ tag

eMail-Postfächer synchronisieren mit imapsync

with 5 comments

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.

Written by Michael Kliewe

Dezember 21st, 2009 at 7:15 pm