Obtención de archivos adjuntos de gmail a través de python o php

He estado tratando de encontrar información sobre cómo recuperar archivos adjuntos de una cuenta de gmail en python o PHP, espero que alguien aquí pueda ser de alguna ayuda, gracias.

Relacionado:

  • ¿Cómo puedo descargar todos los correos electrónicos con archivos adjuntos de Gmail?

Deberá habilitar el acceso IMAP a su cuenta de GMail (Configuración → Reenvío y POP / IMAP), y luego usar imaplib.IMAP4_SSL para acceder.

Utilice el texto sin formato de cada mensaje como un argumento para email.message_from_string para procesar cualquier archivo adjunto.

Tomé el código de arriba y lo arreglé y lo probé. Funciona con PHP5.

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

¡Encontré un código que funciona! esto descargará los archivos adjuntos a una carpeta seleccionada

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

Los documentos php para imap_open explican cómo conectarse a gmail en los comentarios (por ejemplo, 31 de octubre de 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());

Donde, obviamente, debe ingresar el nombre de usuario y la contraseña reales, según corresponda, y luego, para identificar los archivos adjuntos en las partes del correo electrónico, siga las instrucciones de: http://www.electrictoolbox.com/extract-attachments-email -php-imap /

El cual, resumiendo, dice que usas:

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

Para identificar los archivos adjuntos en la estructura. Sin embargo, ese es un proceso bastante complejo de deconstrucción de mensajes MIME (que tiene una gran cantidad de variabilidad opcional que debe tenerse en cuenta), por lo que los fundamentos / resumen de una función para eso están en esa página de cuadro de herramientas eléctricas.

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