2015-05-01 65 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,谢谢!增加了解码块。 –