2015-05-27 4 views
0

Мне удалось изменить приведенный ниже код, чтобы сохранить вложение электронной почты в определенной папке и получить ссылку вложения и загрузить ее. Все работает до сих пор, однако, если электронное письмо имеет более одного вложения, сценарий выводит (эхо) только первое имя вложения и ссылку, но сохраняет их все в папке сервера.PHP - получить несколько вложений электронной почты

Пример: (одно вложение - работает отлично)

Attachment: attachment_1.jpg

Скачать Ссылка: Скачать


Пример: (более чем одна привязанность)

Attachment : attachment_1.jpg, attachment_2.jpg и т. д.

Ссылка для скачивания: Скачать 1, Скачать 2, и т.д ..


Как я могу напечатать все имена вложения электронной почты?

echo 'Attachment:' . ' ' . $name[0] . '</br>'; ??? 

См. Код ниже.

$structure = imap_fetchstructure($imap, $m); 

    $attachments = array(); 
    if (isset($structure->parts) && count($structure->parts)) { 

     for ($i = 0; $i < count($structure->parts); $i++) { 

      $attachments[$i] = array(
       'is_attachment' => false, 
       'filename' => '', 
       'name' => '', 
       'attachment' => '' 
      ); 

      if ($structure->parts[$i]->ifdparameters) { 
       foreach($structure->parts[$i]->dparameters as $object) { 
        if(strtolower($object->attribute) == 'filename') { 
         $attachments[$i]['is_attachment'] = true; 
         $attachments[$i]['filename'] = $object->value; 
        } 
       } 
      } 

      if ($structure->parts[$i]->ifparameters) { 
       foreach($structure->parts[$i]->parameters as $object) { 
        if(strtolower($object->attribute) == 'name') { 
         $attachments[$i]['is_attachment'] = true; 
         $attachments[$i]['name'] = $object->value; 
        } 
       } 
      } 

      if ($attachments[$i]['is_attachment']) { 
       $attachments[$i]['attachment'] = imap_fetchbody($imap, $m, $i+1); 
       if($structure->parts[$i]->encoding == 3) { // 3 = BASE64 
        $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']); 
       } 
       elseif($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE 
        $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']); 
       } 
      } 
     } 
    } 

    foreach ($attachments as $key => $attachment) { 
     $name = $attachment['name']; 
     $contents = $attachment['attachment']; 
     file_put_contents(STYLESHEETPATH . '/email_attachments/' . $name, $contents); 
    } 

    $download_link = get_stylesheet_directory_uri() . '/email_attachments/' . $name; 

    //imap_setflag_full($imap, $i, "\\Seen"); 
    //imap_mail_move($imap, $i, 'Trash'); 
    //print_r($attachment); 
    echo '</br>From:' . ' ' . $from_email . '</br>'; 
    echo 'To:' . ' ' . $to . '</br>'; 

    if($name){ 
     echo 'Attachment:' . ' ' . $name . '</br>'; 
     echo 'Path Saved: ' . ' ' . STYLESHEETPATH . '/email_attachments/' . $name . '</br>'; 
     echo 'Download Link: ' . ' ' . '<a href="' . $download_link . '"> Download</a>' . '</br>'; 
    } 

    echo 'Subject:' . ' ' . $subject . '</br></br>'; 
} 
+0

Вам нужны добавьте foreach для повторения всех имен вложений. –

+0

это то, что я жестко зависаю, не знаю, где его добавить. Я пробовал эхо «Приложение:». ''. $ name. '
'; но ничего не делая – SNos

ответ

0

Здесь

if($name){ 
    echo 'Attachment:' . ' ' . $name . '</br>'; 
    echo 'Path Saved: ' . ' ' . STYLESHEETPATH . '/email_attachments/' .$name . '</br>'; 
    echo 'Download Link: ' . ' ' . '<a href="' . $download_link . '"> Download</a>' . '</br>'; 
} 

Вы печатаете только одно вложения (последнее, что осталось от итерации), вам нужно обернуть, что в Еогеаспе как

foreach ($attachments as $key => $attachment) { 
    $name = $attachment['name']; 
    $contents = $attachment['attachment']; 
    // Put your code to print here. 
} 
+0

большое спасибо .. это решило мою проблему ... – SNos

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