Downloading multiple attachments using imaplib

后端 未结 6 966
星月不相逢
星月不相逢 2020-11-29 03:39

How can I download multiple attachments from a single mail using imaplib?

Let\'s say I have an e-mail and that e-mail contains 4 attachments. How can I download all

6条回答
  •  -上瘾入骨i
    2020-11-29 04:02

    @sashoalm 's code worked for me with a minor change:

    change mail = email.message_from_string(email_body) in downloaAttachmentsInEmail to mail = email.message_from_bytes(email_body)

    I was getting an error when trying to read bytes (the attachment) as a string. Now it works perfectly for me.

    Heres a full example of the code:

    server = 'outlook.office365.com'
    user = 'YOUR USERNAME'
    password = 'YOUR PASSWORD'
    outputdir = 'DIRECTORY THAT YOU WANT FILES DOWNLOADED TO'
    subject = 'Data Exports' #subject line of the emails you want to download attachments from
    
    def connect(server, user, password):
        m = imaplib.IMAP4_SSL(server)
        m.login(user, password)
        m.select()
        return m
    
    def downloaAttachmentsInEmail(m, emailid, outputdir):
        resp, data = m.fetch(emailid, "(BODY.PEEK[])")
        email_body = data[0][1]
        mail = email.message_from_bytes(email_body)
        if mail.get_content_maintype() != 'multipart':
            return
        for part in mail.walk():
            if part.get_content_maintype() != 'multipart' and part.get('Content-Disposition') is not None:
                open(outputdir + '/' + part.get_filename(), 'wb').write(part.get_payload(decode=True))
    
    #download attachments from all emails with a specified subject line
    def downloadAttachments(subject):
        m = connect(server, user, password)
        m.select("Inbox")
        typ, msgs = m.search(None, '(SUBJECT "' + subject + '")')
        msgs = msgs[0].split()
        for emailid in msgs:
            downloaAttachmentsInEmail(m, emailid, outputdir)
    
    downloadAttachments(subject)
    

提交回复
热议问题