Миграция postfix, postfixadmin | Postfix

Есть старый почтовик на postfix 2.1.0 с управлением пользователями через postfixadmin. Соответсвенно база пользователей в mysql. Задача – прозрачно перейти на новый почтовик, с сохранением базы пользователей (пароли, алиасы и т.д.). Проблема только в том, что новый postfixadmin (2.3) имеет другую структуру таблиц базы и просто сделать дамп базы и залить на новой машине не получится.

Смотрим структуру таблиц:

Старый postfixadmin (2.1.0):

DROP TABLE IF EXISTS `mailbox`; CREATE TABLE `mailbox` ( `username` varchar(255) NOT NULL default '', `password` varchar(255) NOT NULL default '', `name` varchar(255) NOT NULL default '', `maildir` varchar(255) NOT NULL default '', `quota` int(10) NOT NULL default '0', `domain` varchar(255) NOT NULL default '', `created` datetime NOT NULL default '0000-00-00 00:00:00', `modified` datetime NOT NULL default '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL default '1', `drweb` int(11) default '0', PRIMARY KEY (`username`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Mailboxes';

Новый postfixadmin(2.3.0):

DROP TABLE IF EXISTS `mailbox`; CREATE TABLE `mailbox` ( `username` varchar(255) NOT NULL default '', `password` varchar(255) NOT NULL default '', `name` varchar(255) character set utf8 NOT NULL default '', `maildir` varchar(255) NOT NULL default '', `quota` bigint(20) NOT NULL default '0', `local_part` varchar(255) NOT NULL default '', `domain` varchar(255) NOT NULL default '', `created` datetime NOT NULL default '0000-00-00 00:00:00', `modified` datetime NOT NULL default '0000-00-00 00:00:00', `active` tinyint(1) NOT NULL default '1', PRIMARY KEY (`username`), KEY `domain` (`domain`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Postfix Admin - Virtual Mailboxes';

В таблице со старого сервера нет в таблице `local_part` (части почтового адреса без доменного имени), плюс таблица флага проверки drweb.

Выбираем данные. SUBSTRING_INDEX(username, ‘@’, 1) – выбирает все что справа от собаки (это нам нужно для заполнения поля local_part)

select username, password, name, maildir, quota, SUBSTRING_INDEX(username, '@', 1), domain, created, modified, active from mailbox where username LIKE '%mail.ru' into outfile '/tmp/mail.txt';

Открываем постфиксадмин на новом сервере. Создаем домен который переносим.

Создал файл с нужными данными (см. выше). Загружаем:

load data infile '/home/ungifted/users/mail.txt' into table mailbox;

И видим в постфиксадмине что количество алиасов в домене – величина отрицательная, постфиксадмин алиасы не отображает:

postfix aliases

Как оказалось:

// Postfix Admin добавляет алиас в таблицу алиасов для каждого // создаваемого ящика. Причина такого поведения это обеспечение // возможности использования catch-all (перехват всей почты для домена) // если вы хотите управлять этими алиасами, установите значение // данного параметра в YES $CONF['alias_control'] = 'YES';

Выход – заполнить таблицу алиасов.

Смотрим таблицу алисасов:

use postfix; select * from aliase;
Видим алиасы типа -
<a href="mailto:ivan@mail.ru">ivan@mail.ru</a> <a href="mailto:ivan@mcnet.ru">ivan@mail.ru</a> mail.ru date date 1

Судя по всему те самые алиасы которые создает постфиксадмин.

Создать данные для заполнения алисаов можно легко из существующей таблицы юзеров:

select username, maildir, domain, created, modified, active from mailbox where username LIKE '%mail.ru';

Вывод этого запроса будет заполнен нужными нам данными для заполнения таблицы алиасов.

Собираем эти данные в файл:

select username, maildir, domain, created, modified, active from mailbox where username LIKE '%mail.ru' into outfile '/tmp/alias.txt';

Правим последнее поле если там ноль (ящик был неактивен) – ставим единицу.

И загружаем в таблицу alias:

load data infile '/tmp/alias.txt' into table alias;

Смотрим постфиксадмин – количество алиасов встало на свои места. :)

postfix aliases

Осталось настроить днс записи. И проверить как все работает.