Imap php附件文件名编码

时间:2015-05-01 16:35:51

标签: php imap

我使用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?的东西,但它看起来像某种标准?它是什么标准?

2 个答案:

答案 0 :(得分:3)

好吧,我已经发现有base64编码的文件名。

以下是我如何成功解决问题的方法,但我不确定下次会有效:)

$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)。

它只是某种标准,因为linkedIn使用相同的编码俄语名称但标准是什么?

答案 1 :(得分:1)

pointed out
http://ncona.com/2011/06/using-utf-8-characters-on-an-e-mail-subject/

因此:=?KOI8-R?B?4snUy8/JztkueGxzeA==?=

  • =??=是开头/结尾分隔符。
  • KOI8-R是charset
  • B适用于Base64编码,Q表示带引号可打印的编码
  • 4snUy8/JztkueGxzeA==是编码的文件名。