从 Gmail API 批量获取超过 10k 封电子邮件的电子邮件发件人

Posted

技术标签:

【中文标题】从 Gmail API 批量获取超过 10k 封电子邮件的电子邮件发件人【英文标题】:Get email senders in batch from Gmail API for over 10k emails 【发布时间】: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 获取这么多的电子邮件?

【问题讨论】:

【参考方案1】:

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

编辑:您也可以在查询中使用fields 参数从消息中请求您想要的字段,因为messages.list 和messages.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 响应。我找到了关于它的评论,您还有其他想法吗? ***.com/questions/25484791/… @kecman 恐怕我自己没有测试过,我只是按照文档进行的。 API中似乎有一个错误。除了批量处理list 请求和get 请求之外别无他法。【参考方案2】:

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

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

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

【讨论】:

以上是关于从 Gmail API 批量获取超过 10k 封电子邮件的电子邮件发件人的主要内容,如果未能解决你的问题,请参考以下文章

Mule 4:Dataweave 2.0:如何处理大小超过10k的数据库记录?

如何使用 pyspark 从 Spark 获取批量行

在新的 Gmail API 中批量提取电子邮件

如何在 Elasticsearch 中获得超过 10K 的日志/结果

使用 Powershell 从 GMAIL API 获取消息正文

如何使用 Pandas 从 InfluxDB 检索超过 10k 行?