Восстановление писем из архива Kerio Mail/Connect — вытащить иголку из стога

В один прекрасный день, у одной прекрасной дамочки пропали письма в Outlook'е, да при этом аж за три месяца. Очень странным это может показаться, но .pst и не такое умеет.

В качестве сервера почты работает Kerio Connect 7.0.1 build 1249. Включены бэкапы, но работают они не так, как хотелось бы — делается копия текущего состояния ящика (а у пользователей, конечно же, стоит удаление писем с сервера).

К счастью, когда-то давно мной была выставлена спасительная галочка в настройках — «сохранять архив сообщений», благодаря которой Kerio любезно складывал всю почту (почта raw — там и спам, при желании можно заставить kerio и вирусы туда класть) за последние полгода в архив. Вздохнули с облегчением.

Структура архива Kerio Connect/Mail

А структуры нет. Ну, я конечно же преувеличиваю.. Но она ужасна.
Архив делится на папки по месяцам. И все, чёрт побери, все письма за этот месяц лежат в одной папке. В моём случае писем было ≈15 тысяч. Что может быть проще — разделить почту на папки на уровне почтового сервера, выделив почтовые адреса как сущности.

Разделить архив по получателям

Ну, это было первой идеей. Позже руки опустились, к сожалению. Поскольку писем много, а нам нужен только один получатель — пойдём «лоб в лоб»: возьмём плохой и ужасный php, чудесный и прекрасный Notepad++, такой розовый и блондинистый Denwer.. В общем, как обычно.

Спасительный говнокод.

  1. <?php
  2.    foreach( new DirectoryIterator( '.' ) as $file ) {
  3.       if ( $file->isDot() || $file->isDir() || $file->getFilename == __FILE__ ) {
  4.          continue;
  5.       }
  6.       
  7.       $name = $file->getFilename();
  8.       $file = file_get_contents( './' . $name );
  9.       if ( preg_match( '/(whatShouldWeFind@domain.(ru|com))/', $file ) ) {
  10.          rename( './' . $name, '../#saved/' . $name );
  11.          echo "moved " . $name . PHP_EOL;
  12.       }
  13.       
  14.       echo "skipped " . $name . PHP_EOL;
  15.    }
Ах да — мне было лень, создайте сами папку #saved рядом с #messages. Скрипт класть в папку #messages. Запускать как-то так: cd dirWithArchive/2011-Jan/#msgs && /usr/local/php5/php script.php. В 9-й строке меняется необходимый получатель.

Подведём итог

Скрипт ужасен. Скрипт работает. Разработчики Kerio в очередной раз доказали, что продукт хорош до тех пор, пока его используют стандартно — поставили, взломали через ukaip86.exe, настроили и забыли.
Спасибо за внимание.