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

RTF*_*RTF 6 gmail gmail-api google-cloud-pubsub

我订阅了 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"
} 
Run Code Online (Sandbox Code Playgroud)

data字段是 Base64 编码的,在这种情况下是:

{"emailAddress":"myemail@mydomain.com","historyId":1234567}
Run Code Online (Sandbox Code Playgroud)

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

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

{"historyId": "1234567"}
Run Code Online (Sandbox Code Playgroud)

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

jbo*_*oga 6

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

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

希望能帮助到你。

  • @squixy 我不确定是否理解。您使用 watch 订阅(它为您提供一个 historyId)。然后在您的网络钩子上的通知中,您[列出](https://developers.google.com/gmail/api/v1/reference/users/history/list) 从手表获得的 historyId 的历史记录。完成历史记录后,您将当前的 historyId 替换为您刚刚获取的最后一个历史记录列表。或者我可能误解了你的问题。 (2认同)