Перенос почты между серверами через интерфейс пользователя посредством 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 

ссылка на оригинал статьи https://habr.com/ru/post/517454/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *