Imap php 附件文件名编码

Imap php attachement file name encoding

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

嗯,我发现有 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 使用相同的标准来编码俄罗斯名字,但它是哪个标准?

http://ncona.com/2011/06/using-utf-8-characters-on-an-e-mail-subject/
https://www.ietf.org/rfc/rfc1342.txt

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

  • =??= 是 beginning/ending 分隔符。
  • KOI8-R 是字符集
  • B 用于 Base64 编码,Q 表示引用打印编码
  • 4snUy8/JztkueGxzeA== 是编码后的文件名。