python - 如何有效地使用 Gmail api 阅读所有邮件?
问题描述
我正在尝试通过收件箱使用 Gmail API 过滤来阅读用户的所有邮件。但是要阅读 16k+ 封邮件大约需要 2 小时。有什么有效的方法吗?
now = datetime.now()
timestamp = math.floor(datetime.timestamp(now))
count = 0
while True:
results = service.users().messages().list(maxResults=50,userId='me',q='in:inbox before:{}'.format(timestamp)).execute()
messages = results.get('messages')
EmailRecepit=[]
if messages==None:
break
for msg in messages:
print("Count",count)
count+=1
# Get the message from its id
txt = service.users().messages().get(userId='me', id=msg['id']).execute()
try:
# Get value of 'payload' from dictionary 'txt'
payload = txt['payload']
headers = payload['headers']
attachment = payload['parts']
for header in headers: # getting the Sender
if header['name'] == 'From':
msg_from = header['value']
name=sender_name(msg_from)#Sender Name Not email
for a in attachment:
if a.get('filename') != '' and len(a.get('filename')) != 0:
document = a.get('filename')
if count % 50==0:
timestamp = math.floor(datetime.timestamp(parser.parse(headers['Date']))
except socket.error as error:
pass
except:
pass
解决方案
你执行的请求越少,你的代码就越高效
因此,您应该修改请求
service.users().messages().list(maxResults=50,userId='me',q='in:inbox before:{}'.format(timestamp)).execute()
通过增加每个请求的最大结果数,例如
指定:maxResults=500
但是,请注意,service.users().messages().get()
在大量电子邮件上使用意味着大量请求,这不可避免地会使您的代码变慢。
service.users().messages().list
考虑通过扩展查询来缩小检索结果的数量,q
并仅检索您真正感兴趣的电子邮件。例如:仅包含附件的电子邮件,仅来自特定发件人或具有特定主题行的电子邮件。
如果您必须检索所有 16k 多封电子邮件 - 加快代码速度的唯一方法是使用批处理请求
例如,在这里查看如何在 Python 中实现对 Gmail API 的批处理请求的示例。请注意,如果您执行的请求过多,使用批处理请求仍会导致超出配额。
推荐阅读
- entity-framework-core - Entity Framework Core ExecuteSqlInterpolated 给出 Microsoft.Data.SqlClient.SqlException
- javascript - html标签发送带有href的对象
- python - 计算在熊猫数据透视表中使用的出现次数
- python - 使用包含数组的单个结构化元素创建数组
- flutter - Flutter 身份验证和数据持久性与 Provider 架构
- python - 如何在 Sagemaker 的处理步骤中将包上传到实例?
- sql - 在 sqlite 中使用 Bash 变量
- javascript - 用javascript克隆节点后替换所有标签的ID
- r - 一致性矩阵
- python - KeyError:discord.py 中的“594750729810477063”