2017-08-07 87 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"; 
}