Скрипт для imapsync
Добавлено: 29 май 2012, 12:31
Код: Выделить всё
# cat mb.list | wc -l
Почитав немного доков я убедился что это как раз мой случай - засинкать содержимое мейлдир посредством синхронизации 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 сразу создал свои индексы.