批量提取消息性能

时间:2014-06-26 20:36:43

标签: gmail-api

我需要在INBOX中获取最后100条消息(仅限标题)。为此我正在使用IMAP扩展来搜索然后获取消息。这是通过两个请求完成的(SEARCH然后是UID FETCH Gmail API相当于在一个请求中获取多条消息?
我所能找到的只是一个批处理API,这看起来更麻烦(组成一个包含在纯HTTP代码中的messages:get个请求的长列表)。

5 个答案:

答案 0 :(得分:11)

在Gmail API中与在IMAP中几乎相同。两个请求:首先是messages.list来获取消息ID。然后是一个(批处理的)message.get来检索你想要的那些。根据您使用客户端库的语言,可能有助于批量请求构建。

  

批处理请求是使用multipart / mixed内容类型包含多个Google Cloud Storage JSON API调用的单个标准HTTP请求。在该主HTTP请求中,每个部分都包含嵌套的HTTP请求。

来自:https://developers.google.com/storage/docs/json_api/v1/how-tos/batch

真的不是那么难,即使没有python客户端库(仅使用httplib和mimelib),我花了大约一个小时才能在python中找到它。

这是一个部分代码片段,再次使用直接python。希望它清楚地表明那里并没有太多参与:

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)

答案 1 :(得分:4)

很好的回复!
如果有人想在php中使用原始函数来发送批量请求以获取与消息ID相对应的电子邮件,请随意使用我的。

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;

}

仅供参考,以上功能只获取电子邮件的标题,特别是From和Date字段,请根据api文档进行调整https://developers.google.com/gmail/api/v1/reference/users/messages/get

答案 2 :(得分:4)

除了MaK,您还可以使用google-api-php-clientGoogle_Http_Batch()

执行多个批量请求
        $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();

答案 3 :(得分:1)

来自 Walty Yeung 的解决方案部分适用于我的用例。 如果你们尝试了代码并且没有任何反应,请使用此批处理

batch = service.new_batch_http_request()

答案 4 :(得分:0)

这是python版本,使用官方google api client。请注意,我没有在这里使用回调,因为我需要以同步的方式处理响应。

SELECT status, count(*) count
FROM your_table
GROUP BY status;