2016-12-12 6 views
0

У меня есть скрипт PHP, который проверяет учетную запись электронной почты для новых сообщений и пытается загрузить вложения .zip и .pdf из каждого письма. Я использую следующий код, чтобы сделать это:Извлечение вложения из электронной почты - невозможно получить имя файла привязки

/* try to connect */ 
$inbox = imap_open($hostname, $username, $password) or die ('Cannot connect to domain:' . imap_last_error()); 

/* grab emails */ 
$emails = imap_search($inbox, 'ALL'); 

/* put the newest emails on top */ 
rsort($emails); 

foreach ($emails as $email_number) { 
    $overview = imap_fetch_overview($inbox, $email_number, 0); 
    if ($overview [0]->seen) { 
     continue; 
    } 

    $structure = imap_fetchstructure($inbox, $email_number); 
    if (!property_exists($structure, 'parts')) { 
     continue; 
    } 
    //print_r($structure->parts); 
    //get attachments 
} 

Для большинства писем, $structure->parts выглядит примерно так:

[1] => stdClass Object 
     (
      [type] => 3 
      [encoding] => 3 
      [ifsubtype] => 1 
      [subtype] => PDF 
      [ifdescription] => 0 
      [ifid] => 0 
      [bytes] => 132780 
      [ifdisposition] => 1 
      [disposition] => attachment 
      [ifdparameters] => 1 
      [dparameters] => Array 
       (
        [0] => stdClass Object 
         (
          [attribute] => filename 
          [value] => some_filename.pdf 
         ) 

       ) 

      [ifparameters] => 1 
      [parameters] => Array 
       (
        [0] => stdClass Object 
         (
          [attribute] => name 
          [value] => some_filename.pdf 
         ) 

       ) 

     ) 

    [2] => stdClass Object 
     (
      [type] => 3 
      [encoding] => 3 
      [ifsubtype] => 1 
      [subtype] => ZIP 
      [ifdescription] => 0 
      [ifid] => 0 
      [bytes] => 43170 
      [ifdisposition] => 1 
      [disposition] => attachment 
      [ifdparameters] => 1 
      [dparameters] => Array 
       (
        [0] => stdClass Object 
         (
          [attribute] => filename 
          [value] => another_filename.zip 
         ) 

       ) 

      [ifparameters] => 1 
      [parameters] => Array 
       (
        [0] => stdClass Object 
         (
          [attribute] => name 
          [value] => another_filename.zip 
         ) 

       ) 

     ) 

Как вы можете видеть, что это легко понять, расширение и имя каждого крепление. Однако, в последнее время я получаю несколько писем, где $ структурообразующих> части выглядит как это вместо:

[1] => stdClass Object 
     (
      [type] => 3 
      [encoding] => 3 
      [ifsubtype] => 1 
      [subtype] => OCTET-STREAM 
      [ifdescription] => 1 
      [description] => =?utf-8?B?Q1RHIFF1ZXLDqXRhcm8gIC0gIC0gMTJfOF8xNi5wZGY=?= 
      [ifid] => 1 
      [id] => <[email protected]> 
      [bytes] => 44592 
      [ifdisposition] => 1 
      [disposition] => attachment 
      [ifdparameters] => 1 
      [dparameters] => Array 
       (
        [0] => stdClass Object 
         (
          [attribute] => filename 
          [value] => =?utf-8?B?Q1RHIFF1ZXLDqXRhcm8gIC0gIC0gMTJfOF8xNi5wZGY=?= 
         ) 

        [1] => stdClass Object 
         (
          [attribute] => size 
          [value] => 32586 
         ) 

        [2] => stdClass Object 
         (
          [attribute] => creation-date 
          [value] => Thu, 08 Dec 2016 22:16:31 GMT 
         ) 

        [3] => stdClass Object 
         (
          [attribute] => modification-date 
          [value] => Thu, 08 Dec 2016 22:16:31 GMT 
         ) 

       ) 

      [ifparameters] => 1 
      [parameters] => Array 
       (
        [0] => stdClass Object 
         (
          [attribute] => name 
          [value] => =?utf-8?B?Q1RHIFF1ZXLDqXRhcm8gIC0gIC0gMTJfOF8xNi5wZGY=?= 
         ) 

       ) 

     ) 

    [2] => stdClass Object 
     (
      [type] => 3 
      [encoding] => 3 
      [ifsubtype] => 1 
      [subtype] => OCTET-STREAM 
      [ifdescription] => 1 
      [description] => =?utf-8?B?Q1RHIFF1ZXLDqXRhcm8gIC0gIC0gMTJfOF8xNi56aXA=?= 
      [ifid] => 1 
      [id] => <[email protected]> 
      [bytes] => 10966 
      [ifdisposition] => 1 
      [disposition] => attachment 
      [ifdparameters] => 1 
      [dparameters] => Array 
       (
        [0] => stdClass Object 
         (
          [attribute] => filename 
          [value] => =?utf-8?B?Q1RHIFF1ZXLDqXRhcm8gIC0gIC0gMTJfOF8xNi56aXA=?= 
         ) 

        [1] => stdClass Object 
         (
          [attribute] => size 
          [value] => 8011 
         ) 

        [2] => stdClass Object 
         (
          [attribute] => creation-date 
          [value] => Thu, 08 Dec 2016 22:16:31 GMT 
         ) 

        [3] => stdClass Object 
         (
          [attribute] => modification-date 
          [value] => Thu, 08 Dec 2016 22:16:31 GMT 
         ) 

       ) 

      [ifparameters] => 1 
      [parameters] => Array 
       (
        [0] => stdClass Object 
         (
          [attribute] => name 
          [value] => =?utf-8?B?Q1RHIFF1ZXLDqXRhcm8gIC0gIC0gMTJfOF8xNi56aXA=?= 
         ) 

       ) 

     ) 

Эти вложения снова PDF и ZIP, а при использовании почтового клиента они выглядят так же, как вложения в любое другое электронное письмо. Но, как вы можете видеть выше, вместо blahblah.zip и blahblah.pdf для имен файлов он показывает что-то вроде «=? Utf-8? B? Q1RHIFF1ZXLDqXRhcm8gIC0gIC0gMTJfOF8xNi56aXA =? =" Вместо этого. Кроме того, подтип для обоих - это «OCTET-STREAM» вместо «zip» или «pdf». Поэтому я не знаю, что такое тип привязанности, и не могу ничего сделать с электронной почтой.

Любая помощь была бы принята с благодарностью. Подводя итог, я просто пытаюсь выяснить, как правильно извлечь информацию о вложении из этого определенного сегмента писем, которые ведут себя по-другому.

ответ

3

Это имена, закодированные в MIME.

=?utf-8?B? 

Это означает, что это кодировка UTF-8, Base64 Encoded.

Отъезд iconv_mime_decode

+0

Thank you @HawkHogan. Спас мой день. '$ resp = iconv_mime_decode ($ string_encoded, ICONV_MIME_DECODE_CONTINUE_ON_ERROR," ISO-8859-15 ");' 'echo $ resp = utf8_encode ($ resp);' – Duque