Downloading attachments to directory with IMAP in PHP, randomly works

后端 未结 4 366
暖寄归人
暖寄归人 2020-11-30 01:58

I found PHP code online to download attachments to a directory using IMAP from here. http://www.nerdydork.com/download-pop3imap-email-attachments-with-php.html

I mod

相关标签:
4条回答
  • 2020-11-30 02:27
        //may this help you...good luck
        date_default_timezone_set('UTC');
        error_reporting(E_ALL);
        ini_set('display_errors', '1');     
        ini_set('memory_limit', '-1');     
        ini_set('max_execution_time', 0); 
        set_time_limit(3000); 
        $fName = [];
        if ($subject=='xyz subject' || $subject=='xyz subject')$folder_name = $subject;
        else$folder_name = substr($subject,stripos($subject,':')+2);
        $list = glob('downloads/xyz/'.$folder_name.'/*');
        foreach($list as  $key => $filename){$explodeName = explode('/', $filename);$fName[] = $explodeName[2];}
        foreach($list as $file){if(is_file($file))unlink($file);}     
    
        $hostname = '{imap.gmail.com:993/imap/ssl}Inbox';
        $username = 'xyz.xyz@xyz.com';
        $password = '*******************';
    
        $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error());  
        $emails   = imap_search($inbox, 'SUBJECT "'.$subject.'"');
        foreach ($emails as $key => $value) {
    
            $overview = imap_fetch_overview($inbox,$value,0);
            $message_date = new DateTime($overview[0]->date);
            $date = $message_date->format('Ymd');
            $message = imap_fetchbody($inbox,$value,2);
            $structure = imap_fetchstructure($inbox, $value);
            $attachments = [];
            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, $value, $i+1);                           
                        if($structure->parts[$i]->encoding == 3) //3 = BASE64 encoding
                        { 
                            $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
                        }
                        elseif($structure->parts[$i]->encoding == 4) //4 = QUOTED-PRINTABLE encoding
                        { 
                            $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
                        }
                    }
                }
                foreach($attachments as $attachment)//iterate through each attachment and save it
                {
                    if($attachment['is_attachment'] == 1)
                    {
                        $filename = $attachment['name'];                        
                        if(empty($filename)) $filename = $attachment['filename'];
                        if(empty($filename)) $filename = time() . ".dat";
                        $new_fileName = $date.'-'.$value.'-'.$filename;                        
                        if(!in_array($new_fileName, $fName))
                        {
                            $folder='./downloads/xyz/'.$folder_name.'/';
                            if(!is_dir($folder))mkdir($folder);
                            $fp = fopen("./". $folder ."/". $date . "-". $value."-". $filename, "w+");
                            fwrite($fp, $attachment['attachment']);
                            fclose($fp);
                        }
                    }
                }
            }
            imap_mail_move($inbox,$overview[0]->msgno,'xyz_label'); 
            imap_expunge($inbox); 
    
            /*  ->Always try to read/open the email by subject/or according to need
                ->Move or Delete Old/not required mail, so that u don't need to search/load lots of email
                ->Avoiding unnecessary and old email of the same subject , is to move/delete the same.
            */
        }
        imap_close($inbox);//Never forget to close the connection
    
    0 讨论(0)
  • 2020-11-30 02:29

    This is perfect working answer, try this.

    This Sample run properly and download all the attachments with no issues.

    <?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";
    
    ?>
    

    About more, see the link

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

    0 讨论(0)
  • 2020-11-30 02:34

    this is final working sample

    <? 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);
    
    ?>
    
    0 讨论(0)
  • 2020-11-30 02:34

    Check out this code:

               $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 讨论(0)
提交回复
热议问题