2010-04-15 2 views
15

Я нашел PHP-код онлайн для загрузки вложений в каталог с помощью IMAP. http://www.nerdydork.com/download-pop3imap-email-attachments-with-php.htmlЗагрузка вложений в каталог с IMAP в PHP, случайно работает

я изменил его немного изменив

 $structure = imap_fetchstructure($mbox, $jk); 
     $parts = ($structure->parts); 

в

 $structure = imap_fetchstructure($mbox, $jk); 
     $parts = ($structure); 

, чтобы заставить его работать правильно, так как в противном случае я получил ошибку о том, как StdClass не определяет свойство, называемое $ частей , Сделав это, я смог загрузить все вложения. Я проверил это снова недавно, но это не сработало. Ну, это не сработало 6 раз, работало 7-е, а с тех пор не сработало. Я думаю, что это связано с тем, что я привожу обработку деталей, так как count ($ parts) продолжает возвращать 1 для каждого сообщения, поэтому он не находит никаких вложений, которые я думаю.

С тех пор, как он загрузил вложения в один момент без каких-либо проблем, я чувствую уверенность в том, что в районе все налаживается прямо здесь. Прежде, чем этот блок кода является циклом for, который проходит через каждое сообщение в поле, и после него это цикл, который просто проходит через $ parts для каждой структуры imap. Спасибо за любую помощь, которую вы можете предоставить. Я просмотрел страницу imap_fetchstructure на php.net и не могу понять, что я делаю неправильно.

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

+0

Вы должны выбрать ответ, Ник. – MB34

ответ

2

Заканчивать этот код:

  $structure = imap_fetchstructure($mailbox, $index); 

     $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($connection, $message_number, $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']); 
      } 
      }    
     } // for($i = 0; $i < count($structure->parts); $i++) 
     } // if(isset($structure->parts) && count($structure->parts)) 
+0

Хороший фрагмент кода, сработал сразу –

22

это окончательный рабочий образец

<? include('application.php'); 
/* connect to gmail */ 
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; 
$username = '[email protected]'; 
$password = 'XX'; 

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

/* grab emails */ 
$emails = imap_search($inbox, 'FROM "[email protected]"'); 



/* if emails are returned, cycle through each... */ 
if($emails) { 

    /* begin output var */ 
    $output = ''; 

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




    foreach($emails as $email_number) { 

    /* get information specific to this email */ 
    $overview = imap_fetch_overview($inbox,$email_number,0); 
    $message = imap_fetchbody($inbox,$email_number,2); 
    $structure = imap_fetchstructure($inbox,$email_number); 


    pre($overview); 


    $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($inbox, $email_number, $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']); 
      } 
      }    
     } // for($i = 0; $i < count($structure->parts); $i++) 
     } // if(isset($structure->parts) && count($structure->parts)) 




    if(count($attachments)!=0){ 


     foreach($attachments as $at){ 

      if($at[is_attachment]==1){ 

       file_put_contents($at[filename], $at[attachment]); 

       } 
      } 

     } 

    } 

// echo $output; 
} 

/* close the connection */ 
imap_close($inbox); 

?> 
+1

Я пробовал это: «$ attachments [$ i] ['attachment']" всегда пусто после imap_fetchbody ($ inbox, $ email_number, $ i + 1) - есть имя в массиве , но в ключе присоединения нет содержимого. Почему так? – cukabeka

+0

Вы можете указать ссылку на класс imap, который вы использовали –

17

Это идеальный рабочий ответ, попробуйте это.

Этот образец работает правильно и загружает все вложения без проблем.

<?php 

set_time_limit(3000); 

/* connect to gmail with your credentials */ 
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; 
$username = 'YOUR_USERNAME'; 
$password = 'YOUR_PASSWORD'; 

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

$emails = imap_search($inbox, 'FROM "[email protected]"'); 

/* if any emails found, iterate through each email */ 
if($emails) { 

    $count = 1; 

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

    /* for every email... */ 
    foreach($emails as $email_number) 
    { 

     /* get information specific to this email */ 
     $overview = imap_fetch_overview($inbox,$email_number,0); 

     $message = imap_fetchbody($inbox,$email_number,2); 

     /* get mail structure */ 
     $structure = imap_fetchstructure($inbox, $email_number); 

     $attachments = array(); 

     /* if any attachments found... */ 
     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($inbox, $email_number, $i+1); 

        /* 3 = BASE64 encoding */ 
        if($structure->parts[$i]->encoding == 3) 
        { 
         $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']); 
        } 
        /* 4 = QUOTED-PRINTABLE encoding */ 
        elseif($structure->parts[$i]->encoding == 4) 
        { 
         $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']); 
        } 
       } 
      } 
     } 

     /* iterate through each attachment and save it */ 
     foreach($attachments as $attachment) 
     { 
      if($attachment['is_attachment'] == 1) 
      { 
       $filename = $attachment['name']; 
       if(empty($filename)) $filename = $attachment['filename']; 

       if(empty($filename)) $filename = time() . ".dat"; 
       $folder = "attachment"; 
       if(!is_dir($folder)) 
       { 
        mkdir($folder); 
       } 
       $fp = fopen("./". $folder ."/". $email_number . "-" . $filename, "w+"); 
       fwrite($fp, $attachment['attachment']); 
       fclose($fp); 
      } 
     } 
    } 
} 

/* close the connection */ 
imap_close($inbox); 

echo "all attachment Downloaded"; 

?> 

О более, увидеть ссылку

http://www.codediesel.com/php/downloading-gmail-attachments-in-php-an-update/

+2

Спасибо. Очень хорошее решение –