我正在创建一个项目,我可以在其中阅读 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>
这段代码运行良好,没有任何错误。 我想修改此代码并获取消息列表。但我只是无法找到正确的方法来获取消息列表。
有人可以帮助我吗?
gapi.client.gmail.users.messages.list({'userId': 'me'});
您可以了解如何解析链接文档中的响应
更新:
文档说
每个消息资源只包含一个id和一个threadId。可以使用
方法获取其他消息详细信息。messages.get
这意味着你必须做类似的事情
gapi.client.gmail.users.messages.get({
'userId': 'me',
'id' : <message_id>
});
我刚才有一个奇怪的经历。
我修改了显示
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分钟到几个小时才能生效