Перенос почты между серверами через интерфейс пользователя посредством IMAPSync

    В этой статье будет рассмотрен способ переноса почты между разными серверами с помощью утилиты IMAPSync через примитивный интерфейс пользователя.

    На сервере назначения необходимо иметь ящик с нужным логином и паролем. Перед использованием Imapsync нужно обязательно установить его (https://imapsync.lamiral.info/#install).

    По причине запрета организацией использовать пароли от почтовых ящиков сотрудников в скрипте процесс миграции передаем пользователю. Для этого разработан web-интерфейс пользователя, который состоит из модуля формы (gis.html) и модуля запуска скрипта imapsync (gis.php). Заполнение серверов imap можно автоматизировать анализируя содержимое поля с названием почтового ящика. Использование Fetchmail как плагина roundcube не рассматривается, т.к. мною не был найден подробный связный разбор этого вопроса.

    Web-интерфейс состоит из полей с информацией о почтовых ящиках, области вывода выполнения операции и кнопок управления (gis.html).

    <html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
        <script>
              //запуск скрипта sh из командной строки linux
         function isexe() {
          var ta = document.getElementById('output');
          document.getElementById('output').value += 'Start import, please wait...\n';
          var source = new EventSource('gis.php');
          source.addEventListener('message', function(e) {
           if (e.data !== '') {
            ta.value += e.data + '\n';
           }
          }, false);
          source.addEventListener('error', function(e) {
           source.close();
          }, false);
         }//isexe
    
        //кнопка Выполнить
        function Complete() {
          document.cookie = "mail1="+document.maildata.mail1.value;
          document.cookie = "pass1="+document.maildata.pass1.value;
          document.cookie = "mail2="+document.maildata.mail2.value;
          document.cookie = "pass2="+document.maildata.pass2.value;
          document.cookie = "msrv1="+document.maildata.msrv1.value;
          document.cookie = "msrv2="+document.maildata.msrv2.value;
          //alert(document.cookie); // показываем все куки
          isexe();
          document.cookie = "mail1="+document.maildata.mail1.value+"; max-age=0";
          document.cookie = "pass1="+document.maildata.pass1.value+"; max-age=0";
          document.cookie = "mail2="+document.maildata.mail2.value+"; max-age=0";
          document.cookie = "pass2="+document.maildata.pass2.value+"; max-age=0";
          document.cookie = "msrv1="+document.maildata.msrv1.value+"; max-age=0";
          document.cookie = "msrv2="+document.maildata.msrv2.value+"; max-age=0";
        }//Complete
    
        function ShowCookie() {
         alert(document.cookie); // показываем все куки
        }
        </script>
    </head>
    
    <body>
    <H1>Миграция почтового ящика</H1>
    <FORM NAME="maildata">
       <TABLE>
            <TR><TD><B>Исходный почтовый ящик:<B></TD>
                <TD><INPUT NAME="mail1" SIZE=20 VALUE=""
            <TR><TD><B>Пароль:<B>
                <TD><INPUT TYPE="password" NAME="pass1" SIZE=20 VALUE=""
            <TR><TD><B>IMAP сервер:<B></TD>
                <TD><INPUT NAME="msrv1" SIZE=20 VALUE=""<TD>
            <TR><TD><B>Конечный почтовый ящик:<B></TD>
                <TD><INPUT NAME="mail2" SIZE=20 VALUE=""
            <TR><TD><B>Пароль:<B>
                <TD><INPUT TYPE="password" NAME="pass2" SIZE=20 VALUE=""
            <TR><TD><B>IMAP сервер:<B></TD>
                <TD><INPUT NAME="msrv2" SIZE=20 VALUE=""<TD>
        </TABLE>
        <p>Результат выполнения:<br/><textarea id="output" style="width: 50%; height: 25em;"></textarea></p>
       <INPUT TYPE="button" VALUE="Выполнить" onClick="Complete();">
        <INPUT TYPE="reset" VALUE="Сброс">
        <INPUT TYPE="button" VALUE="Показать cookie" onClick="ShowCookie();">
    </FORM>
    </body>
    </html>

    Модуль запуска скрипта imapsync (gis.php).

    <?php
     ob_end_flush();
     ini_set("output_buffering", "0");
     ob_implicit_flush(true);
     header('Content-Type: text/event-stream');
     header('Cache-Control: no-cache');
    
     //вывод в область сообщений
    function echoEvent($datatext) {
      echo "data: ".implode("\ndata: ", explode("\n", $datatext))."\n\n";
     }//echoEvent
    
     echoEvent("Start!");
     //формируем строку запуска скрипта imapsync с параметрами
     $strexe = "/bin/bash /home/user/imapsync/startimapsync.sh "
               .htmlspecialchars($_COOKIE["mail1"]).' '
               .htmlspecialchars($_COOKIE["pass1"])." "
               .htmlspecialchars($_COOKIE["mail2"])." "
               .htmlspecialchars($_COOKIE["pass2"])." "
               .htmlspecialchars($_COOKIE["msrv1"])." "
               .htmlspecialchars($_COOKIE["msrv2"]);
     echoEvent($strexe);
    //запускаем sh скрипт из командной строки linux
     $proc = popen($strexe,'r');
    //могут быть ограничения php, поэтому достаточно вывести результат окончания миграции
     while (!feof($proc)) {
      echoEvent(fread($proc, 4096));
     }
      echoEvent("Finish!");
    ?>
    

    Скрипт миграции почтового ящика (startimapsync.sh) принимает параметры командной строки: логины и пароли, imap-сервера исходного и конечного ящиков соответственно.

    #!/bin/bash
    #переход в каталог откуда был запущен данный скрипт
    cd `dirname $0`
    #запуск imapsync с нужными параметрами
     /home/user/imapsync/./imapsync \
    #сервер начального почтового ящика, логин, пароль
      --host1 $5:993    --user1 $1 --password1 $2 \
    #сервер конечного почтового ящика, логин, пароль
      --host2 $6:993    --user2 $3 --password2 $4 \
    #использование  шифрования при подключении к серверу
      --ssl1  --ssl2 \
    #сопоставление папок
      --automap \
    #первой синхронизируем папку входящих
      --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
    

    Средняя зарплата в IT

    113 000 ₽/мес.
    Средняя зарплата по всем IT-специализациям на основании 5 184 анкет, за 2-ое пол. 2020 года Узнать свою зарплату
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 3

      +1

      У вас пользователь в поле исходный ящик сунет условное ;rm -rf /;

        –2
        Да, все верно. Нужно обрабатывать. Делаем проверку корректности данных:
        — в каждое поле добавляем «required» (Обязательное поле);
        — в поле email добавляем «input type=»email"" (Адрес электронной почты должен содержать буквы или цифры до символа @, после него, затем точку и домен первого уровня);
        — на кнопке запуска скрипта ставим «input type=»submit"" (для отправки формы).
          0
          Пользователь вряд ли, а вот «хакер» который с солонками — может быть. Хотя и так очевидно, что в статье страница для внутреннего использования

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

        Самое читаемое