Я пытался найти информацию о том, как извлекать вложения из учетной записи 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("mdY") . '_' . 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("mdY") . '_' . 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 docs для imap_open объясняют подключение к gmail в комментариях (например, 31-Oct-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 (которые имеют много необязательной изменчивости, которые должны учитываться), поэтому основы / схема функции для этого находятся на этой странице 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); ?>
работа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); ?>