【问题标题】:Get email senders in batch from Gmail API for over 10k emails从 Gmail API 批量获取超过 10k 封电子邮件的电子邮件发件人
【发布时间】:2018-08-25 04:11:46
【问题描述】:

我正在制作一个与 Gmail API 交互的 Chrome 扩展程序。 基本上它需要从匹配某个关键字的电子邮件中提取电子邮件发件人。 问题是有时有超过 10,000 封电子邮件与此关键字匹配。 我使用gapi.client.gmail.users.messages.list 来获取与输入的关键字匹配的所有电子邮件,但这仅返回电子邮件和线程ID,因此我需要为从messages.list 检索到的每个电子邮件ID 调用gapi.client.gmail.users.messages.get。 所以有超过 10K 的 Gmail API 请求,我在 Chrome 中遇到了ERR_INSUFFICIENT_RESOURCES 错误。为防止出现此错误,我在调用 messages.get 之间设置了一些超时时间,但之后需要很长时间才能完成...

是否有一些推荐的方法可以从 Gmail API 获取这么多的电子邮件?

【问题讨论】:

    标签: javascript google-chrome-extension google-api gmail-api


    【解决方案1】:

    根据documentation,提高性能的一种方法是批处理请求。目前它的限制是每批 100 个请求,但仍然是请求数的 100 倍。

    编辑:您也可以在查询中使用fields 参数从消息中请求您想要的字段,因为messages.listmessages.get 都可以返回一个完整的users.messages Resource

    例如:

    var xhr = new XMLHttpRequest;
    xhr.onload = () => {
        var resp = JSON.parse(xhr.response);
        var wholeFirstMessage = atob(resp.messages[0].raw);
        console.log(wholeFirstMessage);
    };
    xhr.open("GET", "https://www.googleapis.com/gmail/v1/users/userId/messages?fields=messages(id,threadId,raw)");
    xhr.send();
    

    注意:为简单起见,上面的代码示例忽略了 XHR 参数中的 pageTokenmaxResults。很长的消息列表将需要这些参数。

    【讨论】:

    • 谢谢,我阅读了批处理并成功实施!关于fields 参数 - 我只需要来自payload > headersFrom。那么它可以以某种方式输入fields参数吗(因为它是嵌套属性)?
    • 我已将'format': 'metadata' 添加到对get 端点的调用中,但如果我能立即从list 端点而不是电子邮件ID 获取From 标头,那就太好了
    • @kecman 您无法获取特定标头,但您可以直接从 list 端点检索所有标头,使用:xhr.open("GET","https://www.googleapis.com/gmail/v1/users/userId/messages?fields=messages/payload/headers/*");。更多信息here.
    • 我正在使用 JavaScript 库。当我向它提供 fields 像这样的 messages/payload/headers/* 参数时,它返回空的 200 OK 响应。我找到了关于它的评论,您还有其他想法吗? stackoverflow.com/questions/25484791/…
    • @kecman 恐怕我自己没有测试过,我只是按照文档进行的。 API中似乎有一个错误。除了批量处理list 请求和get 请求之外别无他法。
    【解决方案2】:

    不幸的是,这就是 Gmail api 的工作方式。

    如果您想了解有关该消息的更多详细信息,您必须先发送messages.list,然后输入message.get

    对 api 发出请求的速度是有限制的,如果出现错误,您只需要放慢速度即可。泛滥的错误消息用于确保我们都可以使用 api,并且一个人不会因发出许多请求而使事情过载。

    【讨论】:

      猜你喜欢
      • 2014-09-07
      • 2016-06-15
      • 1970-01-01
      • 2020-03-25
      • 2021-04-27
      • 2020-09-04
      • 1970-01-01
      • 2013-02-16
      • 2019-04-19
      相关资源
      最近更新 更多