سؤال

لقد كنت أحاول العثور على معلومات حول كيفية استرداد المرفقات من حساب Gmail إما في python أو PHP، وآمل أن يتمكن شخص ما هنا من تقديم بعض المساعدة، شكرًا.

متعلق ب:

هل كانت مفيدة؟

المحلول

سيتعين عليك تمكين وصول IMAP إلى حساب GMail الخاص بك (الإعدادات → إعادة التوجيه وPOP/IMAP)، ثم استخدم imaplib.IMAP4_SSL للوصول إليه.

استخدم النص الأولي لكل رسالة كوسيطة email.message_from_string من أجل معالجة أي مرفقات.

نصائح أخرى

أخذت الكود أعلاه وأصلحته واختبرته.يعمل مع 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);
     }
}
?>

لقد وجدت بعض التعليمات البرمجية التي تعمل!سيؤدي هذا إلى تنزيل أي مرفقات إلى المجلد المحدد

<?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);
    }
}
?>

تشرح مستندات php الخاصة بـ imap_open الاتصال بـ gmail في التعليقات (على سبيل المثال.31-أكتوبر-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());

حيث من الواضح أنه يتعين عليك ملء اسم المستخدم وكلمة المرور الفعليين حسب الاقتضاء، ثم تحديد المرفقات في أجزاء البريد الإلكتروني التي تتبع الإرشادات منها: http://www.electrictoolbox.com/extract-attachments-email-php-imap/

والذي، تلخيصًا، يقول أنك تستخدم:

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

للتعرف على المرفقات في الهيكل.ومع ذلك، فهذه عملية معقدة إلى حد ما لتفكيك رسائل MIME (التي تحتوي على الكثير من التباين الاختياري الذي يجب أخذه في الاعتبار)، لذا فإن الأساسيات/المخطط التفصيلي لوظيفة لذلك موجود في صفحة صندوق الأدوات الكهربائية تلك.

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);

  ?>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top