Если вам предстоит такая задача и сделать это нужно очень аккуратно и без downtim’a, то можно применить такой метод (который взят отсюда ):
1. В MX ничего не менял, вся почта которая приходила на Exim туда и попадала
2. В базе данных Exim( mysql) добавил еще 1 поле ‘migrated’, и всем прописую по умолчанию = 0(тоесть не смигрированые пользователи)
3. В настройках Exim разрешаю relay с ІР адреса Exchange Server 2010. А в настройках Exchange 2010 всю почту шлю на Exim (кроме внутренней, дополнительных настроек не надо, Exchange сам проверяет свои адреса)
4. Добавляю в Exim правило, что если приходит письмо на пользователя в которого статус ‘migrated’=1 пересылать на Exchange, если ‘migrated’=0 правило уже было (так как сервер рабочий :-))) письма складываются на файловую систему
5. Мигрировал в рабочее время, по мере свободного времени.
6. Завожу пользователя в Exchange 2010, выставлял статус ‘migrated’=1 через phpmyadmin.
7. Здесь 1 минус – если добавлять нового пользователя на Exchange , то надо добавлять его имя и в базу Exim( mysql) с статусом ‘migrated’=1.
Плюс такого варианта, что не надо за 1 ночь всех мигрировать.
Особое внимание заслуживают пункты 3 и 4, которые я опишу здесь. Естественно, что здесь я буду описывать только настройку со стороны exim’a
Пункт3
Добавим описание хостов, откуда разрешён relay (возможно такая строка у вас уже есть)
hostlist relay_from_hosts = localhost : 192.168.0.0/24 : 1.1.1.1
где 1.1.1.1 – IP сервера exchange.
Далее следуют ACL’ы, куда собственно мы должны поместить разрешение слать из сервера exchange. Желательно их помещать повыше.
begin acl
acl_check_helo:
...
accept hosts = +relay_from_hosts
...
acl_check_rcpt:
...
accept hosts = +relay_from_hosts
...
Пункт4
Теперь идёт собственно роутинг. Поскольку я использовал vexim, то роутинг приведу именно оттуда. Предварительно я создал в таблице users поле migrated и выставил ему значение согласно договорённостей выше. То есть, это текущий роут, который обслуживает виртуальных юзеров и который у меня уже присутствует и который нужно слегка поправить. Единственное, что я добавил – это выделенную синим строку
begin routers
...
virtual_domains:
driver = redirect
allow_fail
data = ${lookup mysql{select smtp from users,domains \
where localpart = '${quote_mysql:$local_part}' \
and domain = '${quote_mysql:$domain}' \
and domains.enabled = '1' \
and users.enabled = '1' \
and users.migrated = '0' \
...
А теперь собственно роут на сервер exchange, который мы добавляем:
migrated_exchange:
driver = manualroute
transport = remote_smtp
condition = ${lookup mysql{select smtp from users,domains \
where localpart = '${quote_mysql:$local_part}' \
and domain = '${quote_mysql:$domain}' \
and domains.enabled = '1' \
and users.enabled = '1' \
and users.migrated = '1' \
and users.domain_id = domains.domain_id}{yes}{no}}
retry_use_local_part
route_list = "* 1.1.1.1"
Поскольку, exim просматривает роуты до первого совпадения, то вам решать, у кого будет приорите: либо у локального почтового сервера либо у exchange. Что даёт этот приоритет? К примеру, нужно настроить переадресацию почты или сотрудник ушёл в отпуск, поставить автоответ. Так вот, какой роут будет выше, там и нужно настраивать эти вещи (переадресация, автоответ, …). Я поставил добавленный роут migrated_exchange после роута virtual_domains, тем самым приоритетнее у меня остался локальный сервере, а не exchange