<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Воронин: заметки с тегом imap2imap</title>
<link>https://voronin.one/tags/imap2imap/</link>
<description>воронин, voronin, it</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.4 (v4171)</generator>

<itunes:subtitle>воронин, voronin, it</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>скрипт для переноса электронной почты из одного ящика в другой</title>
<guid isPermaLink="false">39</guid>
<link>https://voronin.one/all/skript-dlya-perenosa-elektronnoy-pochty-iz-odnogo-yaschika-v-dru/</link>
<pubDate>Tue, 02 May 2023 18:04:04 +0300</pubDate>
<author></author>
<comments>https://voronin.one/all/skript-dlya-perenosa-elektronnoy-pochty-iz-odnogo-yaschika-v-dru/</comments>
<description>
&lt;p&gt;Скрипт максимально простой, написан на php, так же потребуется модуль php-imap, работает из командной строки любого устройства (сервера). Принцип простой, скрипт подключается к исходному ящику по протоколу IMAP сканирует структуру почтовых папок, подключается к целевому ящику IMAP, воссоздаёт папки которых нет и загружает в них письма. Опционально может создать структуру папок локально и скачать в них письма в формате eml.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;?php

//папка, куда будет сохраняться структура ящика с письмами
$path_to_mail = &amp;#039;boxes&amp;#039;;

//сохранять локально копию ящика
$save_local_copy = 0;

//декодировать имя папки или нет для локальной копии
$decode_folder_name = 1;

//данные ящика откуда переезжаем (например яндекс)
$source_server = &amp;#039;imap.yandex.ru&amp;#039;;
$source_port = &amp;#039;993&amp;#039;;
$source_user = &amp;#039;{user}@{domain}.ru&amp;#039;;
$source_pass = &amp;#039;P@$$word&amp;#039;;

//данные ящика куда переезжаем
$target_server = &amp;#039;mail.{domain}.ru&amp;#039;;
$target_port = &amp;#039;993&amp;#039;;
$target_user = &amp;#039;{user}@{domain}.ru&amp;#039;;
$target_pass = &amp;#039;P@$$word&amp;#039;;

function check_folder_exist($folders_list, $check_folder_name) {
  $fl_exist = false;
  foreach ($folders_list as $val) {
    if ($val-&amp;gt;name == $check_folder_name) {
      $fl_exist = true;
    }
  }
  return $fl_exist;
}

$path_to_mail .= DIRECTORY_SEPARATOR.$source_user.DIRECTORY_SEPARATOR;

$source_server_str = &amp;quot;{&amp;quot;.$source_server.&amp;quot;:&amp;quot;.$source_port.&amp;quot;/imap/ssl}&amp;quot;;
$source_mbox = imap_open($source_server_str,$source_user,$source_pass)
      or die(&amp;quot;can&amp;#039;t connect: &amp;quot; . imap_last_error());

$target_server_str = &amp;quot;{&amp;quot;.$target_server.&amp;quot;:&amp;quot;.$target_port.&amp;quot;/imap/ssl}&amp;quot;;
$target_mbox = imap_open($target_server_str,$target_user,$target_pass)
      or die(&amp;quot;can&amp;#039;t connect: &amp;quot; . imap_last_error());

$target_list = imap_getmailboxes($target_mbox, $target_server_str, &amp;quot;*&amp;quot;);
if (is_array($target_list)) {
    foreach ($target_list as $key =&amp;gt; $val) {
      $folder_name = str_replace($target_server_str,&amp;#039;&amp;#039;,$val-&amp;gt;name);
      $target_delimiter = $val-&amp;gt;delimiter;
    }
} else {
    echo &amp;quot;imap_getmailboxes failed: &amp;quot;.imap_last_error().&amp;quot;\n&amp;quot;;
}

$source_list = imap_getmailboxes($source_mbox, $source_server_str, &amp;quot;*&amp;quot;);
if (is_array($source_list)) {
    foreach ($source_list as $key =&amp;gt; $val) {
        $source_full_folder_name = $val-&amp;gt;name;
        $source_delimiter = $val-&amp;gt;delimiter;
        $con=imap_open($source_full_folder_name, $source_user, $source_pass);
        $number_msg=imap_num_msg($con);
        $folder_name = str_replace($source_server_str,&amp;#039;&amp;#039;,$source_full_folder_name);
        if ($decode_folder_name) {
          $current_folder_name = mb_convert_encoding($folder_name, &amp;quot;UTF8&amp;quot;, &amp;quot;UTF7-IMAP&amp;quot;);
        } else {
          $current_folder_name = $folder_name;
        }
        $full_new_folder_name = $target_server_str.str_replace($source_delimiter,$target_delimiter,$folder_name);
        echo $full_new_folder_name.&amp;quot;\n&amp;quot;;
        if (!(check_folder_exist($target_list, $full_new_folder_name))) {
          echo &amp;#039;папка &amp;quot;&amp;#039;.mb_convert_encoding($folder_name, &amp;quot;UTF8&amp;quot;, &amp;quot;UTF7-IMAP&amp;quot;).&amp;#039;&amp;quot; отсутствует на сервере, создаём&amp;#039;.&amp;quot;\n&amp;quot;;
          
          imap_createmailbox($target_mbox, $full_new_folder_name);
        }
        if ((!file_exists($path_to_mail.str_replace($source_delimiter,DIRECTORY_SEPARATOR,$current_folder_name))) and ($save_local_copy)) {
            mkdir($path_to_mail.str_replace($source_delimiter,DIRECTORY_SEPARATOR,$current_folder_name), 0777, true);
        }
        echo mb_convert_encoding($folder_name, &amp;quot;UTF8&amp;quot;, &amp;quot;UTF7-IMAP&amp;quot;).&amp;quot;: &amp;quot;;
        echo $number_msg.&amp;quot;\n&amp;quot;;
        for ($i = 1; $i &amp;lt;= $number_msg; $i++) {
          if (!imap_ping($con)) {
              // если вдруг связь первалась, восстанавливаем
              echo &amp;quot;$i ой, reconnect $source_server\n&amp;quot;;
              $i--;
              $con=imap_open($val-&amp;gt;name, $source_user, $source_pass);
          }
          if (!imap_ping($target_mbox)) {
              // если вдруг связь первалась, восстанавливаем
              echo &amp;quot;$i ой, reconnect $target_server\n&amp;quot;;
              $target_mbox = imap_open($target_server_str,$target_user,$target_pass);
          }
          echo &amp;quot;.&amp;quot;;
          $headers = imap_fetchheader($con, $i, FT_PREFETCHTEXT);
          $body = imap_body($con, $i);
          imap_append($target_mbox, $full_new_folder_name, $headers.&amp;quot;\n\n&amp;quot;.$body,&amp;quot;\\Seen&amp;quot;);
          if ($save_local_copy) {
            file_put_contents($path_to_mail.str_replace($val-&amp;gt;delimiter,DIRECTORY_SEPARATOR,$current_folder_name).DIRECTORY_SEPARATOR.str_pad($i, 8, &amp;quot;0&amp;quot;, STR_PAD_LEFT).&amp;quot;.eml&amp;quot;, $headers.&amp;quot;\n\n&amp;quot;.$body);
          }
        }
        echo &amp;quot;\n&amp;quot;;
      imap_close($con);
    }
} else {
    echo &amp;quot;imap_getmailboxes failed: &amp;quot;.imap_last_error().&amp;quot;\n&amp;quot;;
}
imap_close($source_mbox);
imap_close($target_mbox);

?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;$path_to_mail — относительный путь к папке, где будет храниться локальная копия ящика, актуально когда «$save_local_copy = 1»&lt;/p&gt;
&lt;p&gt;$save_local_copy = 1 будет сохраняться локальная копия писем на жёстком диске, соответственно, если «0» — не будет&lt;/p&gt;
&lt;p&gt;$decode_folder_name = 1 имена папок будут декодированы в нормальный вид, если «0» — то будет использован формат UTF7, как они хранятся на сервере.&lt;/p&gt;
&lt;p&gt;Все письма, которые будут перенесены в новый ящик получат статус прочитанных, извините, я не заморачивался с перенесением флагов.&lt;/p&gt;
&lt;p&gt;Перед прочтением сообщения пингуется соединение с сервером IMAP, в случае его обрыва — соединение восстанавливается. Замедление совсем небольшое, зато надёжность вырастает многократно.&lt;/p&gt;
&lt;p&gt;Учитываются разделители вложенности папок (например у яндекса это «|», в iRedMail «/»).&lt;/p&gt;
&lt;p&gt;Копирование писем допускается один раз, если вы прервёте процесс и запустите снова, часть сообщений задублируется.&lt;/p&gt;
</description>
</item>


</channel>
</rss>