Инструмент для фиксации имен файлов, запускающихся с = _iso-8859-1 … в .eml именах файлов?

У меня есть folderful электронных писем, сохраненных из учетной записи IMAP, которую я расторг.

Имя файла является строкой темы каждой электронной почты.

Теперь, к сожалению, когда кодирование неASCII используется, строка темы будет похожа, они смотрят внутренне - они будут снабжены префиксом =_ и кодирование использовало:

=_UTF-8_Q_Auftragsbest=C3=A4tigung_(Kundennummer__)_=_20100819_150312_37.eml

=_windows-1252_Q_Best=E4tigung=3A_Wir_haben_Ihre_=_20100819_150310_28.eml 

Кто-либо знает инструмент, который мог привыкнуть к массе, закрепляют это на уровне файловой системы?

Решение имело бы к 1. удалите =_ENCODING префикс и 2. если вообще возможный, преобразуйте закодированные символы в имени файла к их надлежащей файловой системе эквивалентные Умляуты.

Я нахожусь в Windows 7 или XP, но я был бы готов взять это к VM Linux, потому что это - большая папка, и автоматическое решение было бы большим.

2
задан 13.09.2010, 00:47

2 ответа

Я создал меня Сценарий PHP. Я думал, что совместно использую его в конечном счете, кто-то еще заканчивает с подобной проблемой. Это работает на меня и кодировку, в которой я нуждался (Вам, вероятно, придется расширить массив кодировки).

Сценарий преобразовывает закодированные имена файлов MIME рекурсивно всюду по указанной структуре каталогов в UTF-8.

Это не приводит к совершенно идеальным результатам: существует несколько специальных символов, которые вдвойне преобразовываются, или нисколько. Насколько я вижу, это - отказ средства экспорта IMAP или неправильной информации о кодировании в самой электронной почте.

mb_decode_mimeheader() основа всего этого.

Опубликованное достояние; никакая гарантия вообще. PHP 5.2 требуется.

Это должно работать и на CLI и через сеть; я протестировал его в браузере.

Сделайте резервные копии прежде, чем запустить скрипты как это на Ваших данных.

<?php

 /* Directory to parse */
 $dir = "D:/IMAP";
 /* Extensions to parse. Leave empty for none */
 $extensions = array("eml");
 /* Set to true to actually run the renaming */
 define ("GO", true);

 /* No need to change past this point */  

 /* Output content type header if not in CLI */
 if (strtolower(php_sapi_name()) != "CLI")
  header("Content-type: text/plain; charset=utf-8");


 $FixNames = new FixEmlNames($dir, $extensions);
 $FixNames->fixAll();



  class FixEmlNames
   {

     /* List of possible encodings here */
     private $encodings = array("iso-8859-1", "iso-8859-15", "windows-1252", "utf-8");
     /* Encoding Prefix. The exporter exports e.g. =_iso-8859-1_ with underscores 
        instead of question marks */
     private $encoding_prefix = "=_";
     /* Encoding postfix */
     private $encoding_postfix = "_";
     /* Temporary storage for files */
     private $files;
     /* Array of file extensions to process. Leave empty to parse all files and directories */
     private $extensions = array(); 
     /* Count of renamed files */
     private $count = 0;
     /* Count of failed renames */
     private $failed = 0;
     /* Count of skipped renames */
     private $skipped = 0;
     /* Transform forbidden characters in host OS */
     private $transform_characters = array(":" => "_", "?" => "_", ">" => "_");

     function __construct($dir, $extensions = array("eml"))
       { 

        $this->files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
        $this->extensions = $extensions;
       }

     function fixAll()
      {
        echo "Starting....\n";

        while($this->files->valid())
        {
         if (!$this->files->isDot())
          {

           $path = $this->files->key();
           $ext  = pathinfo($path, PATHINFO_EXTENSION);

           if ((count($this->extensions) == 0 ) or (in_array($ext, $this->extensions)))
            $this->renameOne($path);

          }
         $this->files->next();
        }

        echo "Done. ";

        /* Show stats */
        $status = array();

        if ($this->count > 0) $status[] = $this->count." OK";
        if ($this->failed > 0) $status[] = $this->failed." failed";
        if ($this->skipped > 0) $status[] = $this->skipped." skipped";

        echo implode(", ", $status);


      }

      function  renameOne($fullPath)
       {


          $filename = pathinfo($fullPath, PATHINFO_BASENAME); 
          $is_mime = false;

          // See whether file name is MIME encoded or not
          foreach ($this->encodings as $encoding)
           { if (stristr($filename, $this->encoding_prefix.$encoding.$this->encoding_postfix))
              $is_mime = true;
           }

           // No MIME encoding? Skip.
           if (!$is_mime)
            {
              # uncomment to see skipped files
              # echo "Skipped: $filename\n";
              $this->skipped++;
              return true;
            }

           mb_internal_encoding("UTF-8"); 
           $filename = str_replace("_", "?", $filename);  // Question marks were converted to underscores
           $filename = mb_decode_mimeheader($filename);
           $filename = str_replace("?", "_", $filename);  


           // Remove forbidden characters
           $filename = strtr($filename, $this->transform_characters);

          // Rename
          if (constant("GO") == true)
           {
            // We catch the error manually
            $old = error_reporting(0);
            $success = rename($fullPath, realpath(dirname($fullPath)).DIRECTORY_SEPARATOR.$filename); 
            error_reporting($old);        

          if ($success)
           {
           echo "OK: $filename\n";
           $this->count++; 
           return true;
           }
          else
           {
             $error = error_get_last();
             $message = $error["message"];
             $this->failed++;
             echo "Failed renaming $fullPath. Error message: ".$message."\n";
             return false;
           }
           }
           else
           {
             $this->count++;  
             echo "Simulation: $filename\n";
             return true;   
           }
       }


   }
1
ответ дан 11.12.2019, 22:35

Так как Вы готовы переместиться в Linux, Вы могли установить php сервер на нем и сделать довольно легкий сценарий для перекодирования файлов. Степень трудности зависит от того, если Вы когда-либо делали какое-либо программирование. Можно сослаться на эти функции на php.net

Это функции, в которых Вы нуждались бы

<?php

opendir  ( string $path  [, resource $context  ] )
readdir  ([ resource $dir_handle  ] )
file_get_contents(ENTER THE FILE NAMES HERE WITH A VARIABLE PASSED FROM readdir)
preg_replace(REGULAR EXPRESSION TO REMOVE THE =ENCODING part of the filename)
string mb_convert_encoding  ( string $str  , string $to_encoding  [, mixed $from_encoding  ] )
file_put_contents(THE NEW FILE NAME.eml)

?>
1
ответ дан 11.12.2019, 22:35

Теги

Похожие вопросы