[英]Retrieve single/multiple attachments 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();
}
}
@trajchevska 的回答很有幫助,但不幸的是,迭代有效負載部分不會捕獲某些附件,例如消息正文中的圖像,這些附件是部分中的部分。 要獲得這些,您需要遞歸地迭代零件。 我這樣做:
function getAttachments($message_id, $parts) {
$attachments = [];
foreach ($parts as $part) {
if (!empty($part->body->attachmentId)) {
$attachment = $this->service->users_messages_attachments->get('me', $message_id, $part->body->attachmentId);
$attachments[] = [
'filename' => $part->filename,
'mimeType' => $part->mimeType,
'data' => strtr($attachment->data, '-_', '+/')
];
} else if (!empty($part->parts)) {
$attachments = array_merge($attachments, $this->getAttachments($message_id, $part->parts));
}
}
return $attachments;
}
在上面的示例中, $this->service
是經過身份驗證的Google_Service_Gmail()
實例(與問題中的相同)。 上面的方法在你的類中被調用為:
$attachments = $this->getAttachments($message->id, $message->getPayload()->parts);
這將為您提供文件名、MIME 類型和數組中的 base64 編碼數據。
我假設你到現在為止已經解決了這個問題,但我在谷歌的 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 和 $files 是我們上面得到的 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 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.