Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检索单个/多个附件Gmail API PHP_Php_Api_Gmail_Gmail Api - Fatal编程技术网

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

检索单个/多个附件Gmail API PHP,php,api,gmail,gmail-api,Php,Api,Gmail,Gmail Api,我正在尝试使用Gmail API PHP获取邮箱中所有附件的列表。我在某个点上被卡住了,但我真的不知道在哪里。下面是我用来获取消息内容的代码,当我试图获取附件时,它不知怎么地失败了 我想获取与我的“q”查询对应的所有消息的文件名和附件ID。这是我的密码: function atta($service, $userId, $expeditor) { try { unset($optParams

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

          }



函数atta($service、$userId、$expeditor)
{
尝试
{
未结算($optParamsamz);
$optParamsamz=[];
$optParamsamz['maxResults']=10;//只返回5条消息
$optParamsamz['q']=“has:attachment大于:10000000”;//仅在收件箱中显示邮件
$messagesamz=$service->users\u messages->listUsersMessages('me',$optParamsamz);
$listamz=$messagesamz->getMessages();
$idlist=array();
foreach($listamz作为$key=>$value){
$message=$service->users\u messages->get('me',$value['id');
$array_message=$message->getPayload();
打印(数组消息);
回声“

”; } } 捕获(例外$e) { 打印“出现错误:”。$e->getMessage(); } }
我想你现在已经解决了这个问题,但是我在谷歌的API上挣扎了一段时间,当然,我在这里寻求帮助,所以我想这个答案可能会帮助其他人

您的代码看起来不错,所以我假设问题是在获取消息详细信息之后,在尝试检索附件时。在处理附件时,我注意到一件奇怪的事情,即附件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是我们上面得到的partid数组):

这将根据附件详细信息设置标题,并以正确的格式下载文件


他们的API非常简单,但是他们没有提供足够的示例,所以很容易陷入困境。我知道我做到了:)。为了解决这个问题,我为Gmail的API创建了一个包装器,所以如果您觉得它有用,请点击这里-

上面@trajchevska的回答很有帮助,但不幸的是,对有效负载部分进行迭代将无法捕获一些附件,如消息正文中的图像,这些附件是部分中的部分。要获得这些,您需要递归地迭代各个部分。我是这样做的:

函数getAttachments($message\u id,$parts){ $attachments=[]; foreach($parts作为$part){ 如果(!empty($part->body->attachmentId)){ $attachment=$this->service->users\u messages\u attachments->get('me',$message\u id,$part->body->attachmentId); $attachments[]=[ 'filename'=>$part->filename, “mimeType”=>$part->mimeType, 'data'=>strtr($attachment->data,'-",'+/')) ]; }如果(!空($part->parts)){ $attachments=array_merge($attachments,$this->getAttachments($message_id,$part->parts)); } } 返回$attachments; } 在上面的示例中,
$this->service
是一个经过身份验证的
Google\u service\u Gmail()
实例(与问题中相同)。在类中调用上述方法的方式如下:

$attachments=$this->getAttachments($message->id,$message->getPayload()->parts);

这将在数组中获取文件名、mime类型和base64编码数据。

我对php不是很在行,但我很久以前就知道了。也许你可以在那里得到一些灵感,直到php专业人士看到这个问题:)非常感谢!这对我来说并没有什么帮助,因为我会在JS中找到一些线索。如果有人对PHP有一些指导:)我在Java中解析附件信息时遇到的最大问题是负载部分可以嵌套。最后,我不得不创建一个递归方法,在MessageParts上进行迭代,并在获取文件名和附件ID之前检查每个主体。正如您所说,我正在尝试查找示例或从java示例中进行调整。遗憾的是,php示例并不多。谢谢确实如此。看看我共享的包,它包含了Gmail API的大部分功能。如果你需要任何其他帮助,请告诉我,我觉得我在这个项目的工作中已经掌握了这一点:)干杯!
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 = $msgs->getAttachment($_GET['messageId'],$_GET['part_id']);
foreach ($attachment['data']['headers'] as $key => $value) {
    header($key.':'.$value);
}
echo $attachment['data']['data'];