2015-05-01 98 views
-1

我使用imap php庫來提取郵件並保存附件。Imap php附件文件名編碼

當我笏得到附着物,我使用功能

$partStruct = imap_bodystruct($imap, $mailNum, $partNum); 

應該有在parameters屬性的文件的名稱,但這裏是我在這個屬性:

(
    [type] => 3 
    [encoding] => 3 
    [ifsubtype] => 1 
    [subtype] => VND.OPENXMLFORMATS-OFFICEDOCUMENT.SPREADSHEETML.SHEET 
    [ifdescription] => 0 
    [ifid] => 0 
    [bytes] => 53308 
    [ifdisposition] => 1 
    [disposition] => ATTACHMENT 
    [ifdparameters] => 0 
    [ifparameters] => 1 
    [parameters] => Array 
     (
      [0] => stdClass Object 
       (
        [attribute] => NAME 
        [value] => =?KOI8-R?B?4snUy8/JztkueGxzeA==?= 
       ) 

     ) 

) 

正如我所見,它是一個xlsx文件,但文件的名稱是=?KOI8-R?B?4snUy8/JztkueGxzeA==?=

有沒有人以前見過?我如何獲得原始utf-8文件名?

電子郵件從Imac發送,文件名原來是俄文。我可以嘗試解碼名稱,剝離=?KOI8-R?B?的東西,但它看起來像某種標準?它是什麼標準?

+1

這些被稱爲'編碼字'。見http://en.wikipedia.org/wiki/MIME#Encoded-Word – Max

回答

2

嗯,我已經知道有base64編碼的文件名。

這裏是I'va如何設法把它弄出來,但我不知道它會工作下一次:)

$str = '=?KOI8-R?B?4snUy8/JztkueGxzeA==?='; 

//Get parts of the string (idonno how it is formed, but still) 
$arrStr = explode('?', $str); 

//second part of array should be an encoding name (KOI8-R) in my case 
if (isset($arrStr[1]) && in_array($arrStr[1], mb_list_encodings())) { 

    switch ($arrStr[2]) { 

     case 'B': //base64 encoded 
      $str = base64_decode($arrStr[3]); 
      break; 

     case 'Q': //quoted printable encoded 
      $str = quoted_printable_decode($arrStr[3]); 
      break; 

    } 

    //convert it to UTF-8 
    $str = iconv($arrStr[1], 'UTF-8', $str); 
} 


echo $str; //биткоины.xlsx 

爲什麼串看起來應該有任何意見(與所有這些=?B)。

它是deffinetly某種標準,因爲linkedIn使用相同的編碼俄羅斯名稱,但它的標準是什麼?

+1

看到我的答案,你需要做的就是在'B'部分添加一個開關,也可以是'Q',用它來決定使用base64還是帶引號打印的解碼。 – Sammitch

+0

@Sammitch,謝謝!增加了解碼塊。 –