2010-04-15 201 views
15

Encontré el código PHP en línea para descargar archivos adjuntos a un directorio usando IMAP desde aquí. http://www.nerdydork.com/download-pop3imap-email-attachments-with-php.htmlDescarga de archivos adjuntos al directorio con IMAP en PHP, funciona aleatoriamente

he modificado cambiando ligeramente

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

a

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

a conseguir que se ejecute correctamente, ya que de lo contrario me dio un error acerca de cómo stdClass no define una propiedad denominada piezas $ . Al hacer eso, pude descargar todos los archivos adjuntos. Sin embargo, lo probé de nuevo recientemente, y no funcionó. Bueno, no funcionó 6 veces, trabajó el 7mo, y luego no ha funcionado desde entonces. Estoy pensando que tiene algo que ver conmigo al enrutar el manejo de las piezas, ya que el recuento ($ partes) sigue devolviendo 1 por cada mensaje, por lo que no creo que encuentre ningún archivo adjunto.

Dado que descargó los archivos adjuntos en un punto sin problemas, estoy seguro de que el área que se está estropeando está justo aquí. Antes de este bloque de código hay un bucle for que atraviesa cada mensaje en el recuadro, y luego de que se trata de un bucle que acaba de pasar por $ parts para cada estructura imap. Gracias por cualquier ayuda que usted nos pueda proporcionar. Miré la página imap_fetchstructure en php.net y no puedo entender lo que estoy haciendo mal.

Editar: Acabo de verificar dos veces la carpeta después de escribir mi pregunta y todo apareció. Siento que me estoy volviendo loco. No había ejecutado el código desde unos minutos antes de comenzar a escribir esto, y no tiene sentido para mí que se tarde tanto en activarse. Tengo unos 800 mensajes en el buzón de correo, pero calculé que desde que se imprimió mi declaración al final del PHP se hizo todo el trabajo de creación del archivo.

+0

Es necesario seleccionar una respuesta, Nick. – MB34

Respuesta

2

Salida este código:

  $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

Buen fragmento de código, trabajado directamente –

22

esta es la muestra de trabajo 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

Intenté esto, "$ archivos adjuntos [$ i] ['attachment']" siempre está vacío después de imap_fetchbody ($ inbox, $ email_number, $ i + 1) - ahí está el nombre en la matriz , pero no hay contenido en la clave de archivo adjunto. ¿por qué eso? – cukabeka

+0

podría proporcionar el enlace a la clase imap que utilizó –

17

Esta es la respuesta perfecto estado de funcionamiento, prueba este.

Este ejemplo se ejecuta correctamente y descarga todos los archivos adjuntos sin problemas.

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

?> 

acerca más, vea el enlace

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

+2

Gracias. Muy buena solución –

Cuestiones relacionadas