How To Download Outlook Attachment From Python Script?
I need to download incoming attachment without past attachment from mail using Python Script. For example:If anyone send mail at this time(now) then just download that attachment o
Solution 1:
The below code helps by downloading the attachments from outlook emails that are
- 'Unread' (and changes the mail to Read.) or from 'Today's' date.
- without altering the file name.
Just pass the 'Subject' argument.
import datetime
import os
import win32com.client
path = os.path.expanduser("~/Desktop/Attachments")
today = datetime.date.today()
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
def saveattachemnts(subject):
for message in messages:
if message.Subject == subject and message.Unread or message.Senton.date() == today:
# body_content = message.body
attachments = message.Attachments
attachment = attachments.Item(1)
for attachment in message.Attachments:
attachment.SaveAsFile(os.path.join(path, str(attachment)))
if message.Subject == subject and message.Unread:
message.Unread = False
break
Solution 2:
import win32com.client #pip install pypiwin32 to work with windows operating sysytmimport datetime
import os
# To get today's date in 'day-month-year' format(01-12-2017).
dateToday=datetime.datetime.today()
FormatedDate=('{:02d}'.format(dateToday.day)+'-'+'{:02d}'.format(dateToday.month)+'-'+'{:04d}'.format(dateToday.year))
# Creating an object for the outlook application.
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
# Creating an object to access Inbox of the outlook.
inbox=outlook.GetDefaultFolder(6)
# Creating an object to access items inside the inbox of outlook.
messages=inbox.Items
defsave_attachments(subject,which_item,file_name):
# To iterate through inbox emails using inbox.Items object.for message in messages:
if (message.Subject == subject):
body_content = message.body
# Creating an object for the message.Attachments.
attachment = message.Attachments
# To check which item is selected among the attacments.print (message.Attachments.Item(which_item))
# To iterate through email items using message.Attachments object.for attachment in message.Attachments:
# To save the perticular attachment at the desired location in your hard disk.
attachment.SaveAsFile(os.path.join("D:\Script\Monitoring",file_name))
break
Solution 3:
When I copied this code, I get an error:
connection = None ^ IndentationError: expected an indented block
and then, when I indent the code,
classFetchEmail():
connection = None
error = None
mail_server = "imap.gmail.com"
username = "dummyoffers@gmail.com"
password = "opennepo"
self.save_attachment(self, msg, download_folder)
I get another error:
self.save_attachment(self, msg, download_folder) NameError: name 'self' is not defined
import email
import imaplib
import os
classFetchEmail():
connection = None
error = None
mail_server="host_name"
username="outlook_username"
password="password"
self.save_attachment(self,msg,download_folder)
def__init__(self, mail_server, username, password):
self.connection = imaplib.IMAP4_SSL(mail_server)
self.connection.login(username, password)
self.connection.select(readonly=False) # so we can mark mails as readdefclose_connection(self):
"""
Close the connection to the IMAP server
"""
self.connection.close()
defsave_attachment(self, msg, download_folder="/tmp"):
"""
Given a message, save its attachments to the specified
download folder (default is /tmp)
return: file path to attachment
"""
att_path = "No attachment found."for part in msg.walk():
if part.get_content_maintype() == 'multipart':
continueif part.get('Content-Disposition') isNone:
continue
filename = part.get_filename()
att_path = os.path.join(download_folder, filename)
ifnot os.path.isfile(att_path):
fp = open(att_path, 'wb')
fp.write(part.get_payload(decode=True))
fp.close()
return att_path
deffetch_unread_messages(self):
"""
Retrieve unread messages
"""
emails = []
(result, messages) = self.connection.search(None, 'UnSeen')
if result == "OK":
for message in messages[0].split(' '):
try:
ret, data = self.connection.fetch(message,'(RFC822)')
except:
print"No new emails to read."
self.close_connection()
exit()
msg = email.message_from_string(data[0][1])
ifisinstance(msg, str) == False:
emails.append(msg)
response, data = self.connection.store(message, '+FLAGS','\\Seen')
return emails
self.error = "Failed to retreive emails."return emails
Above code works for me to download attachment.Hope this really helpful for any one.
Solution 4:
If you want to download the attachment from the outlook application from a particular sender and with a specific subject. The below code may be helpful.
import win32com.client
import os
from datetime import datetime, timedelta
outlook = win32com.client.Dispatch('outlook.application')
mapi = outlook.GetNamespace("MAPI")
for account in mapi.Accounts:
print(account.DeliveryStore.DisplayName) #outlook account
inbox = mapi.GetDefaultFolder(6) #Inbox folder
inbox = inbox.Folders["your folder"] #Folder inside Inbox Folder
messages = inbox.Items
received_dt = datetime.now() - timedelta(days=1)
received_dt = received_dt.strftime('%m/%d/%Y %H:%M %p')
email_sender = 'sender@outlook.com'
email_subject = 'Subject of mail'
messages = messages.Restrict("[ReceivedTime] >= '"+received_dt+"'")
#save to current directory
outputDir = os.getcwd()
try:
for message inlist(messages):
if email_subject == message.subject and message.SenderEmailAddress == email_sender and message.ReceivedTime.strftime('%Y-%m-%d') == _date:
try:
s = message.sender
for attachment in message.Attachments:
attachment.SaveASFile(os.path.join(outputDir, attachment.FileName))
print(f"attachment {attachment.FileName} from {s} saved"except Exception as e:
print("Error when saving the attachment:" + str(e))
except Exception as e:
print("Error when processing emails messages:" + str(e))
Post a Comment for "How To Download Outlook Attachment From Python Script?"