当前位置: 首页 > 知识库问答 >
问题:

谷歌PubSub/Gmail Webhook:发送电子邮件时始终接收来自PubSub的多个POST请求

韩智明
2023-03-14

我看到的问题是,当我向另一个用户发送消息时,PubSub似乎在一秒钟内两次使用略有不同的history_id和message_id,但订阅名称和用户电子邮件都是相同的。

我知道PubSub保证至少一次交付,所以接收重复的消息并不是不合理的,但因为它一直在发生,而且message_id不同,我认为根据下面的PubSub文档,可能会有多个推送请求:

Cloud pub/sub为每个消息分配唯一的message_id,该消息可用于检测订阅者接收的重复消息。但是,这将不允许您检测同一数据上的多个发布请求所产生的重复项。

  1. 确保在我的Google云控制台上只有一个主题/订阅。
  2. 将Ack截止日期设置为10到600秒之间的不同值。
  3. 调用service.users().stop()以确保没有多次调用watch(),然后再次开始watch().

我已经调查了PubSubIO,以确保准确地一次交付,但我认为如果我一直收到多条PubSub,我设置Webhook的方式肯定有根本性的问题。

编辑:这是我必须观察我的Gmail帐户变化的代码。我正在使用一个具有域范围权限的服务帐户,以便访问整个域中的帐户

public static Map<String, String> watchInbox(Gmail service) throws IOException {
    Map<String, String> watchInboxResponse = new HashMap<>();
    List<String> labelsToWatch = Arrays.asList("INBOX", "SENT");
    String topicName = "projects/subscription-name/topics/topic-name";

    WatchRequest request = new WatchRequest();
    request.setLabelIds(labelsToWatch);
    request.setTopicName(topicName);

    WatchResponse response = service.users().watch("me", request).execute();

    watchInboxResponse.put("historyId", response.getHistoryId().toString());
    watchInboxResponse.put("expiration", response.getExpiration().toString());
    return watchInboxResponse;
}

我将historyid和Expersion插入到数据库中,并在收到webhook调用时使用它来检查是否需要再次调用watch(),如果从上次调用watch已经超过24小时(如Google所建议的)。

共有1个答案

卢志强
2023-03-14

我在实现Google Pub/Sub观看请求时也有类似的行为。

当你写邮件时,Gmail所做的是创建系统标签“发送和草稿”,并不断地用新的messageId和标签“发送和草稿”保存草稿,你订阅了对“收件箱和发送”的任何更改,所以你会在你的webhook上被击中两次或更多时间!!

来自Gmail的消息总是包含标签,你必须过滤那些有标签草稿的消息。

//Explicitly avoid further processing
 bool isdraft = y.Message.LabelIds.Contains("DRAFT");
 类似资料:
  • null null 谢谢!!!

  • 任何关于我如何做到这一点的想法或任何可以帮助我的例子。谢谢你。

  • 我是谷歌脚本的新手,不知道是否有人能帮我。 我有一个共享的谷歌电子表格,基本上是用新的员工信息更新行。 我希望只有当插入这些新员工行时,特定列(比如F列)上的“ABC”字符串匹配时,才会触发电子邮件。基本上,电子邮件触发器会让我们的团队知道如何设置新的员工帐户。 有人能帮我吗?我不知道如何进行字符串匹配,也不知道如何让它专门发送给固定的电子邮件收件人。我已经安装了Python、gspread和gd

  • 我是php新手,我正在制作一个从数据库获取数据的计划页面。从数据库中,我选择了电子邮件的发送时间和日期。我想做的是,如果发送日期和时间已经到了,系统应该向该地址发送电子邮件。 对于电子邮件发送,我使用此API。 这是我的代码,我应该在其中添加它来执行这样的功能。我想得到三样东西。1.从已到达时间的数据库中提取数组。2.使用循环将它们存储在数组中。3.通过循环向他们发送电子邮件。这是我的密码。

  • 我已经建立了一个谷歌表单,我的回复被记录在一个电子表格中。理想情况下,我希望回复也通过电子邮件发送。

  • 我试图从我的应用程序发送电子邮件,我在android上的电子邮件客户端中看到了应有的链接,但当我检查电子邮件接收器时,没有链接。 这是我的代码: “文本”是html。 谢谢你。