I am trying to get the attachment from an email and save it to a specific folder with the original file name. The email is very basic and does not have much to it other than the attachment. The file is a csv file and there will be only one per email. This is what I have so far, but I'm new to this and am not sure how to proceed. This is using Outlook if that helps. Any help is appreciated.
import imaplib
import email
mail=imaplib.IMAP4('mailserver.com')
mail.login("username", "password")
mail.select("DetReport")
typ, msgs = mail.uid('Search', None, '(SUBJECT "Detection")')
msgs = msgs[0].split()
for emailid in msgs:
resp, data = mail.fetch(emailid, "(RFC822)")
email_body = data[0][1]
m = email.message_from_string(email_body)
message=m.get_content_maintype()
FYI, when I run the message=m.get_content_maintype()
it says it is text.
I looked around some more and tried a few more things. These: Downloading multiple attachments using imaplib and How do I download only unread attachments from a specific gmail label? had the answer once I played with it a little bit.
Code that worked:
import imaplib
import email
import os
svdir = 'c:/downloads'
mail=imaplib.IMAP4('mailserver')
mail.login("username","password")
mail.select("DetReport")
typ, msgs = mail.search(None, '(SUBJECT "Detection")')
msgs = msgs[0].split()
for emailid in msgs:
resp, data = mail.fetch(emailid, "(RFC822)")
email_body = data[0][1]
m = email.message_from_string(email_body)
if m.get_content_maintype() != 'multipart':
continue
for part in m.walk():
if part.get_content_maintype() == 'multipart':
continue
if part.get('Content-Disposition') is None:
continue
filename=part.get_filename()
if filename is not None:
sv_path = os.path.join(svdir, filename)
if not os.path.isfile(sv_path):
print sv_path
fp = open(sv_path, 'wb')
fp.write(part.get_payload(decode=True))
fp.close()
POP3:
import poplib
import email
server = poplib.POP3(pop_server)
server.user(user)
server.pass_(pass)
# get amount of new mails and get the emails for them
messages = [server.retr(n+1) for n in range(len(server.list()[1]))]
# for every message get the second item (the message itself) and convert it to a string with \n; then create python email with the strings
emails = [email.message_from_string('\n'.join(message[1])) for message in messages]
for mail in emails:
# check for attachment;
for part in mail.walk():
if not mail.is_multipart():
continue
if mail.get('Content-Disposition'):
continue
file_name = part.get_filename()
# check if email park has filename --> attachment part
if file_name:
file = open(file_name,'w+')
file.write(part.get_payload(decode=True))
file.close()