Question

J'essayais de trouver des informations sur la façon de récupérer des pièces jointes d'un compte Gmail en Python ou en PHP. J'espère que quelqu'un ici pourra vous aider, merci.

Connexes:

Était-ce utile?

La solution

Vous devez activer l'accès IMAP à votre compte GMail (Paramètres & # 8594; Transfert et POP / IMAP), puis utiliser imaplib.IMAP4_SSL pour y accéder.

Utilisez le texte brut de chaque message comme argument de email.message_from_string afin de traiter les pièces jointes.

Autres conseils

J'ai pris le code ci-dessus, je l'ai corrigé et testé. Cela fonctionne avec PHP5.

<?php 

$gmail_username = 'email@gmail.com';
$gmail_password = 'password';
$imap = imap_open ("{imap.gmail.com:993/imap/ssl}INBOX", $gmail_username, $gmail_password) or die("can't connect: " . imap_last_error());
$savefilepath = '//Server/share/Local/Pathname/'; //absolute path to images directory
$imagefilepath = '/Local/Pathname/'; //relative path to images directory
$savethumbpath = '/Local/Pathname/'; //relative path to images directory
$headers = imap_headers($imap);
foreach ($headers as $mail) {
    $flags = substr($mail, 0, 4);
    //Check for unread msgs, get their UID, and queue them up
    if (strpos($flags, "U")) {
        preg_match('/[0-9]+/',$mail,$match);
        $new_msg[] = implode('',$match);     
    }
}
if ($new_msg) {
    foreach ($new_msg as $result) {
        $structure = imap_fetchstructure($imap,$result);
        $parts = $structure->parts;
        foreach ($parts as $part) {
            if ($part->parameters[0]->attribute == "NAME") {
                //Generate a filename with format DATE_RANDOM#_ATTACHMENTNAME.EXT
                $savefilename = date("m-d-Y") . '_' . rand() . '_' . $part->parameters[0]->value;
                   save_attachment(imap_fetchbody($imap,$result,2),$savefilename,$savefilepath,$savethumbpath);
                imap_fetchbody($imap,$result,2); //This marks message as read
            } 
        }
    }
}
/* grab emails */
$emails = imap_search($imap,'ALL');
/* if emails are returned, cycle through each... */
if($emails) {
  /* put the newest emails on top */
  $total = imap_num_msg($imap);
  /* for every email... */
  for( $i = $total; $i >= 1; $i--) {
        $headers = imap_header($imap, $i);
        $from = $headers->from[0]->mailbox . "@" . $headers->from[0]->host;
        echo $from . "\n";
        imap_delete($imap,$i);
        imap_mail_move($imap,"$i:$i", "[Gmail]/Trash"); // Change or remove this line if you are not connecting to gmail. The path to the Trash folder in your Gmail may be different, capitalization is relevant.
  }
}else{
        echo "no emails";
}
/* close the connection */
   imap_expunge($imap);
   imap_close($imap);

function save_attachment( $content , $filename , $localfilepath, $thumbfilepath ) {
     if (imap_base64($content) != FALSE) {   
         $file = fopen($localfilepath.$filename, 'w');
         fwrite($file, imap_base64($content));
         fclose($file);
     }
}
?>

J'ai trouvé du code qui fonctionne! cela téléchargera toutes les pièces jointes dans un dossier sélectionné

<?php 

$gmail_username = 'username@gmail.com';
$gmail_password = 'mypassword';

$imap = imap_open ("{imap.gmail.com:993/imap/ssl}INBOX", $gmail_username, $gmail_password) or die("can't connect: " . imap_last_error());
$savefilepath = 'path/to/images_folder/'; //absolute path to images directory
$imagefilepath = 'images/'; //relative path to images directory

$headers = imap_headers($imap);
foreach ($headers as $mail) {
    $flags = substr($mail, 0, 4);
    //Check for unread msgs, get their UID, and queue them up
    if (strpos($flags, "U")) {
        preg_match('/[0-9]+/',$mail,$match);
        $new_msg[] = implode('',$match);     
    }
}

if ($new_msg) {
    foreach ($new_msg as $result) {
        $structure = imap_fetchstructure($imap,$result);
        $parts = $structure->parts;
        foreach ($parts as $part) {
            if ($part->parameters[0]->attribute == "NAME") {
                //Generate a filename with format DATE_RANDOM#_ATTACHMENTNAME.EXT
                $savefilename = date("m-d-Y") . '_' . mt_rand(rand(), 6) . '_' . $part->parameters[0]->value;
                save_attachment(imap_fetchbody($imap,$result,2),$savefilename,$savefilepath,$savethumbpath);
                imap_fetchbody($imap,$result,2); //This marks message as read
            } 
        }
    }
}

imap_close($imap);

function save_attachment( $content , $filename , $localfilepath, $thumbfilepath ) {
    if (imap_base64($content) != FALSE) {   
        $file = fopen($localfilepath.$filename, 'w');
        fwrite($file, imap_base64($content));
        fclose($file);
    }
}
?>

Les documents php pour imap_open expliquent la connexion à gmail dans les commentaires (par exemple, 31 octobre 2007 07:50):

$mbox = imap_open("{imap.gmail.com:993/imap/ssl}INBOX", "username@gmail.com", "password") or die("can't connect: " . imap_last_error());

Où, évidemment, vous devez saisir le nom d'utilisateur et le mot de passe réels, le cas échéant, puis identifier les pièces jointes dans les parties du courrier électronique à partir desquelles vous suivez les instructions: http://www.electrictoolbox.com/extract-attachments-email-php-imap/

Ce qui, en résumé, dit que vous utilisez:

// in a for($i=1;$i<$nummsgs;$i++) loop over all the messages in the inbox $structure = imap_fetchstructure($mbox, $i);

pour identifier les pièces jointes dans la structure. Cependant, il s’agit d’un processus plutôt complexe de déconstruction des messages MIME (qui a beaucoup de variabilité optionnelle qui doit être prise en compte), de sorte que les bases / le contour d’une fonction pour cela se trouvent dans cette page electrictoolbox.

I recently worked on this topic and here is the code which works well. It also saves the details of the attachments in a word document with the following details:
-> Date
-> Time
-> From
-> Email ID
-> Subject










<?php 


 /*
    *   Gmail attachment extractor.
    *
    *   Downloads attachments from Gmail and saves it to a file.
    *   Uses PHP IMAP extension, so make sure it is enabled in your php.ini,
    *   extension=php_imap.dll
    *
    */

    header('Content-type:application\msword');
    header('Content-Disposition:attachment;Filename=document_name.doc');
    set_time_limit(0); 
    /* connect to gmail with your credentials */
    $hostname = '{imap.googlemail.com:993/imap/ssl}INBOX';
    $username = 'email@gmail.com';
    $password = 'password';
    /* try to connect */
    $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to       
    Gmail: ' . imap_last_error());
    /* get all new emails. If set to 'ALL' instead 
    * of 'NEW' retrieves all the emails, but can be 
    * resource intensive, so the following variable, 
    * $max_emails, puts the limit on the number of emails downloaded.
    * 
    */
    $emails = imap_search($inbox,'ALL');
    /* useful only if the above search is set to 'ALL' */
    $max_emails = 110;


    /* 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);
    $check=imap_check($inbox);
    $result=imap_fetch_overview($inbox,"1:{$check->Nmsgs}",0);
    foreach($result as $overview){
    echo "#{$overview->msgno}({$overview->date})-From: {$overview->from}
    {$overview->subject}\n"}
    /* get mail message */
    $message = imap_fetchbody($inbox,$email_number,2);
    /* get mail structure */
    $structure =imap_fetchstructure($inbox, $email_number);
    //$functions = array('function1' => imap_fetchstructure($inbox,
    $email_number));
    //print_r(array_keys($functions));
    $attachments = array();
    //print_r(array_keys($attachments[$i]));
    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);
     /* 4 = QUOTED-PRINTABLE encoding */
     if($structure->parts[$i]->encoding == 3){ 
     $attachments[$i]['attachment'] = base64_decode($attachments[$i]  
           ['attachment']);
      }
      /* 3 = BASE64 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;


         }

       } 

        /* close the connection */

       imap_close($inbox);

  ?>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top