【问题标题】:Setting up Gmail Push Notification for a specific email having attachments为带有附件的特定电子邮件设置 Gmail 推送通知
【发布时间】:2020-08-25 08:52:16
【问题描述】:

我正在尝试设置 Gmail 推送通知,以便为收件箱中收到的任何新电子邮件创建监视请求。到目前为止,这很好。但是,我正在尝试按照此处所述创建监视请求:

https://developers.google.com/gmail/api/guides/push#getting_gmail_mailbox_updates

我想为从特定电子邮件 (info@abc.com) 地址收到的任何电子邮件设置监视请求,该地址的主题行为“[重要]”并带有 PDF 附件。

知道是否可以设置这样的监视请求吗?

目前,我正在阅读过去 24 小时内收到的使用 imaplib 的所有来自 INBOX 的电子邮件,并手动搜索具有主题行和附件的电子邮件。但是,我相信,这种解决方案并不理想。

【问题讨论】:

  • watch 请求无法在此级别自定义,但您可以 (1) 获取所有收件箱的推送通知,(2) 调用 history.list 以获取更改的详细信息和 (3)使用对history.list 的回复正文将消息过滤到仅来自特定电子邮件且具有特定主题且具有PDF 附件的消息。你认为这对你来说是一个很好的解决方案吗?如果是这种情况,我会发布一个答案,其中包含有关相应工作流程的更多详细信息。
  • 非常感谢您的回答。请详细说明,我会探索这个。

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


【解决方案1】:

问题:

您可以应用于 Gmail 推送通知的唯一过滤器是从哪个标签/s 中检索通知,如 here 所示。因此,在此阶段无法根据(1)谁发送消息,(2)电子邮件主题和(3)电子邮件是否具有特定的PDF附件来过滤消息,而是在收到通知之后进行。不过幸运的是,您无需手动查找这些消息,您可以编写应用程序来为您完成这项工作。

工作流程:

- 步骤 #1。为所有 INBOX 设置通知并检索 startHistoryId:如前所述,您必须接收所有 INBOX 的通知,因为没有更具体的过滤器可用。调用Users: watch,在labelIds 字段中提供INBOX,在topicName 中提供topic you created,将有效地配置通知。对watch 的回复有this shape

{
  historyId: 1234567890
  expiration: 1431990098200
}

其中historyId 指邮箱的当前状态。让我们将它存储在某个地方,并称之为startHistoryId

- 步骤 #2。获取 INBOX 更改:完成第 1 步后,每当您的 INBOX 发生更改时,您的应用程序都会收到描述更改的通知消息。每当收到通知时,您都想获取有关对 INBOX 所做的特定更改的信息,为此,您应该致电 history.list()

也就是说,您的应用程序应该在每次收到通知时调用history.list()。现在,您想要获取自上次以来的更改,这就是为什么您应该提供在步骤 1 中检索到的 historyId 作为参数 startHistoryId。如果您只想检索新邮件(而不是删除或标签编辑/删除),您可以将historyTypes 设置为messageAdded。请求可能是这样的:

{
  userId: “your-email-address”,
  historyTypes: “messageAdded”,
  startHistoryId: “your-start-history-id”
}

作为响应,您会得到如下信息:

{
  "history": [
    {
      "id": unsigned long,
      "messages": [
        users.messages Resource
      ],
      "messagesAdded": [
        {
          "message": users.messages Resource
        }
      ]
    }
  ],
  "nextPageToken": string,
  "historyId": unsigned long
}

在这里,您应该检索 historyId将在下次调用 history.list() 时用作 startHistoryId,以及 messagesAdded ,其中包含您要查找的新邮件的IDs(似乎只填充了IDthreadId)。

- 第 3 步:过滤消息:现在您有了自上次 (messagesAdded) 以来已更改的消息 IDs 的列表,您想知道其中哪些符合您的条件.要知道这一点,您必须遍历messagesAdded 中的所有IDs,并为每个ID 调用Users.messages: get。这将返回相应的message resource。对于每条消息,您必须检查是否满足条件:

  • 发件人电子邮件:在资源内部,访问headers(message[“payload”][“headers”]),然后循环遍历它们,寻找@ 987654357@ 是From。你要检查对应的value是不是你要找的邮箱。

  • 主题:与步骤 (a) 一样,访问 headers 并查找 nameSubject 的标头。对应的value 是电子邮件主题。检查是否以[Important]开头。

  • 附件:您必须在message[“payload”][“parts”] 中查找电子邮件附件。该过程有点复杂,但请参阅this related question

参考:

Gmail API: Push Notifications

【讨论】:

    猜你喜欢
    • 2016-09-22
    • 2017-07-24
    • 2015-10-21
    • 2013-10-06
    • 2015-10-25
    • 1970-01-01
    • 2016-07-19
    • 2015-11-06
    • 2023-03-22
    相关资源
    最近更新 更多