Перенос писем с zimbra на mailcow

Тут собраны разные репепты для сисадминских дел, доступные всем без регистрации
Ответить
kasak
Администратор
Сообщения: 10
Зарегистрирован: 14 янв 2026, 18:28

Перенос писем с zimbra на mailcow

Сообщение kasak »

Данная статья является продолжением статьи про Перенос учёток с zimbra на mailcow

Теперь, когда все учётки перенесены, можно начинать синхронизировать ящики. Но само собой разумеется если ящиков много, паролей мы не знаем. Поэтому, нужно сделать финт ушами а именно:
  1. Создать задачу на синхронизацию с одинаковым паролем на стороне зимбры
  2. Заменить сервер зимбра на сервер mailcow (заменой айпишников или доменного имени)
  3. Заменить все пароли на зимбре на один, но известный.
Вот так по пунктам и пойдём.
Создаём задачи синхронизации:
Само собой если ящиков штук 100 и больше, создавать задачи на синхронизацию руками это с ума сойдёшь.
Поэтому надо воспользоваться mailcow api и баш скриптингом.
В админке mailcow найдите пункт api и сгенерируйте ключ. Сохраните этот ключ в файл mailcowapi.
Так же нам понадобится файл emails.txt который мы получили в прошлой статье. В этом файле уберите все лишние емейлы, которые не надо синхронизировать.

И вот нужный скрипт:

Код: Выделить всё

#!/usr/bin/env bash

set -euo pipefail

MAILCOW_URL="https://cow.domain.ru"
API_KEY="$(< mailcowapi)"

SOURCE_HOST="zimbra.domain.ru"
SOURCE_PORT="993"
SOURCE_PASSWORD="123"

while IFS= read -r EMAIL; do
    [[ -z "$EMAIL" ]] && continue

    echo "Creating sync job for $EMAIL"

    RESPONSE=$(
        curl -s -k \
            -X POST \
            "${MAILCOW_URL}/api/v1/add/syncjob" \
            -H "X-API-Key: ${API_KEY}" \
            -H "Content-Type: application/json" \
            -d "{
                \"username\":\"${EMAIL}\",
                \"host1\":\"${SOURCE_HOST}\",
                \"port1\":\"${SOURCE_PORT}\",
                \"user1\":\"${EMAIL}\",
                \"password1\":\"${SOURCE_PASSWORD}\",
                \"enc1\":\"SSL\",
                \"mins_interval\":\"20\",
                \"maxage\":\"0\",
                \"exclude\":\"(?i)spam|(?i)junk\",
                \"maxbytespersecond\":\"0\",
                \"delete2duplicates\":\"1\",
                \"delete1\":\"0\",
                \"automap\":\"1\",
                \"subscribeall\": \"1\"
                \"skipcrossduplicates\":\"0\",
                \"custom_params\":\"\",
                \"active\":\"1\"
            }"
    )

    echo "$RESPONSE"
done < emails.txt
Этот скрипт создаст в mailcow sync job для каждого ящика обозначенного в emails.txt, который будет забирать почту с сервера zimbra.domain.ru , с паролем 123. и класть его в соответствующий ящик в mailcow. При этом знать пароль ящика в mailcow не нужно.

Внимание!
Перед тем как запустите реальную синхронизацию, настоятельно рекомендую поправить конфиг dovecot fts в mailcow, особенно рекомендую поправить в mailcow.conf количество памяти, которое разрешено будет жрать индексатору. По-умолчанию установлено 128 Мегабайт, я рекомендую как минимум 512 а лучше и 1024.

Переключаем местами серверы zimbra и mailcow
Я не могу тут ничего комментировать, поскольку конфиг у всех разный. Однако, чтобы синхронизация ящиков началась, все пароли на зимбре придётся сбросить. Кроме того, нам нужно чтобы почта приходила уже на новый сервер, чтобы не приходилось циклично синхронизировать почту, которая будет прилетать пока синхронизация будет идти. Так что нам нужно запустить новый сервер и временно оставить юзеров без почты. По скорости могу сказать так, на не очень хороших серверах 2 Тб почты синхронизировались 3 суток.
Поэтому теперь вы должны активировать новый сервер и убедится что почта ходит именно на него и отправляется с него. Как именно устроена ваша сеть и как вы это сделаете решать вам.
Я просто убрал внешний ip адрес и оставил зимбру только на локальном ip адресе.

Заменяем все пароли в зимбре
Теперь когда вы готовы, нам опять потребуется файл emails.txt
Кстати, если у вас рядом находятся сотрудники, которые могут ввести свой пароль, пригласите их чтобы они в sync job просто ввели свой текущий пароль, и исключите их из emails.txt. Я именно так и поступил, запустил синхронизацию в первую очередь тех ящиков, которые очень большие.

Далее, в зависимости от того как вы перенесли зимбру у вас может возникнуть проблема с заменой паролей.
Нам нужно обеспечить работу ldap. если ldap висел на внешнем адресе, нужно либо в /etc/hosts заменить внешний адрес на внутренний, либо в localconfig зимбры заменить ldap bind url вот таким образом:

Код: Выделить всё

zmlocalconfig -e ldap_bind_url=ldap://localzimbra.domain.ru:389
После чего нужно перезапустить зимбру или весь сервер зимбры.
Действуйте в соответствии с вашей конфигурацией.

И вот такой скрипт, который мы запускаем от root, после того как вы поправите конфигурацию ldap:

Код: Выделить всё

#!/usr/bin/env bash

MAILBOX_LIST="emails.txt"
NEWPASS="123"

while IFS= read -r account; do
    [ -z "$account" ] && continue

    echo "Changing password for $account"
    su - zimbra -c "zmprov sp '$account' '$NEWPASS'"
done < "$MAILBOX_LIST"
Если же вы хотите не глядя заменить ВСЕ пароли, можно это сделать и без списка emails.txt

Код: Выделить всё

#!/usr/bin/env bash

NEWPASS="123"

for account in $(zmprov -l gaa); do
    echo "Changing password for $account"
    zmprov sp "$account" "$NEWPASS"
done
Однако этот скрипт нужно скопировать в /opt/zimbra и запускать от пользователя zimbra. Ну либо добавьте везде sudo.

Всё, теперь остаётся только дождаться пока mailcow перетянет себе все письма.
Когда синхронизация закончится, удалите sync jobs иначе mailcow будет пытаться перетянуть старые письма снова и снова, если пользователи захотят почистить старую почту.
Ответить