检索单个/多个附件 Gmail API PHP

jus*_*are 3 php api gmail gmail-api

我正在尝试使用 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();
            }

          }


Run Code Online (Sandbox Code Playgroud)

bil*_*oah 5

上面@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;
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,$this->service是一个经过身份验证的Google_Service_Gmail()实例(与问题中相同)。上述方法在您的类中被调用为:

$attachments = $this->getAttachments($message->id, $message->getPayload()->parts);
Run Code Online (Sandbox Code Playgroud)

这将为您提供数组中的文件名、mime 类型和 base64 编码数据。