Решение двух "НО" найдено, спасибо
dimonchik2013 за подсказку по первому пункту:
по п1 это пробовал?
serverfault.com/questions/598364/imapsync-doesnt-s...
В итоге работающий скрипт
sync_loop_unix.sh выглядит таким образом:
#!/bin/sh
echo Looping on account credentials found in file.txt
echo
{ while IFS=';' read h1 u1 p1 h2 u2 p2 fake
do
{ echo "$h1" | egrep "^#" ; } > /dev/null && continue # this skip commented lines in file.txt
echo "==== Starting imapsync from host1 $h1 user1 $u1 to host2 $h2 user2 $u2 ===="
./imapsync --host1 "$h1" --user1 "$u1" --password1 "$p1" \
--host2 "$h2" --user2 "$u2" --password2 "$p2" \
--ssl1 \
--port1 993 \
--folderfirst INBOX \
--regextrans2 "s/&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-/Sent/" \
--regextrans2 "s/&BBoEPgRABDcEOAQ9BDA-/Trash/" \
--regextrans2 "s/&BCEEPwQwBDw-/Junk/" \
--regextrans2 "s/&BCcENQRABD0EPgQyBDgEOgQ4-/Drafts/" \
--regexflag 's/\\Unseen//g' \
--useheader Message-Id
"$@"
echo "==== Ended imapsync from host1 $h1 user1 $u1 to host2 $h2 user2 $u2 ===="
echo
done
} < file.txt
А теперь разберем все по полочкам:
1. В файле
file.txt находятся данные о почтовых аккаунтах, которые Вы будете синхронизировать, каждая строка это два синхронизируемых между собой почтовых ящика:
host001_1;user001_1;password001_1;host001_2;user001_2;password001_2;
host002_1;user002_1;password002_1;host002_2;user002_2;password002_2;
host003_1;user003_1;password003_1;host003_2;user003_2;password003_2;
Пример:
# вариант с использованием посредника, то есть на другой машине выполняете скрипт
imap.mail.ru;ivanov@blabla.com;P@ssw0rd;imap.newdomain.ru;ivanov@newdomain.ru;P@ssw0rd;
imap.mail.ru;petrov@blabla.com;P@ssw0rd;imap.newdomain.ru;petrov@newdomain.ru;P@ssw0rd;
... и т.д.
# если выполняете скрипт локально на новом почтовом сервере
imap.mail.ru;ivanov@blabla.com;P@ssw0rd;localhost;ivanov@newdomain.ru;P@ssw0rd;
imap.mail.ru;petrov@blabla.com;P@ssw0rd;localhost;petrov@newdomain.ru;P@ssw0rd;
... и т.д.
В моем случае я выполнял скрипт непосредственно локально на новом почтовом сервере.
2. Для того что бы при синхронизации папки Входящие, Отправленные, СПАМ, Карзина, Черновики - правильно сопоставились и письма попали согласно своим папкам, Вам необходимо установить дополнительный модуль
Unicode::IMAPUtf7 для
Perl:
Скачивается он с
CPAN установка очень простая, в README очень подробно описана.
Затем для сопоставления папок Вам необходимо написать в скрипте такие строки:
...
# папка Отправленные
--regextrans2 "s/&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-/Sent/" \
# папка Корзина
--regextrans2 "s/&BBoEPgRABDcEOAQ9BDA-/Trash/" \
# папка СПАМ
--regextrans2 "s/&BCEEPwQwBDw-/Junk/" \
# папка Черновики
--regextrans2 "s/&BCcENQRABD0EPgQyBDgEOgQ4-/Drafts/" \
...
После этого у Вас не будут дублироваться эти папки.
3. Что бы
imapsync правильно воспринимал не прочитанные письма во Входящих, Вам надо добавить строку
...
--regexflag 's/\\Unseen//g' \
...
После всех не "хитрых" манипуляций письма будут корректно переносится.