【问题标题】:Unable to retrieve message content after Google Pub/Sub webhook call to serverGoogle Pub/Sub webhook 调用服务器后无法检索消息内容
【发布时间】:2017-09-12 08:15:54
【问题描述】:

我订阅了 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"}

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

【问题讨论】:

  • 似乎不知何故,发送的请求默认使用metadata/minimalformat。我没有深入研究 Google Pub/Sub,但可能只是缺少一个参数。
  • 如果是这样,我想知道您应该如何指定推送请求的格式。 watch 请求本身并没有为此提供参数,我也没有看到控制台推送请求的任何配置。

标签: gmail gmail-api google-cloud-pubsub


【解决方案1】:

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

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

希望对你有帮助。

【讨论】:

  • 如何获取初始消息?
  • @squixy 初始消息是指如何获取您的第一个 historyId?如果是这样,您可以通过调用watch 端点来获取它。
  • 第一个historyId 允许我以后从该点获取消息,因此它无法获取第一条消息(导致 webhook 的消息)。
  • @squixy 我不确定是否理解。您使用 watch 订阅(为您提供 historyId)。然后在您的 webhook 上的通知中,您 list 您从手表获得的 historyId 的历史记录。列出历史记录后,您将当前的 historyId 替换为您刚刚获取的历史记录列表的最后一个。或者我可能误解了你的问题。
猜你喜欢
  • 2018-10-27
  • 1970-01-01
  • 2019-04-10
  • 2021-08-20
  • 2017-10-15
  • 2021-09-28
  • 2023-03-26
  • 2021-04-26
  • 1970-01-01
相关资源
最近更新 更多