Gmail API 无法向 Pub/Sub 平台发布任何消息

Posted

技术标签:

【中文标题】Gmail API 无法向 Pub/Sub 平台发布任何消息【英文标题】:Gmail API can't publish any message to Pub/Sub platform 【发布时间】:2020-03-17 02:42:03 【问题描述】:

我已经在 GCP 中设置了所有内容。在我手动发布消息后,我的服务器可以接收消息。 但问题是:当我向邮箱账户发送邮件时,Pub-Sub 系统和我的 webhook 服务器没有任何通知!

下图是我手动发布消息后我的服务器可以收到消息的证明。

如上图,当我调用list history API时,可以查看到有没有我刚刚发送的测试邮件信息。

另外,我已经成功调用了watch API,它返回了:

'historyId': '7688', 'expiration': '1574928158379'

这是我的手表电话:

In [9]:     def set_watch(self, topicName):
   ...:         request = 
   ...:             'labelIds': ['INBOX', 'UNREAD', 'STARRED'],
   ...:             'labelFilterAction': 'include',
   ...:             #'labelIds': ['UNREAD'],
   ...:             'topicName': topicName
   ...:         
   ...:         res = self.service.users().watch(
   ...:             userId=self.userId, body=request).execute()
   ...:         print(res)

【问题讨论】:

watch api好像没用,但是正常返回。 您是否将publish 权限授予gmail-api-push@system.gserviceaccount.com 如何检查。而且我认为这不像权限问题。 我还没有测试过,但我问是因为它是说明here 中的必需步骤之一,它还显示了如何添加它们。如果是这样,您应该会在 GCP 控制台中看到未经授权的 Pub/Sub API 调用 你是对的,在阅读了文档并再次思考之后,我弄清楚了我错过了什么。我错过了添加gmail-api-push@system.gserviceaccount.com 的步骤,非常感谢! 【参考方案1】:

set_watch 调用返回 200HistoryId 以及有效的 expiration 这一事实让我认为手表设置正确,问题可能出在 Pub/Sub 方面。

您可以发布到主题并触发服务器响应的测试的不同之处在于您使用的是您的一个帐户。根据文档here,观看消息是使用 Google 管理的服务帐户发布的:

Cloud Pub/Sub 要求您授予 Gmail 权限才能发布 通知您的主题。

为此,您需要授予发布权限 gmail-api-push@system.gserviceaccount.com。您可以使用 Cloud Pub/Sub Developer Console 权限界面如下 资源级访问控制指令。

链接指向here 和here 的位置。遵循最低权限原则,我建议授予资源(主题)级别的权限。

注意:

面板中的设置如下所示:

【讨论】:

以上是关于Gmail API 无法向 Pub/Sub 平台发布任何消息的主要内容,如果未能解决你的问题,请参考以下文章

如何在注册过程中获取多个谷歌凭据(Gmail API、Pub/Sub、联系人)

Google Cloud Pub/Sub API - 推送电子邮件

GMail 停止发送推送通知

Google Pub/Sub webhook 调用服务器后无法检索消息内容

Gmail推送通知Python API

使用 Codelabs 教程通过 Cloud Functions 访问 Gmail API