Google PubSub / Gmail Webhook:发送电子邮件时始终从 PubSub 接收多个 POST 请求

2024-04-25

我设置了一个 webhook,它使用 Google Cloud PubSub API 和 Java 中的 Gmail API 监听和处理 Gmail 中收件箱和发送文件夹中的更改。

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

我了解 PubSub 保证至少一次交付因此,收到重复消息并不罕见,但由于这种情况持续发生且 message_id 不同,我认为根据下面的 PubSub 文档,可能存在多个推送请求:

Cloud Pub/Sub 分配一个唯一的message_id每条消息,可用于检测订阅者收到的重复消息。但是,这不允许您检测对同一数据的多个发布请求所产生的重复项。

我尝试过的:

  1. 确保我的 Google Cloud 控制台上只有一个主题/订阅。
  2. 将 Ack 截止时间设置为 10 到 600 秒之间的不同值。
  3. Called service.users().stop()确保我没有打电话watch()多次然后开始watch() again.

我研究了 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;
}

我将历史记录和过期时间插入数据库,并使用它来检查,在收到 webhook 调用时,我是否需要调用watch()如果自上次调用以来已过去超过 24 小时,则再次调用watch(根据谷歌的推荐)。


当我实现 Google pub/sub watch 请求时,我也有类似的行为。

当您撰写邮件时,Gmail 会创建系统标签 “发送并草稿” 并不断使用新的 messageId 和标签“发送和草稿”保存到草稿,您订阅了“收件箱和发送”的任何更改,因此您的网络钩子将被点击两次或更长时间!

来自 Gmail 的邮件始终包含标签,您必须过滤那些带有标签草稿的邮件。

我的代码使用 Gmail .net SDK,并且必须处理

//Explicitly avoid further processing
 bool isdraft = y.Message.LabelIds.Contains("DRAFT");

并过滤掉那些无论如何。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google PubSub / Gmail Webhook:发送电子邮件时始终从 PubSub 接收多个 POST 请求 的相关文章

随机推荐

  • Theano 中的名称冲突

    我正在尝试在模块中导入 theano 但我得到了回溯 File media tarun 6A86CA8286CA4DEF develop pydy pydy codegen code py line 16 in
  • SearchManager - 添加自定义建议

    我已经阅读了有关构建搜索界面和添加自定义建议的所有在线文档 但我仍然不清楚这是如何工作的 文档说我必须 为您的建议构建一个表 例如在 SQLiteDatabase 中 并使用所需的列格式化表 我假设系统最终会自己用适当的建议填充此表 但是哪
  • gitk:悬停时显示分支名称

    你能告诉我如何让 gitk 工具在悬停时显示分支名称或建议能够这样做的工具吗 gitk 显示分支缠结 其中分支是无名的 我必须猜测哪个是 master 哪个是 stable 等 在 gitk 窗口的左下半部分 有一个信息行指定Branche
  • Docker 上的 MySQL?

    我是 Docker 新手 仍在探索中 我遇到了这个问题 可能看起来很愚蠢 但我真的被困住了 所以我有一个使用 MySQL 服务器的 Spring boot 应用程序 我想在容器上运行我的应用程序 我设法 运行一个没有 MySQL 的应用程序
  • 在 model.fit() 期间记录 Keras 中每个时期的计算时间

    我想比较不同模型之间的计算时间 在拟合期间 每个时期的计算时间被打印到控制台 Epoch 5 5 160000 160000 10s 我正在寻找一种方法来存储这些时间 其方式与模型指标类似 模型指标保存在每个时期并可通过历史对象获取 尝试以
  • 通过 DynamicMethod 调用 varargs 方法

    我正在尝试使用 DynamicMethod 调用非托管的类似 printf 的函数 在运行时我得到一个 BadImageFormatException 找不到索引 HRESULT 的异常 0x80131124 这是运行时的限制还是我发出的代
  • 如何使用 se.py 在 gem5 系统调用模拟模式下编译和运行可执行文件?

    有许多可能的错误和解决方法分散在不同的地方 任何人都可以提供至少一种详细的工作设置 以及确切的 gem5 和编译器版本 希望在 Ubuntu 上吗 最小的 Ubuntu 设置 首先要注意一件事 动态链接的可执行文件首先运行动态加载器 这意味
  • 如何仅为具有特定模板 ID 的列表添加事件接收器

    我正在为自定义列表模板添加 ItemAdding 事件接收器 事件接收器和列表模板都是由相同的功能部署的 同样的功能还可以创建列表实例 我遇到的问题是该事件是为每个列表项触发在其部署的地点 eventreceivre 的 Elements
  • 使用 C# 驱动程序从 MongoDB 集合上的文本查询中检索相关性有序结果

    我正在尝试对集合进行文本查询并按文本匹配顺序检索结果 The docs http docs mongodb org manual reference operator query text text search with addition
  • SMARTGWT 数据源 (GWT-RPC-DATASource) LISTGRID

    我在使用 smartGWT 绑定 ListGrid 中的数据源时遇到问题 我有 GWT RPC DataSource 并将其设置为我的数据源 grid setDataSource ds 单击一键 我的数据源发生了一些更改 我正在生成新的数据
  • C# 内存地址扩展与代码

    我得到了以下 MemoryAddressExtensions 代码 它显示了 C 中的对象地址 想知道什么是 IntPtr and IntPtr Thanks public static class MemoryAddressExtenst
  • 使用 ViewPager、PagerAdapter 和 AsyncTask 的活动会导致空白视图

    我正在尝试构建一个充当日历日视图的活动 当用户向左或向右滑动时 他们将通过日历转到明天或昨天等 我决定使用 ViewPager PagerAdapter 来处理视图并控制几天的分页 作为设置日视图的一部分 应用程序将访问我的 API 并请求
  • 是什么阻止了 fsockopen?

    经过半天的努力 我终于通过转换这个函数来让reCAPTCHA工作 function recaptcha http post host path data port 80 req recaptcha qsencode data http re
  • 错误:查询没有结果数据的目标

    CREATE OR REPLACE FUNCTION chkLogin userid varchar pwd varchar RETURNS BOOLEAN AS BODY DECLARE passed BOOLEAN BEGIN SELE
  • Pandas 更改外汇 DataFrame 的时区

    我们如何更改 Pandas DataFrame 中的时区 我编写了一些简单的代码来读取 1 分钟 EURUSD 数据 日期时间 开盘价 最高价 最低价 收盘价 成交量 示例数据采用 EST 时区 我需要将其转换为 UTC df tz con
  • ImageMagick 在命令行中工作,但是当 php 中的 exec() 时,它返回 5 并显示“不兼容的库版本”

    我在 OS X 上使用 MAMP 以及 Macports 的 php 5 3 6 和 ImageMagick 命令行 遇到了一个奇怪的问题 当我从 CLI 运行识别命令时 它工作正常 但是当我使用运行完全相同的命令时exec 它返回一个值代
  • Invoke-WebRequest 设置超时

    我有一个长时间运行的网页 需要 Powershell 来调用 我每晚从任务管理器运行它 内容如下 powershell Command Invoke WebRequest https www example com longrunningt
  • 使用帮助库管理器和 WiX 安装帮助

    我试图通过使用 WiX 运行 Sandcastle 帮助文件生成器在构建我的 Sandcastle 项目后创建的 HelpLibraryManagerLauncher 将我自己的帮助文件添加到 Visual Studio 2010 的帮助库
  • 确保始终捕获异常

    C 中的异常不需要被调用函数捕获 没有编译时错误 因此 是否使用 try catch 来捕获它们取决于开发人员的判断 与 Java 不同 有没有一种方法可以确保调用函数始终使用 try catch 捕获抛出的异常 No See 务实地看待异
  • Google PubSub / Gmail Webhook:发送电子邮件时始终从 PubSub 接收多个 POST 请求

    我设置了一个 webhook 它使用 Google Cloud PubSub API 和 Java 中的 Gmail API 监听和处理 Gmail 中收件箱和发送文件夹中的更改 我看到的问题是 当我向另一个用户发送消息时 PubSub 似