2016-01-12 51 views
2

我嘗試使用Gmail API PHP獲取郵箱中所有附件的列表。我在某個時候被卡住了,但是我無法確定何時。以下是我用來獲取郵件內容的代碼,當我嘗試獲取附件時,它以某種方式失敗。檢索單個/多個附件Gmail API PHP

我想獲取與我的「q」查詢對應的所有消息的文件名和附件ID。這裏是我的代碼:

function atta($service, $userId, $expeditor) 
     { 
     try 
     { 
      unset($optParamsamz); 
      $optParamsamz = []; 
      $optParamsamz['maxResults'] = 10; // Return Only 5 Messages 
      $optParamsamz['q'] = "has:attachment larger_than:10000000 "; // Only show messages in Inbox 
      $messagesamz = $service->users_messages->listUsersMessages('me',$optParamsamz); 
      $listamz = $messagesamz->getMessages(); 
      $idlist = array(); 
      foreach ($listamz as $key => $value) { 
      $message = $service->users_messages->get('me', $value['id']); 
      $array_message = $message->getPayload(); 
      print_r($array_message); 
      echo "<br><br>"; 
      } 

     } 
     catch (Exception $e) 
     { 
      print 'An error occurred: ' . $e->getMessage(); 
     } 

     } 
+0

我不擅長php,但我[在JavaScript中寫了一個輕量級的解決方案](https://github.com/EmilTholin/gmail-api-parse-message/blob/master/lib/index.js ) 一會兒回來。也許你可以得到一些靈感,直到一個php-pro看到這個問題:) – Tholle

+1

非常感謝!它並不能真正幫助我,因爲我在JS中使用s_ck,但我會盡力在那裏找到一些線索。如果任何人在PHP中有一些準則:) – justberare

+1

我在解析Java中的附件信息時遇到的最大問題是有效載荷部分可以嵌套。最後,我必須創建一個遍歷MessageParts的遞歸方法,並在獲取文件名和附件ID之前檢查每個正文。 –

回答

2

我想你已經解決了這個到現在爲止,但我與谷歌的API了一陣掙扎,當然,看了幫助在這裏,所以我想這個答案可以幫助別人。

您的代碼看起來不錯,所以我假設問題出現在獲取消息詳細信息後,嘗試檢索附件時。我在處理附件時注意到了一件奇怪的事情,那就是attachment_id不一致,並且隨着對消息細節的不同調用而改變,因此我決定不使用該標識符作爲標識符,而是使用不改變的part_id。因此,在獲得有效載荷後,我這樣做:

$messageDetails = $message->getPayload(); 
foreach ($messageDetails['parts'] as $key => $value) { 
    if (!isset($value['body']['data'])) { 
     array_push($files, $value['partId']); 
    } 
} 

現在,您的消息中包含附件的部件的ID。接下來,您想獲取附件的所有可能的詳細信息,以便您可以重新構建文件並啓用下載。您需要文件名和其他詳細信息,這些信息僅與消息詳細信息和附件數據一起返回,這些信息作爲附件詳細信息的一部分返回。

我粘貼getAttachment函數作爲一個整體。

public function getAttachment($messageId, $partId) 
{ 
    try { 
     $files = []; 
     $gmail = new Google_Service_Gmail($this->authenticate->getClient()); 
     $attachmentDetails = $this->getAttachmentDetailsFromMessage($messageId, $partId); 
     $attachment = $gmail->users_messages_attachments->get($this->authenticate->getUserId(), $messageId, $attachmentDetails['attachmentId']); 
     if (!$attachmentDetails['status']) { 
      return $attachmentDetails; 
     } 
     $attachmentDetails['data'] = $this->base64UrlDecode($attachment->data); 
     return ['status' => true, 'data' => $attachmentDetails]; 
    } catch (\Google_Service_Exception $e) { 
     return ['status' => false, 'message' => $e->getMessage()]; 
    } 
} 

附件列表(你已經有了$ MESSAGEID和$文件是partIds的陣列我們上面得到):

if(!empty($files)) { 
    foreach ($files as $key => $value) { 
     echo '<a target="_blank" href="attachment.php?messageId='.$messageId.'&part_id='.$value.'">Attachment '.($key+1).'</a><br/>'; 
    } 
} 

當用戶打開attachment.php:

$attachment = $msgs->getAttachment($_GET['messageId'],$_GET['part_id']); 
foreach ($attachment['data']['headers'] as $key => $value) { 
    header($key.':'.$value); 
} 
echo $attachment['data']['data']; 

這將根據附件詳細信息設置標題並以正確的格式下載文件。

他們的API非常簡單,但他們沒有提供足夠的示例,所以很容易被某些東西卡住。我知道我做到了:)。在此基礎上,我爲Gmail的API創建了一個包裝器,因此如果您覺得它有用,請在這裏 - https://packagist.org/packages/adevait/gmail-wrapper

+0

正如你我試圖找到示例或從java示例適應。這是一個恥辱,沒有很多PHP的例子。謝謝! – LeoPucciBr

+0

確實如此。看看我分享的軟件包,它包含了Gmail API的大部分功能。讓我知道如果你需要任何其他幫助,我覺得我已經在這個項目的工作中掌握了這個:)乾杯! – trajchevska