ΠŸΠ΅Ρ€Π΅Π½ΠΎΡ ΠΏΠΎΡ‡Ρ‚Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ сСрвСрами Ρ‡Π΅Ρ€Π΅Π· интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ посрСдством IMAPSync

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСн способ пСрСноса ΠΏΠΎΡ‡Ρ‚Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ сСрвСрами с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ IMAPSync Ρ‡Π΅Ρ€Π΅Π· ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΉ интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

На сСрвСрС назначСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ящик с Π½ΡƒΠΆΠ½Ρ‹ΠΌ Π»ΠΎΠ³ΠΈΠ½ΠΎΠΌ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΌ. ΠŸΠ΅Ρ€Π΅Π΄ использованиСм Imapsync Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ (https://imapsync.lamiral.info/#install).

По ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‚Π° ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΎΡ‚ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹Ρ… ящиков сотрудников Π² скриптС процСсс ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. Для этого Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ web-интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ состоит ΠΈΠ· модуля Ρ„ΠΎΡ€ΠΌΡ‹ (gis.html) ΠΈ модуля запуска скрипта imapsync (gis.php). Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ сСрвСров imap ΠΌΠΎΠΆΠ½ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ анализируя содСрТимоС поля с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²ΠΎΠ³ΠΎ ящика. ИспользованиС Fetchmail ΠΊΠ°ΠΊ ΠΏΠ»Π°Π³ΠΈΠ½Π° roundcube Π½Π΅ рассматриваСтся, Ρ‚.ΠΊ. мною Π½Π΅ Π±Ρ‹Π» Π½Π°ΠΉΠ΄Π΅Π½ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ связный Ρ€Π°Π·Π±ΠΎΡ€ этого вопроса.

Web-интСрфСйс состоит ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ ΠΏΠΎΡ‡Ρ‚ΠΎΠ²Ρ‹Ρ… ящиках, области Π²Ρ‹Π²ΠΎΠ΄Π° выполнСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ управлСния (gis.html).

ΠŸΠ΅Ρ€Π΅Π½ΠΎΡ ΠΏΠΎΡ‡Ρ‚Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ сСрвСрами Ρ‡Π΅Ρ€Π΅Π· интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ посрСдством IMAPSync

<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))."nn";
 }//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

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com