我正在尝试从一个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库都可以。
致意
您可以指定
BODYSTRUCTURE
,而不是获取RFC822
,这是完整的内容。来自
imaplib
的结果数据结构相当混乱,但是您应该能够在不下载整个消息的情况下找到消息的每个部分的文件名、内容类型和大小。如果您对文件名有所了解,可以使用X-GM-RAW gmail extensions for imap SEARCH command。这些扩展允许您使用任何gmail advanced search查询来筛选消息。这样,您可以将下载限制为匹配的邮件,或者排除一些不需要的邮件。
以上搜索收件箱中未标记为“已分析”的带有PDF附件的邮件。
一些专业提示:
[编辑]
如果在分析邮件后标记该邮件,则可以跳过已分析的邮件。这应该足够合理,可以监视您的班级邮箱。
也许你生活在一个互联网带宽比程序员时间更昂贵的世界角落;在这种情况下,你只能获取标题并查找“Content disposition”==“attachment;filename=somefilename.ext”。
获取
RFC822
消息数据项在功能上等同于BODY[]
。IMAP4支持section 6.4.5 of RFC 3501中列出的其他消息数据项。尝试请求一组不同的消息数据项以获取所需的信息。例如,您可以尝试
RFC822.HEADER
或者BODY.PEEK[MIME]
。相关问题 更多 >
编程相关推荐