Страница 1 из 1

Скрипт для imapsync

Добавлено: 29 май 2012, 12:31
Raven
Понадобилось мне перенести мейлдиры пользователей 1 почтаря на другой. Надергал из базы список пользователей, собирался натравить на него tar, но после того как сделал

Код: Выделить всё

# cat mb.list | wc -l
я честно охренел - записей было > 3000 и во всех мейлдирах естессно лежат мелкиме файлы!!! В довесок к этому на старом почтаре крутился Courier а на новом Dovecot2 и для преобразования индексов maildir'а мне предстояло проделать это. Нарисовался повод почесать репу... Чес репо дал свои результаты - /usr/ports/mail/imapsync.

Почитав немного доков я убедился что это как раз мой случай - засинкать содержимое мейлдир посредством синхронизации imap-серверов. Но вот вводить каждый раз имя пользователя и пароли мне как-то не сильно улыбалось. В итоге удалось нагуглить замечательный скрипт синхронизирующий 2 сервера посредством логинов и паролей изьятых из базы данных (у меня пароли хранятся в plaintext'е, так что с декриптом париться тоже не пришлось). Вот сие творение чьего-то гения:

Код: Выделить всё

#! /usr/bin/perl
# Параметры подключения к БД
 $dbuser = 'mail';
 $dbpass = 'mail_user_password';
 $db = 'mail';
 $dbhost = 'localhost';

 $domain = 'domain1.tld';
 $server = 'mail.domain1.tld';
 $server1 = 'mail.domain2.tld';
 $domain1 = 'domain2.tld'; # Можно оставить domain1.tld, в этом случае в обоих серверах будут синхронизироваться папки пользователей одного домена - полезно например при переезде на новый сервер

 use DBI;
 $query = 'SELECT name, password FROM mailbox WHERE domain=\''.$domain.'\''; # Подгоняем запрос под свою таблицу с пользователями

 $dbh = DBI->connect("DBI:Pg:database=$db;host=$dbhost",$dbuser, $dbpass) || die print "Can't connect"; # "DBI:Pg" как наверное уже стало всем понятно используется при подключении к Postgresql. Для MySQL следует использовать "DBI:mysql" 

 $sth = $dbh->prepare(qq{$query});
 $sth -> execute;

 while (my ($m_user, $m_pass) = $sth->fetchrow_array())
         {
 $user1=$m_user.'@'.$domain;
 $user2=$m_user.'@'.$domain1;
         print "Syncronize mail for ".$user2."\n";
 $r_sync=`imapsync --host1 $server --user1 $user1 --password1 $m_pass --host2 $server1 --user2 $user2 --password2 $m_pass`;

 }
 $sth->finish();
 $dbh->disconnect();
 exit;
Ставим все необходимое:

Код: Выделить всё

# make -C /usr/ports/mail/imapsync install clean
...
# make -C /usr/ports/databases/p5-Class-DBI-Pg install clean
Запускаем наш скрипт:

Код: Выделить всё

# ./imaps.sh
И наслаждаемся синхронизацией.

Да, чуть не забыл - поскольку синхронизация происходит по протоколу imap преобразования индексов не потребовалось - dovecot сразу создал свои индексы.