Donnerstag, April 9, 2020

Fetching attachments aus gmail per python oder php

Habe ich versucht zu finden, Informationen zum abrufen von Anlagen von einem gmail-Konto in entweder python oder PHP, ich hoffe, dass jemand hier kann ein wenig helfen, danke.

Verwandte:

  • Ich habe den link zu „Wie kann ich laden Sie alle E-Mails mit Anhängen aus Gmail?“
InformationsquelleAutor UnkwnTech | 2008-11-23

5 Kommentare

  1. 10

    Müssen Sie aktivieren Sie IMAP-Zugriff auf Ihr GMail-Konto (Einstellungen → Weiterleitung und POP/IMAP), und verwenden Sie dann imaplib.IMAP4_SSL zugreifen können.

    Verwenden Sie unformatierten text an jede Nachricht als argument an email.message_from_string, um alle Anhänge.

  2. 4

    Ich habe den code oben und fixiert es und es getestet. Es funktioniert mit PHP5.

    <?php 
    
    $gmail_username = '[email protected]';
    $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);
         }
    }
    ?>
  3. 2

    Fand ich einige code, der funktioniert! dies wird alle Anhänge herunterladen, um einen ausgewählten Ordner

    <?php 
    
    $gmail_username = '[email protected]';
    $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);
        }
    }
    ?>
  4. 1
    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 protected]';
        $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);
    
      ?>
  5. 0

    Den php docs für imap_open erklären, die Verbindung zu gmail in den Kommentaren (z.B. 31-Oct-2007 07:50):

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

    Wo, natürlich, müssen Sie füllen Sie den tatsächlichen Benutzernamen und das Kennwort entsprechend, und dann zu identifizieren die Anlagen in den teilen der E-Mail Folgen Sie den Anweisungen von: http://www.electrictoolbox.com/extract-attachments-email-php-imap/

    Dem, der Zusammenfassung, sagt, dass Sie verwenden:

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

    zur Identifizierung der Anlagen in der Struktur. Das ist allerdings ein ziemlich aufwendiger Prozess der Dekonstruktion MIME-Nachrichten, die eine Menge von optionale Variabilität berücksichtigt werden muss), so dass die Grundlagen/Gliederung eine Funktion für ist in diesem electrictoolbox Seite.

Kostenlose Online-Tests