我使用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?
的东西,但它看起来像某种标准?它是什么标准?
答案 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==
是编码的文件名。