2017-06-28 43 views
1

我想我的程序下载所有文件附件,但由于某种原因,它不下载所有文件附件。这是代码:我该如何下载php中的所有文件附件?

<?php 

set_time_limit(3000); 
$hostname = '{someoutlookemail.outlook.com:993/imap/ssl}INBOX'; 
$username = '[email protected]'; 
$password = 'apass'; 

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

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


$max_emails = 16; 

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

    $count = 1; 

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

    /* 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,1.1); 
     $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"; 

       /* prefix the email number to the filename in case two emails 
       * have the attachment with the same file name. 
       */ 
       $fp = fopen("./" . $email_number . "-" . $filename, "w+"); 
       fwrite($fp, $attachment['attachment']); 
       fclose($fp); 
      } 

     } 

     if($count++ >= $max_emails) break; 


     /* output the email header information */ 
     $output.= '<p><div class="toggler '.($overview[0]->seen ? 'read' : 'unread').'">'; 
     $output.= '<p>Subject: <span class="subject">'.$overview[0]->subject.'</span> '; 
     $output.= '<p>From: <span class="from">'.$overview[0]->from.'</span>'; 
     $output.= '<p>Date: <span class="date">on '.$overview[0]->date.'</span>'; 
     $output.= '</div>'; 

     /* output the email body */ 
     $output.= '<p>Message:<div class="body">'.$message.''; 
     $output.= '<p>attachment:'.$filename.''; 
     $output.= '<table><tr><hr size="1" width="100%%" noshade color="black" ></tr></table>'; 


    } 

    echo $output; 
} 

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

怎么了?我试图检查我所有的代码,我不明白为什么它只下载一些,我现在下载相同类型的文件(.xml),其中一个下载,另一个没有,下载的那个1mb大小和另一个600kb,请帮助,我到处搜索,我找不到解决方案。

+0

你试过 if(empty($ filename))$ filename = $ i.time()。修改 “.dat”; 其中$ i是一个增量编号,有时它只需要不到一秒钟的时间来保存文件,因此您正在覆盖它们 –

+0

我改变它就像你说的,但它仍然不下载所有文件,它下载某种类型的文件总是,如果我有两个相同的文件,它下载它,但除了那个不同的,它不会下载... – Cactos

+0

[在PHP中随附IMAP目录下载附件,随机作品]( https://stackoverflow.com/questions/2649579/downloading-attachments-to-directory-with-imap-in-php-randomly-works) – LuFFy

回答

0

你的脚本工作正常,我所有的文件正在下载。唯一的问题是没有正确显示,当你回显输出时,你应该迭代附件。像这样的东西

<?php 

set_time_limit(3000); 


/* try to connect */ 


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

    $count = 1; 

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

    /* 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,1.1); 
     $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 $key=>$attachment) 
     { 
      if($attachment['is_attachment'] == 1) 
      { 
       $filename = $attachment['name']; 
       if(empty($filename)) $filename = $attachment['filename']; 

       if(empty($filename)) $filename = time() . ".dat"; 

       /* prefix the email number to the filename in case two emails 
       * have the attachment with the same file name. 
       */ 
       $fp = fopen("./" . $email_number . "-" . $filename, "w+"); 
       fwrite($fp, $attachment['attachment']); 
       fclose($fp); 

       $attachments[$key]['filename'] = $filename; 
      } 

     } 

     if($count++ >= $max_emails) break; 


     /* output the email header information */ 
     $output.= '<p><div class="toggler '.($overview[0]->seen ? 'read' : 'unread').'">'; 
     $output.= '<p>Subject: <span class="subject">'.$overview[0]->subject.'</span> '; 
     $output.= '<p>From: <span class="from">'.$overview[0]->from.'</span>'; 
     $output.= '<p>Date: <span class="date">on '.$overview[0]->date.'</span>'; 
     $output.= '</div>'; 

     /* output the email body */ 
     $output.= '<p>Message:<div class="body">'.$message.''; 
     foreach ($attachments as $attachment) { 
     $output.= '<p>attachment:'.$attachment['filename'].''; 
     } 
     $output.= '<table><tr><hr size="1" width="100%%" noshade color="black" ></tr></table>'; 


    } 

    echo $output; 
} 

/* close the connection */ 
imap_close($inbox); 
?> 
+0

我改变了附件的输出,它仍然一直给我同样的错误它说: fopen(./1- =?iso-8859-1?Q?513178643 = 5F2017-05-01 = 5F2017-05-31 = 5FGlobal = 5FSaft = 5FFatu?=?iso-8859-1 ?Q?ra = E7 = E3o.XML?=):未能打开流 – Cactos

+0

也即使我一次下载一个,它仍然只下载一直工作的相同文件,即使我删除所有附件并一个一个下载,它仍然只下载该特定的一个...我不明白为什么 – Cactos