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