Загрузка вложений в каталог с IMAP в PHP, случайным образом работает

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

Я немного изменил его

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

в

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

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

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

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

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

 <? include('application.php'); /* connect to gmail */ $hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; $username = 'XX@XX.com'; $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 "xxx@gmail.com"'); /* 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); ?> в <? include('application.php'); /* connect to gmail */ $hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; $username = 'XX@XX.com'; $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 "xxx@gmail.com"'); /* 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); ?> 

Это прекрасный рабочий ответ, попробуйте это.

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

 <?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 "abc@gmail.com"'); /* 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/

Проверьте этот код:

  $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))