如何在gmail api中将消息显示为列表?

问题描述 投票:0回答:2

我正在创建一个项目,我可以在其中阅读 gmail 的消息。我在显示消息列表时遇到问题。我刚刚快速启动了获取标签的示例代码。

https://developers.google.com/gmail/api/quickstart/js#step_1_set_up_the_sample

<!DOCTYPE html>
<html>
  <head>
    <title>Gmail API Quickstart</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <p>Gmail API Quickstart</p>

    <button id="authorize_button" onclick="handleAuthClick()">Authorize</button>
    <button id="signout_button" onclick="handleSignoutClick()">Sign Out</button>

    <pre id="content" style="white-space: pre-wrap;"></pre>

    <script type="text/javascript">

      const CLIENT_ID = 'XXXXX-XXXXXXXXXXXXX.apps.googleusercontent.com';
      const API_KEY = 'XXXXXXXXXXXXXXXX';

      const DISCOVERY_DOC = 'https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest';

      const SCOPES = 'https://www.googleapis.com/auth/gmail.readonly';

      let tokenClient;
      let gapiInited = false;
      let gisInited = false;

      document.getElementById('authorize_button').style.visibility = 'hidden';
      document.getElementById('signout_button').style.visibility = 'hidden';

      function gapiLoaded() {
        gapi.load('client', intializeGapiClient);
      }

      async function intializeGapiClient() {
        await gapi.client.init({
          apiKey: API_KEY,
          discoveryDocs: [DISCOVERY_DOC],
        });
        gapiInited = true;
        maybeEnableButtons();
      }

      function gisLoaded() {
        tokenClient = google.accounts.oauth2.initTokenClient({
          client_id: CLIENT_ID,
          scope: SCOPES,
          callback: '', // defined later
        });
        gisInited = true;
        maybeEnableButtons();
      }

      function maybeEnableButtons() {
        if (gapiInited && gisInited) {
          document.getElementById('authorize_button').style.visibility = 'visible';
        }
      }

      function handleAuthClick() {
        tokenClient.callback = async (resp) => {
          if (resp.error !== undefined) {
            throw (resp);
          }
          document.getElementById('signout_button').style.visibility = 'visible';
          document.getElementById('authorize_button').innerText = 'Refresh';
          await listLabels();
        };

        if (gapi.client.getToken() === null) {
          tokenClient.requestAccessToken({prompt: 'consent'});
        } else {
          tokenClient.requestAccessToken({prompt: ''});
        }
      }

      function handleSignoutClick() {
        const token = gapi.client.getToken();
        if (token !== null) {
          google.accounts.oauth2.revoke(token.access_token);
          gapi.client.setToken('');
          document.getElementById('content').innerText = '';
          document.getElementById('authorize_button').innerText = 'Authorize';
          document.getElementById('signout_button').style.visibility = 'hidden';
        }
      }

      async function listLabels() {
        let response;
        try {
          response = await gapi.client.gmail.users.labels.list({
            'userId': 'me',
          });
        } catch (err) {
          document.getElementById('content').innerText = err.message;
          return;
        }
        const labels = response.result.labels;
        if (!labels || labels.length == 0) {
          document.getElementById('content').innerText = 'No labels found.';
          return;
        }
        const output = labels.reduce(
            (str, label) => `${str}${label.name}\n`,
            'Labels:\n');
        document.getElementById('content').innerText = output;
      }
    </script>
    <script async defer src="https://apis.google.com/js/api.js" onload="gapiLoaded()"></script>
    <script async defer src="https://accounts.google.com/gsi/client" onload="gisLoaded()"></script>
  </body>
</html>

这段代码运行良好,没有任何错误。 我想修改此代码并获取消息列表。但我只是无法找到正确的方法来获取消息列表。

有人可以帮助我吗?

javascript google-cloud-platform google-api gmail-api
2个回答
1
投票
  1. 是标签的文档。将其与您的标签示例代码进行比较。

  2. 然后尝试对消息遵循相同的原则。这是messages的文档。在第 1 条之后,获取消息列表的代码可能类似于

    gapi.client.gmail.users.messages.list({'userId': 'me'});

您可以了解如何解析链接文档中的响应

更新:

文档说

每个消息资源只包含一个id和一个threadId。可以使用

messages.get
方法获取其他消息详细信息。

这意味着你必须做类似的事情

  gapi.client.gmail.users.messages.get({
    'userId': 'me',
    'id' : <message_id>
    });

0
投票

对于新创建的 OAuth 令牌 - 尝试等待!

我刚才有一个奇怪的经历。

我修改了显示

labels
的示例来搜索
messages
但收到错误:

var messages = await gapi.client.gmail.users.messages.list({
    'userId': 'me',
    'q': 'from:[email protected]'
});

此 API 不支持 API 密钥。预期的 OAuth2 访问令牌 或其他断言主体的身份验证凭证。看 https://cloud.google.com/docs/authentication”

好的,所以

labels
仅适用于 API 密钥,而
messages
则不行。

我尝试删除

q
参数以匹配上面的示例,突然它就起作用了。于是我开始尝试弄清楚这可能意味着什么,但一无所获。

然后我再次将其添加回来,它立即起作用了!

所以我只能得出结论,新创建的凭证可能没有完全初始化。

事实上他们也这么说:

注意:设置可能需要5分钟到几个小时才能生效

© www.soinside.com 2019 - 2024. All rights reserved.