2010-04-15 13 views
15

J'ai trouvé du code PHP en ligne pour télécharger des pièces jointes dans un répertoire en utilisant IMAP à partir d'ici. http://www.nerdydork.com/download-pop3imap-email-attachments-with-php.htmlTéléchargement des pièces jointes au répertoire avec IMAP en PHP, fonctionne de manière aléatoire

je l'ai modifié changeant légèrement

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

à

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

pour le faire fonctionner correctement, sinon je suis une erreur sur la façon dont stdClass ne définit pas une propriété appelée parties $ . En faisant cela, j'ai pu télécharger toutes les pièces jointes. Je l'ai encore testé récemment, et cela n'a pas fonctionné. Eh bien, cela n'a pas fonctionné 6 fois, a travaillé le 7, et n'a pas fonctionné depuis. Je pense que ça a quelque chose à voir avec le fait de manipuler les pièces, puisque count ($ parts) continue à renvoyer 1 pour chaque message, donc je ne trouve pas de pièces jointes je pense.

Depuis qu'il a téléchargé les pièces jointes à un moment donné sans aucun problème, je suis convaincu que les choses se foutent dans la région. Avant ce bloc de code est une boucle for qui traverse chaque message dans la boîte, et après c'est une boucle qui passe par $ parts pour chaque structure imap. Merci pour toute l'aide que vous pouvez apporter. J'ai regardé la page imap_fetchstructure sur php.net et ne peux pas comprendre ce que je fais mal. Edit: Je viens de vérifier le dossier après avoir tapé ma question et tout est apparu. J'ai l'impression de devenir fou. Je n'avais pas exécuté le code depuis quelques minutes avant que je commence à taper ceci, et cela n'a pas de sens pour moi que ça prenne autant de temps à se déclencher. J'ai quelques 800 messages dans la boîte aux lettres, mais je me suis dit que depuis qu'il a imprimé ma déclaration à la toute fin du PHP, tout le travail de création de fichier a été fait.

+0

Vous devez sélectionner une réponse, Nick. – MB34

Répondre

2

Vérifiez ce 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

Bon extrait de code, travaillé immédiatement –

22

c'est l'échantillon de travail final

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

J'ai essayé ceci, "$ attachments [$ i] ['attachment']" est toujours vide après imap_fetchbody ($ inbox, $ email_number, $ i + 1) - il y a le nom dans le tableau , mais il n'y a pas de contenu dans la clé de la pièce jointe. pourquoi ça? – cukabeka

+0

pourriez-vous fournir le lien vers la classe imap que vous avez utilisé –

17

Cette réponse est parfait état de fonctionnement, essayez ceci.

Cet exemple fonctionne correctement et télécharge toutes les pièces jointes sans problème.

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

?> 

A propos de plus, voir le lien

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

+2

Merci. Très bonne solution –