是否可以将 Gmail Add-ons 的当前邮件访问令牌(或等效令牌)与 Gmail API 一起使用?

Is it at all possible to use the current message access token (or equivalent) for Gmail Add-ons with the Gmail API?

背景:

Google Workspace Add-ons for Gmail 允许在 contextualTrigger 上访问 API 中的 currently-open 电子邮件,范围为:

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)

Sets the current message access token that enables the script to access the current GmailMessage properties.

Only Gmail add-on projects using Gmail current message scopes require this method.

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

问题:

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

Gmail: users.messages.get 的文档指出 https://www.googleapis.com/auth/gmail.addons.current.message.readonly 是调用此方法的有效范围,但是,对于 Gmail API.

不起作用的东西:

搜索到的功能类似于:

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

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

我认为在那种情况下,为了包含访问令牌,使用 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())

注:

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

参考文献:

已添加:

您的目标如下。

You want to use the method of "users.messages.get" of Gmail API using the scope of gmail.addons.current.message.readonly.

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

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

  • 当我看到the official document时,为了使用“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 问题跟踪器如何? Ref

答案:

目前,这是不可能的。

问题概要:

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

进一步的步骤:

  • 我已提交功能请求 here 以添加在 Apps 脚本中操作来自 GmailApp class 的消息标签的功能。请为这个问题加注星标以查看其优先级是否已提高。
    • 关于此说明,this page 已经有针对同一功能的功能请求,但由于它已有两年多没有得到 Google 的回复,我已经提交了另一个。
  • 我已使用“发送反馈”按钮为 messages.get 提交了文档反馈,以澄清范围 gmail.addons.current.message.readonly 或从页面中删除。