2015-05-01 4 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

ответ

1

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==?=

  • =? и ?= это начало/окончание разделители.
  • KOI8-R является кодовой страницей
  • B для кодирования Base64, Q бы обозначает кавычко для печати кодирования
  • 4snUy8/JztkueGxzeA== ли кодироваться именем файла.
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).

Это действительно какой-то стандарт, потому что linkedIn использует то же самое, что и кодировать русские имена, но какой он?

+1

См. Мой ответ. Все, что вам нужно сделать, это добавить переключатель на 'B', который также может быть' Q', использовать это для принять решение о декодировании base64 или кавычках. – Sammitch

+0

@Sammitch, спасибо! Добавлен блок декодирования. –

Смежные вопросы