2

背景:

适用于 Gmail 的 Google Workspace 插件允许在 contextualTrigger 上访问 API 中当前打开的电子邮件,范围为:

https://www.googleapis.com/auth/gmail.addons.current.message.readonly

必须使用访问令牌传递访问令牌GmailApp.setCurrentMessageAccessToken(accessToken)才能授予对当前打开的电子邮件的访问权限:

var accessToken = e.gmail.accessToken;
var messageId = e.gmail.messageId;

// The following function enables short-lived access to the current
// message in Gmail. Access to other Gmail messages or data isn't
// permitted.
GmailApp.setCurrentMessageAccessToken(accessToken);
var mailMessage = GmailApp.getMessageById(messageId);

从上面的文档:

setCurrentMessageAccessToken(accessToken)

设置使脚本能够访问当前属性的当前消息访问令牌。GmailMessage

只有使用 Gmail当前邮件范围的 Gmail 插件项目需要此方法。

不幸的是,访问令牌和当前消息范围页面的链接目前都已损坏并导致 404 页,因此我无法从此处找到更多信息。

问题:

如何直接使用 Gmail API 而不是使用 Gmail API 来实现相同的功能GmailApp

Gmail的文档:users.messages.get声明这是调用此方法的有效范围,但是, Gmail APIhttps://www.googleapis.com/auth/gmail.addons.current.message.readonly似乎没有等效的范围。GmailApp.setCurrentMessageAccessToken(accessToken)

不起作用的事情:

  • 使用ScriptApp.getOAuthToken()- 根据文档,“启用 Gmail 范围的访问令牌与返回的访问令牌不同ScriptApp.getOAuthToken()。您必须使用操作事件对象中提供的令牌。”
  • 将事件对象中的访问令牌作为Authorization: Bearer标头中的令牌提供也会引发 403 错误。

搜索到的功能类似于:

var accessToken = e.gmail.accessToken
var messageId = e.gmail.messageId

Gmail.setCurrentMessageAccessToken(accessToken) // made up method
var mailMessage = Gmail.Users.Messages.get("me", messageId)
4

2 回答 2

2

我认为在这种情况下,为了包含访问令牌,使用 UrlFetchApp 直接向 Gmail API 的端点请求如何?当您的脚本被转换时,它变成如下。在这种情况下,可以从Authorization Scopes中选择范围。

示例脚本:

var accessToken = "###";
var messageId = "###";
var userId = "me";
var url = `https://gmail.googleapis.com/gmail/v1/users/${userId}/messages/${messageId}`;
var res = UrlFetchApp.fetch(url, {headers: {authorization: `Bearer ${accessToken}`}});
console.log(res.getContentText())

笔记:

  • 在这种情况下,请注意范围。参考

参考:

添加:

您的目标如下。

您想使用 Gmail API 的“users.messages.get”方法,使用gmail.addons.current.message.readonly.

根据我们在评论中的讨论,我将目前的情况总结如下。

  • 当我从设置清单文件的 GAS 项目检索的访问令牌中检查包含范围时ScriptApp.getOAuthToken(),我可以确认 和 的gmail.addons.current.message.readonly范围script.external_request

  • 当我看到官方文档时,为了使用“users.messages.get”的方法,gmail.addons.current.message.readonly如图所示Requires one of the following OAuth scopes:

  • 但是,当范围gmail.addons.current.message.readonly用于“users.messages.get”的方法时,Missing access token for authorization.就会出现类似的错误。

  • 当包含范围时gmail.readonly,可以删除错误。

根据上述情况,如何将其报告给 Google 问题跟踪器?参考

于 2021-04-23T08:02:45.273 回答
2

回答:

目前,这是不可能的。

问题概要:

  • GmailApp没有允许在单个消息上操作标签的方法或类,只有线程。
  • 上下文触发器中accessToken提供的 似乎与 OAuth 令牌不同,因此不能用于对读取当前消息的调用进行身份验证。
  • 无法通过 Gmail API 传递令牌,以便可以使用当前消息。
  • 获取消息的唯一方法是使用诸如之类的范围gmail.readonly
  • 虽然https://www.googleapis.com/auth/gmail.addons.current.message.readonly被列为 的有效范围messages.get,但在连接到 Gmail API 时似乎没有任何方法可以实际使用该范围。

进一步的步骤:

  • 我在这里提交了一个功能请求,以添加在 Apps 脚本中从 GmailApp 类操作消息标签的功能。请对此问题加注星标以查看其优先级增加。
    • 在此说明中,此页面上已经有针对相同功能的功能请求,但由于它已经使用了两年多而没有 Google 的回复,我已经提交了另一个请求。
  • 我已经使用发送反馈按钮为messages.getgmail.addons.current.message.readonly提交了文档反馈,以澄清范围或从页面中删除。
于 2021-04-27T08:29:56.620 回答