2008-11-23 51 views

回答

10

您必須啓用您的Gmail帳戶(設置→轉發和POP/IMAP)IMAP訪問,然後用imaplib.IMAP4_SSL來訪問它。

使用每條消息的原始文本作爲email.message_from_string的參數以處理任何附件。

0

爲imap_open PHP的文檔講解連接在評論到Gmail(例如,10月31日,2007 07:50):

$mbox = imap_open("{imap.gmail.com:993/imap/ssl}INBOX", "[email protected]", "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消息的過程(它有很多必須考慮的可選變量),所以這個函數的基礎/輪廓就在這個電子工具箱頁面中。

2

我發現了一些可行的代碼!這將下載任何附件到選定的文件夾

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

我拿上面的代碼,並修復它並測試它。它適用於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); 

    ?>