Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> почтовые системы —> imapsync

imapsync - перенос почты с одного сервера на другой.

Автор: lissyara.


    Собрал новую мыльницу - exim и dovecot. Всё пучком, но втал вопрос о переносе почты и юзеров со старого сервера на новый. С юзерами решилось просто - на стером была какая-то дикая связка cyrus-imap и exim. Дикость заключалась в том, что для зваедения юзера требовалось руками поправить БД MySQL, зайти в cyradmin (типа WEB-интерфейс) создать директорию, зайти с шелла - завести пользователся при помощи saslpasswd2... Финиш... Конечно, может когда-то всё это и работало по человечески, но мне досталось именно в таком виде, и на понимание принципа работы ушло немало времени и нервов :))) Перенос облегчался наличием БД с нешифрованными паролями. Поэтому был сделан дамп куска базы, в котором были только нужные пользователи, и этот самый дамп размещён во временной таблице. После чего два таких запроса:
INSERT INTO `mailbox`
(`username`, `password`, `name`, `maildir`, `domain`,
`created` ,`modified`, `active`)
SELECT 
LCASE(`alias`), `password`, LCASE(`login`),
LCASE(
	CONCAT(
		SUBSTRING(`alias`, POSITION("@" IN `alias`)+1,
		LENGTH(`alias`)),'/',
		SUBSTRING(`alias`, 1,POSITION("@" IN `alias`)-1),'/'
		)
	),
LCASE(
	SUBSTRING(`alias`,
	POSITION("@" IN `alias`)+1,
	LENGTH(`alias`))
	),
NOW(),NOW(),'1'
FROM `users_old`
WHERE SUBSTRING(
	`alias`, POSITION("@" IN `alias`)+1,LENGTH(`alias`)
	)='domain-name.su';
--
INSERT INTO `alias`
(`address`,`goto`,`domain`,`created`,`modified`,`active`)
SELECT 
LCASE(`username`), LCASE(`username`), `domain`,NOW(),NOW(),'1'
FROM `mailbox` WHERE `domain`='domain-name.su'

Перенесли всех пользователей. Для переноса самой почты, была заюзана программа из портов - imapsync, и скриптик на шелле, такого вида:
#!/bin/sh

# Скрипт миграции пользователей с cyrus-imap на dovecot

# Параметры подключения к MySQL
mysql_host="localhost"
mysql_user="exim"
mysql_passwd="exim"
mysql_db="exim"

# Достаём из БД список пользователей
# исходный хост
src_host="$1"
# куда переносим
dst_host="$2"
# домен который мигруется
user_domain="$3"

# mysql-клиент
mysql="/usr/local/bin/mysql --user=${mysql_user} \
--password=${mysql_passwd} \
--database=${mysql_db} --host=${mysql_host} --batch"
# программа миграции
imapsync="/usr/local/bin/imapsync"
# временный файл
file_tmp="/tmp/user.passwd"

# достаём юзеров и в цикле переносим их почту
case "$4" in
        execute)
                ${mysql} --execute="SELECT * FROM \`mailbox\` \
                WHERE \`domain\`='${user_domain}'" |
                {
                while read user_string
                do
                #echo ${user_string}
                old_username="`echo ${user_string} | awk '{print $3}'`"
                new_username="`echo ${user_string} | awk '{print $1}'`"
                user_passwd="`echo ${user_string} | awk '{print $2}'`"

                # создаём файл с паролем:
                echo ${user_passwd} > ${file_tmp}
                # перетаскиваем почту
                echo "Миграция пользователя ${new_username}"
                ${imapsync} --host1 ${src_host} --user1 ${old_username} \
                --passfile1 ${file_tmp} --host2 ${dst_host} --user2 \
                ${new_username} --passfile2 ${file_tmp}
                # Удаляем файл паролей
                rm -f ${tmp_file}

                done
                }
                ;;
        *)
                echo ""
                echo "Usage: `basename $0` {src_host dst_host domain execute}"
                echo ""
                exit 64
                ;;
esac

Запускаем:
./mail_migration.sh 200.200.200.200 127.0.0.1 domain-name.su execute

И долго-долго ждём :))) На перенос 3Gb почты ушло часов пять-шесть... Скриптик перловый, работает медленно :( В-общем-то не страшно, всё равно делается это не днём.

P.S. Это даже не руководство к действиям, а просто пример, как можно сделать....



размещено: 2006-08-02,
последнее обновление: 2006-08-02,
автор: lissyara


Abigor, 2006-08-02 в 13:09:33

а для pop3 можно еще пример для полноты =)

lissyara, 2006-08-02 в 13:11:56

Шустрые какие :)))
Юзайте IMAP - ибо POP3 это прошлый век :)
========
Когда искал - видел упоминание о том что софт существует, но на этом не зацикливался - я давно pop3 не использую...
www.yandex.ru; www.google.ru - делов-то :)

Abigor, 2006-08-03 в 10:30:20

>Юзайте IMAP - ибо POP3 это прошлый век :)
я то с тобой согласен. а вот как это обьяснить пачке юзверей

Павел, 2012-04-17 в 16:51:35

>Скриптик перловый, работает медленно
Почему скриптик perl'овый - когда он башовый?

freeman_tnu, 2013-04-02 в 23:24:41

Имеется в виду скрипт imapsync

Alejandro, 2016-06-12 в 21:34:02

Прошу прощенья за некропостинг, но:
"# временный файл
file_tmp="/tmp/user.passwd"
...
# создаём файл с паролем:
               echo ${user_passwd} > ${file_tmp}
...
# Удаляем файл паролей
               rm -f ${tmp_file}"

Alessias, 2017-12-19 в 19:41:52

только надо добавить параметр --skip-column-names к mysql
чтоб не пытался перенести почту пользователя local_part  пользователю username

mysql="`which mysql` --skip-column-names --user=${mysql_user} \
--password=${mysql_passwd} \
--database=${mysql_db} --host=${mysql_host}  --batch"

Dmitry, 2018-09-05 в 9:03:23

--nofoldersizes --skipsize --fast и будет работать быстро.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.1719 секунд
Из них PHP: 53%; SQL: 47%; Число SQL-запросов: 77 шт.
Исходный размер: 19156; Сжатая: 5959