首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >获取python文件对象的邮件附件

获取python文件对象的邮件附件
EN

Stack Overflow用户
提问于 2010-11-01 18:03:19
回答 2查看 62.2K关注 0票数 26

我有一个电子邮件多部分消息对象,我想将该电子邮件消息中的附件转换为python文件对象。这个是可能的吗?如果可能,我应该在Python中使用什么方法或类来完成这项任务?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-07 04:10:18

我真的不明白你说的“电子邮件多部分消息对象”是什么意思。您是说属于email.message.Message类的对象吗?

如果这就是你的意思,那很简单。对于多部分消息,get_payload方法返回消息部分(每个部分本身都是一个Message对象)的列表。您可以遍历这些部件并检查它们的属性:例如,get_content_type方法返回部件的MIME类型,get_filename方法返回部件的文件名(如果在消息中指定了文件名)。然后,当您找到正确的消息部分时,您可以调用get_payload(decode=True)来获取解码后的内容。

代码语言:javascript
复制
>>> import email
>>> msg = email.message_from_file(open('message.txt'))
>>> len(msg.get_payload())
2
>>> attachment = msg.get_payload()[1]
>>> attachment.get_content_type()
'image/png'
>>> open('attachment.png', 'wb').write(attachment.get_payload(decode=True))

如果您正在以编程方式从收到的电子邮件中提取附件,则可能需要采取预防措施,以防病毒和特洛伊木马程序。特别是,您可能只应该提取其MIME类型是安全的附件,并且您可能希望选择自己的文件名,或者至少清理get_filename的输出。

票数 65
EN

Stack Overflow用户

发布于 2011-08-04 20:15:34

这是一个有效解决方案,消息来自IMAP服务器

代码语言:javascript
复制
self.imap.select()
typ, data = self.imap.uid('SEARCH', 'ALL')
msgs = data[0].split()
print "Found {0} msgs".format(len(msgs))

for uid in msgs:
    typ, s = self.imap.uid('FETCH', uid, '(RFC822)')
    mail = email.message_from_string(s[0][1])

    print "From: {0}, Subject: {1}, Date: {2}\n".format(mail["From"], mail["Subject"], mail["Date"])

    if mail.is_multipart():
        print 'multipart'
        for part in mail.walk():
            ctype = part.get_content_type()
            if ctype in ['image/jpeg', 'image/png']:
                open(part.get_filename(), 'wb').write(part.get_payload(decode=True))
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4067937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档