Перенос писем из одного ящика в другой

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

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

Тут нам вполне способен помочь ImapSync. Как видно из названия эта утилита предназначена для синхронизации почтовых папок по протоколу IMAP.

Устанавливаем:
yum install imapsync
Для синхронизации одного ящика выполняем:
imapsync —host1 server1 —user1 user1 —password1 password1 —host2 server2 —user2 user2 —password2password2
 
Здесь:

  • 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

 
Запись опубликована в рубрике mail, Postfix. Добавьте в закладки постоянную ссылку.

Один ответ на “Перенос писем из одного ящика в другой

  1. kakhdgakjdsbglksjdbglskdjfbvlkdsvbdlksjfbg говорит:

    А если использовать самый простой браузер, а в нем есть такой сайт… эх… как же его… ах ну да! Mail.ru или даже yaandex.ru
    корпоративную почту тоже можно к ним привязать!

Добавить комментарий