• Как определить кодировку и перекодировать имена папок?

    @VanHoffen
    Прошу прощения что под старой темой но возможно это кому то сэкономит время.
    Миграция Хранилища почты MDAEMON (MSG) в EXCHANGE (PST)

    Использованные материалы.
    https://parallel.uran.ru/node/553
    https://github.com/Yar4e/lsmaildir/blob/master/lsm...

    Для миграции необходимо сделать PST файлы из хранилища MDaemon.
    Есть 2 проблемы
    1. Программа которая могла бы делать это в пакетном режиме.
    2. Русские имена папок ИМАП которые созданы в виде UTF7-Imap и естественно не читаются.
    Большинство программ для пакетной конвертации MDAEMON(MSG)-PST не умеют на лету декодировать имена папок из UTF7-Imap в рускоязычные символы. Нужен конвертер.

    На просторах интернета найдено 2 способа конвертировать символы из UTF7-Imap в читаемый текст.
    #################################################################################################
    Алгоритм кодирования имён папок: Текст > UTF7; & > &-; / > ,; + > &
    echo '.&BB4EQgQ,BEAEMAQyBDsENQQ9BD0ESwQ1-' \
    | sed 's/&\([^-]\)/+\1/g;s/&-/&/g;s/,/\//g' \
    | iconv -f UTF7 -t UTF8
    так же возможно использовать такой алгоритм замещения символов.
    sed -e 's:&:+:g' -e 's:,:/:g' -e 's:++:+-+:g'
    #################################################################################################
    Оба эти способа работают под линукс. Нас это же не смущает? Нисколько.
    1. Останавливаем работу MDAEMON (Чтобы не появлялись новые письма и небыло расхождения)
    2. Копируем папку с письмами в отдельный каталог, на всякий случай если что то пойдет не так. Чтобы можно было откатить если что то пойдет не так.
    3. Расшариваем по сети папку.
    4. Устанавливаем на какой то компьютер или виртуальную машину линукс (Debian10)
    5. Подключаемся к компьютеру Debian10 по SSH
    6. Монтируем расшаренную папку в линукс машину. ниже указан скрипт которым монтируется папка.

    Код:
    #!/bin/bash
    vusrnm="UserName"
    vpasswd="UserPassword"
    vdomain="domain.name"
    vdirmode=0777 # Rights to folders
    vfilemode=0777 # Rights to files
    nfspath="//ip.ad.dr.es/mailsharename"
    mountpath="/mnt/mailshare"

    sudo mkdir ${mountpath}
    sudo mount -t cifs -o username=${vusrnm},password=${vpasswd},dir_mode=${vdirmode},file_mode=${vfilemode} ${nfspath} ${mountpath}

    7. Далее нужно выполнить скрипт переименования.

    Код:
    #!/bin/bash
    #Set Variables
    searchpath="/mnt/mailshare/" # mail share
    searchmask="&*" # you can change this as needed
    tempfile="/mnt/mailshare/dirname.txt" # TMP File
    convertfile="/mnt/mailshare/convert.txt" # TMP file
    csvfile="/mnt/mailshare/list_folders.csv" # just list of folders
    execfile="/mnt/mailshare/execcomm.txt" # Commads that will execute if you whant to repeat
    revertfile="/mnt/mailshare/revertcomm.txt" # Command that will rename backwards if you do something wrong
    logfile="/mnt/mailshare/rename.log" # Log file so you can check
    errfile="/mnt/mailshare/rename.err" # Only errors will be writed
    # Make list of RU UTF-7-IMAP Folders
    find ${searchpath} -type d -name ${searchmask} > ${tempfile} # Search for directories and save it as full path string in tmp file

    # Cean and prepare log files
    echo "command;raw;converted" >"${csvfile}"
    echo > ${execfile}
    echo > ${revertfile}
    echo > ${logfile}
    echo > ${errfile}

    # Rename procedure
    while IFS= read -r line
    do
    # Rename and save to tmp file
    echo ${line} | sed -e 's:&:+:g' -e 's:,:/:g' -e 's:++:+-+:g' | iconv -f UTF7 -t UTF8 > ${convertfile}
    # get string as variable
    convertedname=$(cat ${convertfile})
    echo ${line} # This is just for visible script effect
    echo ${convertedname}
    # write line in CSV log file
    echo "mv; ${line}; ${convertedname};" >> ${csvfile}
    # Write line in txt command file so you can exec it later
    echo mv "${line}" "${convertedname}" >> ${execfile}
    # Write line in revers rename file so you can undo rename procedure
    echo mv "${convertedname}" "${line}" >> ${revertfile}
    #################################################################################################
    # WARNING Uncomment below will rename all directories finded in ${searchpath} #
    # Please make test run with commented string and check ${csvfile} for errors. #
    # mv "${line}" "${convertedname}" #
    #################################################################################################
    done < ${tempfile}

    8. результатом выполнения скрипта будет переименованные папки и несколько тестовых и лог файлов которые будут хранится там где лежит почта.
    9. ПОКА НЕ СДЕЛАН Лог ошибок переименования.
    10. Далее запускаем ПО миграции мы остановились на "6uupr.MDaemon.Migrator.9.7.rar" его можно найти\купить в интернете.
    11. Будьте внимательны, конвертация 90 гб почты занимает около 4-5 часов. Планируйте миграцию на выходные или праздники т.к. явно почта занимает больше места чем 90 ГБ.
    11. По результату вы получаете PST файлы с правильными русскими наименованиями, которые можно загрузить в exchange.