Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Downloading attachments to directory with IMAP in PHP, randomly works

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 modified it slightly changing

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

to

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

to get it to run properly, as otherwise I got an error about how stdClass doesn't define a property called $parts. Doing that, I was able to download all the attachments. I tested it again recently though, and it didn't work. Well, it didn't work 6 times, worked the 7th, and then hasn't worked since. I'm thinking it has something to do with me screwing up the parts handling, since count($parts) keeps returning 1 for each message, so it's not finding any attachments I think.

Since it downloaded the attachments at one point with no issues, I feel confident that the area things are getting screwed up is right here. Before this block of code is a for loop that goes through each message in the box, and after it is loop that just goes through $parts for each imap structure. Thanks for any help you can provide. I looked at the imap_fetchstructure page on php.net and can't figure out what I'm doing wrong.

Edit: I just double-checked the folder after typing up my question and it all popped up. I feel like I'm going nuts. I hadn't run the code since a few minutes before I started typing this, and it doesn't make sense to me that it would take this long to trigger. I have some 800 messages in the mailbox, but I figured since it printed my statement at the very end of the PHP that all of the file creation work was done.

like image 648
Nick Avatar asked Apr 15 '10 23:04

Nick


1 Answers

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

About more, see the link

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

like image 167
GuRu Avatar answered Oct 12 '22 13:10

GuRu