среда, 14 октября 2009 г.

Синхронизация почты с помощью ImapSync

При замене почтового сервера возникает задача по переносу почты со старого сервера на новый. Если оба сервера работают под Linux, то проблем нет, берем и копируем содержимое /var/spool/mail на новую железку любым доступным способом и вперед. А что делать если, например, нужно переехать с Microsoft Exchange на Exim, или наоборот?



Тут нам вполне способен помочь ImapSync. Как видно из названия эта утилита предназначена для синхронизации почтовых папок по протоколу IMAP.
Для синхронизации одного ящика выполняем:
imapsync --host1 server1 --user1 user1 --password1 password1 --host2 server2 --user2 user2 --password2 password2
Здесь:

  • server1 - сервер с которого забираем почту
  • user1, password1 - учетные данные пользователя на сервере источнике
  • server2 - сервер на который копируем почту
  • user2, password2 - учетные данные пользователя на сервере приемнике
И так пятьдесят раз. Не хочется? Тогда пишем скрипт!
Предполагаем, что учетные данные пользователей на обоих серверах совпадают, скрипт запускается на сервере приемнике, учетные данные лежат в базе MySQL, для написания скрипта используется Perl.

#! /usr/bin/perl
#Параметры MySql
$dbuser = 'user';
$dbpass = 'password';
$db = 'database';
$dbhost = 'localhost';
$domain = 'domain.ru';
#Параметры Exchange
$server = '192.168.0.123';
$domain1 = 'domain.local';

use DBI;
#Создаем SQL запрос
#login - логин пользователя без указания домена (например vova)
#decrypt - пароль почтового ящика в открытом виде
#domain - почтовый домен пользователя (domain.ru)
#status - признак активности пользователя
$query = 'SELECT login, decrypt FROM users WHERE domain=\''.$domain.'\' AND status=\'1\'';
#Подключаемся к базе данных
$dbh = DBI->connect("DBI:mysql:database=$db;host=$dbhost",$dbuser, $dbpass) || die print "Can't connect";
#Выполняем SQL запрос
$sth = $dbh->prepare(qq{$query});
$sth -> execute;
# Выполняем синхронизацию
# делать выборку данных
# пока ничего не останется
while (my ($m_user, $m_pass) = $sth->fetchrow_array())
        {
$user1=$m_user.'@'.$domain1;
$user2=$m_user.'@'.$domain;
       #Сообщаем, над каким ящиком трудимся в данный момент
        print "Syncronize mail for ".$user2."\n";
$r_sync=`imapsync --host1 $server --user1 $user1 --password1 $m_pass --host2 $dbhost --user2 $user2 --password2 $m_pass`;

}
$sth->finish();
$dbh->disconnect();
exit;
Если нужно исключить из синхронизации некоторые папки в почтовом ящике используем ключ --exclude, если не нужны письма старше N дней, добавляем --maxage. Например
$r_sync=`imapsync --host1 $server --user1 $user1 --password1 $m_pass --exclude 'spam' --maxage 10 --host2 $dbhost --user2 $user2 --password2 $m_pass`;
 В этом случае не будут синхронизироваться папки с именем spam и сообщения старше 10 дней.
Имеется еще несколько замечательных ключиков, подробнее смотрим
perldoc imapsync

Комментариев нет:

Отправить комментарий