4

INBOX の最後の 100 件のメッセージを取得する必要があります (ヘッダーのみ)。そのために、私は現在 IMAP 拡張機能を使用してメッセージを検索して取得しています。これは 2 つのリクエスト (SEARCHとその後UID FETCH) で行われます。
1 回のリクエストで複数のメッセージを取得するのに相当する Gmail API は何ですか?
私が見つけたのはバッチ API だけで、これはかなり面倒なようです (messages:getプレーンな HTTP コードでラップされたリクエストの長いリストを作成する)。

4

5 に答える 5

12

Gmail API の場合も IMAP の場合もほとんど同じです。2 つの要求: 1 つ目は、メッセージ ID を取得するための messages.list です。次に、(バッチ処理された) 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でそれを理解するのに約1時間かかりました.

これは、直接の 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)
于 2014-06-27T00:06:41.593 に答える
8

すごい返事!
メッセージ ID に対応するメールを取得するためのバッチ リクエストを作成するために PHP の生の関数を使用したい場合は、私のものを自由に使用してください。

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

于 2015-05-13T19:55:53.197 に答える
6

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();
于 2015-05-31T09:52:57.300 に答える
1

これは、公式のGoogle API クライアントを使用した Python バージョンです。応答を同期的に処理する必要があるため、ここではコールバックを使用していないことに注意してください。

from apiclient.http import BatchHttpRequest
import json

batch = BatchHttpRequest()

#assume we got messages from Gmail query API
for message in messages:
    batch.add(service.users().messages().get(userId='me', id=message['id'],
                                             format='raw'))
batch.execute()
for request_id in batch._order:
    resp, content = batch._responses[request_id]
    message = json.loads(content)
    #handle your message here, like a regular email object
于 2018-06-07T10:25:43.383 に答える