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==
是编码后的文件名。
我正在使用 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==
是编码后的文件名。