首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >批取消息性能

批取消息性能
EN

Stack Overflow用户
提问于 2014-06-26 20:36:43
回答 5查看 4.2K关注 0票数 4

我需要在收件箱中得到最后100条消息(只有标题)。为此,我目前正在使用IMAP扩展来搜索并获取消息。这是通过两个请求(SEARCHUID FETCH)完成的。

Gmail相当于在一个请求中获取多个消息?

我所能找到的只是一个批处理API,这看起来要麻烦得多(用普通的HTTP代码组成一长串messages:get请求)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2014-06-27 00:06:41

它在Gmail中和IMAP中几乎是一样的。两个请求:第一个是获取消息ids的messages.list。然后是一个(批处理) message.get来检索您想要的那些。根据您使用的语言,客户端库可能有助于批量请求的构造。

批处理请求是一个包含多个调用的单一标准HTTP请求,使用多部分/混合内容类型。在该主HTTP请求中,每个部分都包含一个嵌套的HTTP请求。

来自:api/v1/how/批处理

这并不难,即使没有python客户端库(只使用httplib和mimelib),我也要花大约一个小时才能在python中找到它。

下面是部分代码片段,同样使用直接python。希望它能清楚地表明,没有太多的牵扯:

代码语言:javascript
运行
复制
msg_ids = [msg['id'] for msg in body['messages']]
headers['Content-Type'] = 'multipart/mixed; boundary=%s' % self.BOUNDARY

post_body = []
for msg_id in msg_ids:
  post_body.append(
    "--%s\n"
    "Content-Type: application/http\n\n"
    "GET /gmail/v1/users/me/messages/%s?format=raw\n"
    % (self.BOUNDARY, msg_id))
post_body.append("--%s--\n" % self.BOUNDARY)
post = '\n'.join(post_body)
(headers, body) = _conn.request(
    SERVER_URL + '/batch',
    method='POST', body=post, headers=headers)
票数 12
EN

Stack Overflow用户

发布于 2015-05-13 19:55:53

回答得好!

如果有人想使用php中的原始函数来批量请求获取与消息in对应的电子邮件,请随意使用我的。

代码语言:javascript
运行
复制
function perform_batch_operation($auth_token, $gmail_api_key, $email_id, $message_ids, $BOUNDARY = "gmail_data_boundary"){
    $post_body = "";
    foreach ($message_ids as $message_id) {
        $post_body .= "--$BOUNDARY\n";
        $post_body .= "Content-Type: application/http\n\n";
        $post_body .= 'GET https://www.googleapis.com/gmail/v1/users/'.$email_id.
                '/messages/'.$message_id.'?metadataHeaders=From&metadataHeaders=Date&format=metadata&key='.urlencode($gmail_api_key)."\n\n";
    }
    $post_body .= "--$BOUNDARY--\n";

    $headers = [ 'Content-type: multipart/mixed; boundary='.$BOUNDARY, 'Authorization: OAuth '.$auth_token  ];

    $curl = curl_init();
    curl_setopt($curl,CURLOPT_URL, 'https://www.googleapis.com/batch' );
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl,CURLOPT_CONNECTTIMEOUT , 60 ) ;
    curl_setopt($curl, CURLOPT_TIMEOUT, 60 ) ;
    curl_setopt($curl,CURLOPT_POSTFIELDS , $post_body);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,TRUE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,0);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    $tmp_response =  curl_exec($curl);
    curl_close($curl);
    return $tmp_response;

}

上述函数只获取电子邮件的标题,特别是“发件人”和“日期”字段,请根据api文档https://developers.google.com/gmail/api/v1/reference/users/messages/get进行调整。

票数 8
EN

Stack Overflow用户

发布于 2015-05-31 09:52:57

除了MaK之外,您还可以使用google php-clientGoogle_Http_Batch()执行多个批处理请求

代码语言:javascript
运行
复制
        $optParams = [];
        $optParams['maxResults'] = 5;
        $optParams['labelIds'] = 'INBOX'; // Only show messages in Inbox
        $optParams['q'] = 'subject:hello'; // search for hello in subject

        $messages = $service->users_messages->listUsersMessages($email_id,$optParams);

        $list = $messages->getMessages();

            $client->setUseBatch(true);

            $batch = new Google_Http_Batch($client);                

            foreach($list as $message_data){

                $message_id = $message_data->getId();

                $optParams = array('format' => 'full');

                $request = $service->users_messages->get($email_id,$message_id,$optParams);

                $batch->add($request, $message_id);                 
            }

            $results = $batch->execute();
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24439764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档