从 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 参数中的 pageToken
和 maxResults
。很长的消息列表将需要这些参数。
【讨论】:
谢谢,我阅读了批处理并成功实施!关于fields
参数 - 我只需要来自payload > headers
的From
。那么它可以以某种方式输入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的数据库记录?
如何在 Elasticsearch 中获得超过 10K 的日志/结果