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

Unable to retrieve message content after Google Pub/Sub webhook call to server

我已经订阅了 Google Cloud Pub/Sub,创建了一个主题并使用指向我服务器上 URL 的 webhook 创建了一个订阅。然后,我使用 Gmail API 在我在 Gmail 帐户中创建的特定标签上调用 watch,并将其与我创建的主题相关联。

当我的邮件到达我的 Gmail 帐户中的标签时,webhook 会触发对我服务器上的 URL 的 POST 请求。但是不管邮件的内容是什么,POST正文总是这样的:

{
    "message": {
        "attributes": {},
        "data": "eyJlbWFpbEFkZHJlc3MiOiJteWVtYWlsQG15ZG9tYWluLmNvbSIsImhpc3RvcnlJZCI6MTIzNDU2N30K",
        "messageId": "12345678900000", # only relevant to Pub/Sub
        "message_id": "12345678900000",
        "publishTime": "2017-04-16T15:42:08.968Z",
        "publish_time": "2017-04-16T15:42:08.968Z"
    },
    "subscription": "projects/proj-name/subscriptions/sub-name"
} 

data 字段是 Base64 编码的,在本例中是:

{"emailAddress":"myemail@mydomain.com","historyId":1234567}

这就是我每次收到的邮件,无论电子邮件内容是什么。但是,如果 运行 来自 google 开发人员控制台的发布测试,data 字段中的 base64 编码值是我指定的实际消息字符串。

我尝试使用来自 base64 解码 data 值的 historyId 通过 Gmail API 对 history.list 进行后续调用,但我得到的只是一个响应这个:

{"historyId": "1234567"}

我应该如何获取电子邮件内容?

有点晚了,但其他人可能会感兴趣。答案是。 基本上你从 watch 调用中得到一个 historyId。存储它。 然后当您收到来自 Gmail 的通知时:

  • 跟踪 historyId
  • 使用存储的 historyId(来自 watch 调用)获取历史列表 (gmail.users.history.list)
  • 从历史记录中导入所有需要的消息
  • 完成后,将当前的 historyId 替换为通知中的 historyId。

希望对您有所帮助。