在不下载i的情况下获取Gmail附件文件名

2024-04-23 19:44:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从一个Gmail帐户获取所有可能包含一些大型附件(大约30MB)的邮件。我只需要名字,不需要全部文件。我找到了一段获取消息和附件名称的代码,但它下载了该文件,然后读取了其名称:

import imaplib, email

#log in and select the inbox
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('username', 'password')
mail.select('inbox')

#get uids of all messages
result, data = mail.uid('search', None, 'ALL') 
uids = data[0].split()

#read the lastest message
result, data = mail.uid('fetch', uids[-1], '(RFC822)')
m = email.message_from_string(data[0][1])

if m.get_content_maintype() == 'multipart': #multipart messages only
    for part in m.walk():
        #find the attachment part
        if part.get_content_maintype() == 'multipart': continue
        if part.get('Content-Disposition') is None: continue

        #save the attachment in the program directory
        filename = part.get_filename()
        fp = open(filename, 'wb')
        fp.write(part.get_payload(decode=True))
        fp.close()
        print '%s saved!' % filename

我必须每分钟下载一次,所以无法下载数百MB的数据。我是个网络脚本新手,有人能帮我吗?实际上我不需要使用imaplib,任何python库都可以。

致意


Tags: 文件thein名称data附件getif
3条回答

您可以指定BODYSTRUCTURE,而不是获取RFC822,这是完整的内容。

来自imaplib的结果数据结构相当混乱,但是您应该能够在不下载整个消息的情况下找到消息的每个部分的文件名、内容类型和大小。

如果您对文件名有所了解,可以使用X-GM-RAW gmail extensions for imap SEARCH command。这些扩展允许您使用任何gmail advanced search查询来筛选消息。这样,您可以将下载限制为匹配的邮件,或者排除一些不需要的邮件。

mail.uid('search', None, 'X-GM-RAW', 
       'has:attachment filename:pdf in:inbox -label:parsed'))

以上搜索收件箱中未标记为“已分析”的带有PDF附件的邮件。

一些专业提示:

  • 为已经解析的消息添加标签,这样就不需要再次获取它们了(上例中的-label:parsed过滤器)
  • 始终使用uid版本而不是标准的顺序id(您已经在这样做了)
  • 不幸的是,MIME是混乱的:有很多客户做奇怪(或明显错误)的事情。您可以尝试只下载和解析头文件,但这值得麻烦吗?

[编辑]

如果在分析邮件后标记该邮件,则可以跳过已分析的邮件。这应该足够合理,可以监视您的班级邮箱。

也许你生活在一个互联网带宽比程序员时间更昂贵的世界角落;在这种情况下,你只能获取标题并查找“Content disposition”==“attachment;filename=somefilename.ext”。

获取RFC822消息数据项在功能上等同于BODY[]。IMAP4支持section 6.4.5 of RFC 3501中列出的其他消息数据项。

尝试请求一组不同的消息数据项以获取所需的信息。例如,您可以尝试RFC822.HEADER或者BODY.PEEK[MIME]

相关问题 更多 >