我正在创建一个应用来在用户的收件箱中移动消息。目前我正在使用Gmail API执行此操作,但我注意到向API发出请求的速度明显慢于使用IMAP。
方法很简单:我发送一批修改请求来更改一组电子邮件上的标签,以便移动它们。使用Gmail API的邮件吞吐量为每秒3.3封邮件。为了进行比较,IMAP吞吐量为130条/秒。
以下是我目前正在使用BatchHttpRequests的方法:
batch = BatchHttpRequest()
for gmailId in gmailIds:
batch.add(self.service.users().messages().modify(userId=self.user.email, id=gmailId, body=labels))
try:
batch.execute()
except errors.HttpError, error:
log_this_error(self.user.email, error.resp.status)
这是我完成相同任务的IMAP代码:
# imap_conn is the user's authed connection
status, count = imap_conn.select(oldMailboxLabel)
if status == "OK":
count = int(count[0])
if count > 0:
messageNumbers = range(1, count + 1)
messageNumbers = ",".join(map(str, messageNumbers))
imap_conn.copy(messageNumbers, newMailboxLabel)
imap_conn.close()
imap_conn.delete(oldMailboxLabel)
else:
imap_conn.close()
else:
count = 0
我已经批量处理并且正在处理我的请求,并且我尝试使用字段来限制返回的信息量。所有这些都在performance tips页面上提出。我很难理解为什么这些请求需要很长时间才能完成。任何建议将不胜感激!
答案 0 :(得分:0)
通过GMail API阅读,您似乎正在这样做"对"。我猜测,因为GMail本身就是一个邮件客户端,GMail API的目标是编写玩具邮件客户端,而IMAP更适合于功能齐全的邮件客户端的高效批量工作。
如果您将每条消息从旧标签移动到新标签,可能会改为rename the label using Users.labels.update?
如果没有,您可以通过by thread而不是消息来减少请求数量。
或者只使用IMAP。