相关文章推荐
腼腆的柠檬  ·  python ...·  1 周前    · 
有情有义的大白菜  ·  python ...·  1 周前    · 
完美的馒头  ·  python QTreeWidget ...·  1 周前    · 
失眠的烤红薯  ·  python qt textBrowser ...·  1 周前    · 
独立的手链  ·  腾讯AI ...·  7 月前    · 
干练的水桶  ·  字符串函数用法大全·  1 年前    · 
大方的沙滩裤  ·  Is it possible to ...·  1 年前    · 

获取邮件附件到Python文件对象

30 人关注

我得到了一个电子邮件的多部分消息对象,我想把该邮件中的附件转换成python文件对象。这可能吗?如果可以,我应该在Python中寻找什么方法或类来完成这样的任务?

2 个评论
到目前为止,你已经读了Python库的哪一部分? 你到底有没有看过pop或imap库?
我只研究过email.message.Message和mimetools.Message。好吧,我将阅读pop和imail,看看我可以做什么。
python
email
Joshua Partogi
Joshua Partogi
发布于 2010-11-01
3 个回答
Gareth Rees
Gareth Rees
发布于 2019-01-19
已采纳
0 人赞同

我不太明白你说的 "电子邮件多部分信息对象 "是什么意思。你是指属于 email.message.Message 类?

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

>>> import email
>>> msg = email.message_from_file(open('message.txt'))
>>> len(msg.get_payload())
>>> attachment = msg.get_payload()[1]
>>> attachment.get_content_type()
'image/png'
>>> open('attachment.png', 'wb').write(attachment.get_payload(decode=True))

如果你以编程方式从你收到的电子邮件中提取附件,你可能想对病毒和木马采取预防措施。特别是,你可能只应该提取那些你知道是安全的MIME类型的附件,而且你可能想选择自己的文件名,或者至少对get_filename的输出进行消毒。

HTML邮件的页脚经常有图片,这些图片也会作为附件发送。你可以通过查看Content-Disposition来区分这些图片和 "真正的 "附件:内联图片以 "inline "开始,而真正的附件以 "attachment "开始。没有获取内容处置的方法,但如果你只对实际附件感兴趣,你可以调用part.get('Content-Disposition').startswith('attachment')。
pma_
pma_
发布于 2019-01-19
0 人赞同

这里是工作解决方案,信息是由IMAP服务器提供的

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))
    
Jakub Pastuszuk
Jakub Pastuszuk
发布于 2019-01-19
0 人赞同

实际上使用现在建议的 email.EmailMessage API (don't confuse with old 电子邮件.消息API )它是相当容易的。

  • 遍历所有邮件元素,只选择附件

  • 只对附件进行迭代

  • 让我们假设你把你的信息作为字节内容存储在信封变量中

    Solution no.1:

    import email
    from email.message import EmailMessage
    email_message: EmailMessage = email.message_from_bytes(envelope, _class=EmailMessage)
    for email_message_part in email_message.walk():
        if email_message.is_attachment():
            # Do something with your attachment
    

    Solution no.2:(最好是这样,因为你不必走过你的消息对象的其他部分)。

    import email
    from email.message import EmailMessage
    email_message: EmailMessage = email.message_from_bytes(envelope, _class=EmailMessage)
    for email_message_attachment in email_message.iter_attachments():
            # Do something with your attachment
    

    Couple things to note: