2008-11-23 12 views

Respuesta

10

Usted tendrá que habilitar el acceso IMAP en su cuenta de Gmail (Configuración → Reenvío y correo POP/IMAP) y, a continuación, utilizar imaplib.IMAP4_SSL para acceder a ella.

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

0

Los documentos PHP para imap_open explican la conexión a Gmail en los comentarios (por ejemplo, 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());

Cuando, obviamente, tiene que rellenar el nombre de usuario actual y contraseña según sea apropiado, y luego para identificar los archivos adjuntos en las partes del correo electrónico se siguen las instrucciones de: http://www.electrictoolbox.com/extract-attachments-email-php-imap/

lo que, resumiendo, dice que utilice:

// 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 elaborado de deconstrucción de mensajes MIME (que tienen mucha variabilidad opcional que debe tenerse en cuenta), por lo que los fundamentos/esquema de una función están en esa página de electrictoolbox.

2

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

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

Tomé el código anterior y lo arreglé y lo probé. Funciona con 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); 
    } 
} 
?> 
0
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); 

    ?> 
Cuestiones relacionadas