2017-08-07 91 views
1

我想編寫一個腳本,使用Gmail API從所有標籤ID爲Label_41的電子郵件中下載所有附件。從具有特定標籤的電子郵件下載所有附件

我完成了在https://developers.google.com/gmail/api/quickstart/php

指令使用API我預計listUsersMessages(...)->getMessages()返回的所有電子郵件與標籤Label_41

$client = getClient(); 
$service = new Google_Service_Gmail($client); 

$user = 'me'; 
$labels = array('labelIds' => array('Label_41')); 
$messagesResponse = $service->users_messages->listUsersMessages($user, $labels); 
$messages = $messagesResponse->getMessages(); 

foreach ($messages as $message) { 
    echo 'Message with ID: ' . $message->getId(); 

    echo $message->getLabelIds(); 

    if($message->getLabelIds() == null) echo " (NO LABEL) "; 

    echo "\n"; 
} 

然而,所有我這裏的郵件沒有標籤分配給他們,因爲我的終端輸出節目。我在這裏做錯了什麼?

enter image description here

+0

用字符串參數嘗試最終代碼,而不是陣列'$標籤=陣列(「labelIds」 =>「Label_41」); '也參數應該是Id,而不是文本,除了一些標準的,如'INBOX'。檢查這個例子https://stackoverflow.com/a/41273594/4621324 – Axalix

+0

@Axalix thx的鏈接。在你的引用代碼的幫助下,我會對它進行修改以使其工作。 Google-API for PHP的確需要改進。 – Adam

+1

Google API文檔被稱爲「垃圾」... – Axalix

回答

0

的問題是,該物體$message在foreach循環中幾乎不包含數據。需要使用full參數啓動消息對象。這是下載的郵件的所有附件與標籤Label_41

client = getClient(); 
$service = new Google_Service_Gmail($client); 

$user = 'me'; 
$optParams = []; 
$optParams['labelIds'] = 'Label_41'; 

$messagesResponse = $service->users_messages->listUsersMessages($user, $optParams); 
$messages = $messagesResponse->getMessages(); 

foreach ($messages as $message) { 
    echo 'Message with ID: ' . $message->getId(); 

    $messageId = $message->getId(); 

    $optParamsGet = []; 
    $optParamsGet['format'] = 'full'; // Display message in payload 
    $message = $service->users_messages->get($user,$messageId,$optParamsGet); 

    $messagePayload = $message->getPayload(); 
    $headers = $message->getPayload()->getHeaders(); 
    $parts = $message->getPayload()->getParts(); 

    $timestamp = ($message->internalDate)/1000; 

    $date = date('Y-m-d H-i-s', $timestamp); 

    foreach ($parts as $part) { 
     if($part->mimeType == 'application/pdf'){ 
      $attachmentId = $part['body']['attachmentId']; 
     } 
    } 

    $data = $service->users_messages_attachments->get($user, $messageId, $attachmentId); 
    $data = $data->data; 
    $data = strtr($data, array('-' => '+', '_' => '/')); 

    $filename = "Car2Go " . $date . ".pdf"; 

    if(!file_exists($filename)){ 
     $fh = fopen($filename, "w+"); 
     fwrite($fh, base64_decode($data)); 
     fclose($fh); 
    } 
    else{ 
     'File ' . $filename . 'already exists!'; 
    } 

    echo "\n"; 
}