2010-04-15 36 views
15

我發現在線PHP代碼使用IMAP從這裏下載附件到目錄。 http://www.nerdydork.com/download-pop3imap-email-attachments-with-php.html使用IMAP在PHP中下載附件到IMAP目錄,隨機作品

我修改了它稍微改變

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

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

得到它才能正常運行,否則我得到stdClass的怎麼沒有定義的屬性稱爲$部分錯誤。這樣做,我可以下載所有的附件。我最近再次測試過,但沒有奏效。那麼,它沒有工作6次,第7次工作,然後從那時起一直沒有工作。我認爲這與我搞砸零件處理有關,因爲count($ parts)每條消息都會返回1,所以它沒有找到我認爲的任何附件。

由於它在一點沒有問題下載附件,我覺得這個地區的事情已經搞砸了。在這個代碼塊之前是一個for循環,通過框中的每條消息,並且在循環之後,每個imap結構只經過$ parts。感謝您的任何幫助,您可以提供。我看着php.net上的imap_fetchstructure頁面,無法弄清楚我做錯了什麼。

編輯:我只是在輸入我的問題後再次檢查文件夾,它全部彈出。我覺得我瘋了。自從我開始輸入這些內容之前幾分鐘,我就沒有運行這些代碼,對我而言,觸發這個過程需要很長時間纔是有意義的。我在郵箱中有800條消息,但是我想,因爲它在PHP的最後打印了我的聲明,表明所有文件創建工作都已完成。

+0

您需要選擇一個答案,尼克。 – MB34 2012-03-16 13:37:07

回答

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

好的代碼片段,直接工作 – 2011-10-06 01:24:36

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 2013-03-04 21:12:29

+0

能否提供您使用的imap類的鏈接 – 2016-01-13 07:03:40

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

謝謝。很好的解決方案 – 2016-12-08 15:35:02