代码之家  ›  专栏  ›  技术社区  ›  Joshua Partogi

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

  •  22
  • Joshua Partogi  · 技术社区  · 14 年前

    我有一个email multipart消息对象,我想将该email消息中的附件转换为python文件对象。这可能吗?如果可能的话,我应该在Python中寻找什么方法或类来执行这样的任务?

    3 回复  |  直到 10 年前
        1
  •  60
  •   Gareth Rees    14 年前

    我真的不明白你所说的“email multipart message object”是什么意思。你的意思是属于 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())
    2
    >>> attachment = msg.get_payload()[1]
    >>> attachment.get_content_type()
    'image/png'
    >>> open('attachment.png', 'wb').write(attachment.get_payload(decode=True))
    

    获取文件名 .

        2
  •  14
  •   hjpotter92    10 年前

    这是工作解决方案,消息来自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))
    
        3
  •  3
  •   Jakub Pastuszuk    6 年前

    实际使用现在建议 email.EmailMessage API (别跟老糊涂了 email.Message API )很容易:

    1. 遍历所有邮件元素并仅选择附件

    2. 仅遍历附件

    解决方案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
    

    解决方案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
    

    1. 我们明确要求使用新的 EmailMessage _class=EmailMessage 参数
    2. 您可以从以下来源读取电子邮件(也称为信封) 由于内置的方法 message.Parser API