{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Воронин: заметки с тегом imap2imap",
    "_rss_description": "воронин, voronin, it",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/voronin.one\/tags\/imap2imap\/",
    "feed_url": "https:\/\/voronin.one\/tags\/imap2imap\/json\/",
    "icon": "https:\/\/voronin.one\/pictures\/userpic\/userpic@2x.jpg?1658757233",
    "authors": [
        {
            "name": "Алексей Воронин",
            "url": "https:\/\/voronin.one\/",
            "avatar": "https:\/\/voronin.one\/pictures\/userpic\/userpic@2x.jpg?1658757233"
        }
    ],
    "items": [
        {
            "id": "39",
            "url": "https:\/\/voronin.one\/all\/skript-dlya-perenosa-elektronnoy-pochty-iz-odnogo-yaschika-v-dru\/",
            "title": "скрипт для переноса электронной почты из одного ящика в другой",
            "content_html": "<p>Скрипт максимально простой, написан на php, так же потребуется модуль php-imap, работает из командной строки любого устройства (сервера). Принцип простой, скрипт подключается к исходному ящику по протоколу IMAP сканирует структуру почтовых папок, подключается к целевому ящику IMAP, воссоздаёт папки которых нет и загружает в них письма. Опционально может создать структуру папок локально и скачать в них письма в формате eml.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">&lt;?php\n\n\/\/папка, куда будет сохраняться структура ящика с письмами\n$path_to_mail = &#039;boxes&#039;;\n\n\/\/сохранять локально копию ящика\n$save_local_copy = 0;\n\n\/\/декодировать имя папки или нет для локальной копии\n$decode_folder_name = 1;\n\n\/\/данные ящика откуда переезжаем (например яндекс)\n$source_server = &#039;imap.yandex.ru&#039;;\n$source_port = &#039;993&#039;;\n$source_user = &#039;{user}@{domain}.ru&#039;;\n$source_pass = &#039;P@$$word&#039;;\n\n\/\/данные ящика куда переезжаем\n$target_server = &#039;mail.{domain}.ru&#039;;\n$target_port = &#039;993&#039;;\n$target_user = &#039;{user}@{domain}.ru&#039;;\n$target_pass = &#039;P@$$word&#039;;\n\nfunction check_folder_exist($folders_list, $check_folder_name) {\n  $fl_exist = false;\n  foreach ($folders_list as $val) {\n    if ($val-&gt;name == $check_folder_name) {\n      $fl_exist = true;\n    }\n  }\n  return $fl_exist;\n}\n\n$path_to_mail .= DIRECTORY_SEPARATOR.$source_user.DIRECTORY_SEPARATOR;\n\n$source_server_str = &quot;{&quot;.$source_server.&quot;:&quot;.$source_port.&quot;\/imap\/ssl}&quot;;\n$source_mbox = imap_open($source_server_str,$source_user,$source_pass)\n      or die(&quot;can&#039;t connect: &quot; . imap_last_error());\n\n$target_server_str = &quot;{&quot;.$target_server.&quot;:&quot;.$target_port.&quot;\/imap\/ssl}&quot;;\n$target_mbox = imap_open($target_server_str,$target_user,$target_pass)\n      or die(&quot;can&#039;t connect: &quot; . imap_last_error());\n\n$target_list = imap_getmailboxes($target_mbox, $target_server_str, &quot;*&quot;);\nif (is_array($target_list)) {\n    foreach ($target_list as $key =&gt; $val) {\n      $folder_name = str_replace($target_server_str,&#039;&#039;,$val-&gt;name);\n      $target_delimiter = $val-&gt;delimiter;\n    }\n} else {\n    echo &quot;imap_getmailboxes failed: &quot;.imap_last_error().&quot;\\n&quot;;\n}\n\n$source_list = imap_getmailboxes($source_mbox, $source_server_str, &quot;*&quot;);\nif (is_array($source_list)) {\n    foreach ($source_list as $key =&gt; $val) {\n        $source_full_folder_name = $val-&gt;name;\n        $source_delimiter = $val-&gt;delimiter;\n        $con=imap_open($source_full_folder_name, $source_user, $source_pass);\n        $number_msg=imap_num_msg($con);\n        $folder_name = str_replace($source_server_str,&#039;&#039;,$source_full_folder_name);\n        if ($decode_folder_name) {\n          $current_folder_name = mb_convert_encoding($folder_name, &quot;UTF8&quot;, &quot;UTF7-IMAP&quot;);\n        } else {\n          $current_folder_name = $folder_name;\n        }\n        $full_new_folder_name = $target_server_str.str_replace($source_delimiter,$target_delimiter,$folder_name);\n        echo $full_new_folder_name.&quot;\\n&quot;;\n        if (!(check_folder_exist($target_list, $full_new_folder_name))) {\n          echo &#039;папка &quot;&#039;.mb_convert_encoding($folder_name, &quot;UTF8&quot;, &quot;UTF7-IMAP&quot;).&#039;&quot; отсутствует на сервере, создаём&#039;.&quot;\\n&quot;;\n          \n          imap_createmailbox($target_mbox, $full_new_folder_name);\n        }\n        if ((!file_exists($path_to_mail.str_replace($source_delimiter,DIRECTORY_SEPARATOR,$current_folder_name))) and ($save_local_copy)) {\n            mkdir($path_to_mail.str_replace($source_delimiter,DIRECTORY_SEPARATOR,$current_folder_name), 0777, true);\n        }\n        echo mb_convert_encoding($folder_name, &quot;UTF8&quot;, &quot;UTF7-IMAP&quot;).&quot;: &quot;;\n        echo $number_msg.&quot;\\n&quot;;\n        for ($i = 1; $i &lt;= $number_msg; $i++) {\n          if (!imap_ping($con)) {\n              \/\/ если вдруг связь первалась, восстанавливаем\n              echo &quot;$i ой, reconnect $source_server\\n&quot;;\n              $i--;\n              $con=imap_open($val-&gt;name, $source_user, $source_pass);\n          }\n          if (!imap_ping($target_mbox)) {\n              \/\/ если вдруг связь первалась, восстанавливаем\n              echo &quot;$i ой, reconnect $target_server\\n&quot;;\n              $target_mbox = imap_open($target_server_str,$target_user,$target_pass);\n          }\n          echo &quot;.&quot;;\n          $headers = imap_fetchheader($con, $i, FT_PREFETCHTEXT);\n          $body = imap_body($con, $i);\n          imap_append($target_mbox, $full_new_folder_name, $headers.&quot;\\n\\n&quot;.$body,&quot;\\\\Seen&quot;);\n          if ($save_local_copy) {\n            file_put_contents($path_to_mail.str_replace($val-&gt;delimiter,DIRECTORY_SEPARATOR,$current_folder_name).DIRECTORY_SEPARATOR.str_pad($i, 8, &quot;0&quot;, STR_PAD_LEFT).&quot;.eml&quot;, $headers.&quot;\\n\\n&quot;.$body);\n          }\n        }\n        echo &quot;\\n&quot;;\n      imap_close($con);\n    }\n} else {\n    echo &quot;imap_getmailboxes failed: &quot;.imap_last_error().&quot;\\n&quot;;\n}\nimap_close($source_mbox);\nimap_close($target_mbox);\n\n?&gt;<\/code><\/pre><p>$path_to_mail — относительный путь к папке, где будет храниться локальная копия ящика, актуально когда «$save_local_copy = 1»<\/p>\n<p>$save_local_copy = 1 будет сохраняться локальная копия писем на жёстком диске, соответственно, если «0» — не будет<\/p>\n<p>$decode_folder_name = 1 имена папок будут декодированы в нормальный вид, если «0» — то будет использован формат UTF7, как они хранятся на сервере.<\/p>\n<p>Все письма, которые будут перенесены в новый ящик получат статус прочитанных, извините, я не заморачивался с перенесением флагов.<\/p>\n<p>Перед прочтением сообщения пингуется соединение с сервером IMAP, в случае его обрыва — соединение восстанавливается. Замедление совсем небольшое, зато надёжность вырастает многократно.<\/p>\n<p>Учитываются разделители вложенности папок (например у яндекса это «|», в iRedMail «\/»).<\/p>\n<p>Копирование писем допускается один раз, если вы прервёте процесс и запустите снова, часть сообщений задублируется.<\/p>\n",
            "date_published": "2023-05-02T18:04:04+03:00",
            "date_modified": "2023-05-02T18:04:01+03:00",
            "tags": [
                "imap",
                "imap2imap",
                "php"
            ],
            "_date_published_rfc2822": "Tue, 02 May 2023 18:04:04 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "39",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "highlight\/highlight.js",
                    "highlight\/highlight.css"
                ],
                "og_images": []
            }
        }
    ],
    "_e2_version": 4171,
    "_e2_ua_string": "Aegea 11.4 (v4171)"
}