Cannot get the image position in the body from Outlook Python API - python

I need some help, I am currently trying to do some scripting to automatize some tasks. I would like to fetch the received mail and send the body somewhere.
For that I am using win32.com with the outlook API.
But the issue is that if there is image in the body of the mail. I can't fetch it with the initial body. I Thought about using attachment, which is working but in the end, I have images and the body. But in the body I don't have the image position information... So I can only send the images and cannot set them correctly. Which can be difficult to understand if there is a lot of images...
So far the code looks like something like this :
import os
import win32com.client
outlook = win32com.client.Dispatch('outlook.application')
mapi = outlook.GetNamespace("MAPI")
inbox = mapi.GetDefaultFolder(6)
messages = inbox.Items
message = messages[len(messages) - 1]
body = message.body
attachments = message.attachments
attachment = attachments[0]
file_name = attachment.filename
path = "D:\\Documents\\tmp"
attachment.SaveAsFile(path + os.sep + attachment.FileName)
Do you have any help on this ?
Thanks for your help :)
PS : Do you know where I can find the Python documentation for outlook API, I just find the Rest API one and there is some difference from both. Or if we can get the source code to check directly.

In the message body you may check for <img/> tags. If any of them contains this tag with a file name prefixed with cid: string, for example:
<img src=cid:Filename/>
Then you deal with an embedded image which can be found in attached files.
Also you may check the PR_ATTACH_CONTENT_ID property on the attached files in the following way:
Const PR_ATTACH_CONTENT_ID = "http://schemas.microsoft.com/mapi/proptag/0x3712001F"
Function IsEmbedded(Att As Attachment) As Boolean
Dim PropAccessor As PropertyAccessor
Set PropAccessor = Att.PropertyAccessor
IsEmbedded = (PropAccessor.GetProperty(PR_ATTACH_CONTENT_ID) <> "")
End Function
The PropertyAccessor can help you to deal with low-level MAPI properties in Outlook.

Related

how to send email in internal/restricted/ highly restricted mood from outlook in python

I am using win32com.client liberary.
import win32com.client as client
outlook = client.Dispatch("Outlook.Application")
message = outlook.CreateItem(0)
message.To = "xxxx#officemail.com"
message.Subject = "abcd"
message.Body = "abc xyz"
message.Send()
Here how to add option as internal/restricted/ highly restricted ?
Without adding I am getting error as follows:
com_error: (-214747260,"Operation aborted",None,None)
The Outlook object model doesn't provide any built-in property for that.
If you use AIP add-in in Outlook you need to add a corresponding user property by using the UserProperties.Add method. Read more about API labeling in the Azure Information Protection (AIP) labeling, classification, and protection article. You can explore existing items and their labels using any low-level exploring tool such as MFCMAPI or OutlookSpy.
You may find the What is Azure Information Protection? page helpful.

Email outlook getting body

I am using Microsoft outlook.In outlook I will be having plenty of mails.My task is to read the outlook mail and store that data in an array or any file.I am able to read body of the mail which consists of both text and images. I am able to read the text in the mail but if there is any images in the mail I can't able to read the images. I am using python. Please say me how to get images and text from that body.
import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
message = messages.GetLast()
body_content = message.body
print(body_content)
The Body property returns a plain text string that represents the message body. Instead, you can use the following ways:
The HTMLBody property - a string representing the HTML body of the specified item.
The Word editor - the Microsoft Word Document Object Model of the message being displayed. The WordEditor property of the Inspector class returns an instance of the Document class from the Word object model which you can use to set up the message body.
You can read more about all these ways in the Chapter 17: Working with Item Bodies article. It is up to you which way is to choose to deal with the message body.
You can find all img elements in the message body. Be aware, embedded images are stored as attachments in the message. To find them you can use the following code (C#):
Outlook.MailtItem mailItem;
foreach (Outlook.Attachment attachment in mailItem.Attachments)
{
bool attachmentIsInline = false;
string fileName = attachment.FileName;
if (mailItem.HTMLBody.Contains(fileName))
{
attachmentIsInline = true;
}
}
Basically, you just need to find whether a message body contains an attached file's name. Take a look at the following threads for more information:
distinguish between inline images and other attachments in outlook message
How to know if attachment is a signature in an Outlook email

receiving emails with python api O365

I am just starting out in Python and I am trying to accomplish a manual task I have heard is on the simpler side to accomplish with python. My company uses Office 365 for their emails and I want to retrieve an email attachment and store it locally so I can save time . So far have established how to send a simple email, call the names of the folders in my account but I cannot figure out how to read any specific email .
my idea goes a little like this ,
from O365 import Account, message,mailbox
credentials = ('username', 'given password')
account = Account(credentials)
mailbox = account.mailbox()
mail_folder = mailbox.inbox_folder()
mail_folder = mailbox.get_folder(folder_name='Inbox')
print(mail_folder)
#_init__(*,parent= Inbox, con=None,**kwargs)
Message_body = message.body()
message.get_subject('email subject here!')
print(Message.body)
right now I am lost and trying anything within the O365 documentation page but the message module does not have the attribute subject according to how I am using it . Any guidance would be much appreciated
From your example - it's not clear if you are authenticated or not...
If you are then you will be able to list the mailbox folders. In the case below - you can access the inbox and then list the sub-folders:
from O365 import Account, Connection, MSGraphProtocol, Message, MailBox, oauth_authentication_flow
scopes=['basic', 'message_all']
credentials=(<secret>, <another secret>)
account = Account(credentials = credentials)
if not account.is_authenticated: # will check if there is a token and has not expired
account.authenticate(scopes=scopes)
account.connection.refresh_token()mailbox = account.mailbox()
inbox = mailbox.get_folder(folder_name='Inbox')
child_folders = inbox.get_folders(25)
for folder in child_folders:
print(folder.name, folder.parent_id)
This part will allow you to list folders (and also messages).
If I look at your code - it looks as though you are trying to do both?
Try doing something like the following to get the hang of paging through your inbox:
for message in inbox.get_messages(5):
if message.subject == 'test':
print(message.body)
Note that I'm looping through the first 5 messages in the inbox looking for a message with subject 'test'. If it finds the message - then it prints the body.
Hopefully this will shed a little light.

Create outlook draft email in python with out launching outlook application

I need to create an email draft and save in msg format without launching the outlook application.
(Or)
I have an existing draft msg file, I need to modify the sender, body, and attachment to that file and save as msg file.
I tried win32 it is working fine, but it is launching the outlook application in my system. In my server, there is no outlook application.
Can you please tell me is there any other ways to generate the msg file.
If you don't want to to use the Outlook Object Model, you are pretty much limited to either using a library like Aspose (it handles MSG files without having to install Outlook, but your mileage may vary) or Redemption (disclosure: I am its author) - it requires the MAPI system to be installed (which means Outlook must be installed), but it won't start Outlook if you are using RDOSession.CreateMsgFile (ollowed by setting various RDOMail properties and/or importing an existing MSG file using RDOMail.Import followed by RDOMail.Save.
Update per OP request.
I don't use Python, but in VB script it would be something like the following:
Set Session = CreateObject("Redemption.RDOSession")
set newMsg = Session.CreateMessageFromMsgFile("c:\temp\new.msg")
newMsg.Import("c:\temp\template.msg", 3)
newMsg.Body = "updated body"
newMsg.Save
You can create an email draft and save it as MSG with Aspose.Email for Python via .NET using the code sample given below:
eml = MailMessage()
# Set from, to, subject and body properties
eml.from_address = "sender#domain.com";
eml.to.append("receiver#domain.com");
eml.subject = "This is test message";
eml.body = "This is test body";
# Create an instance of the MapiMessage class and pass MailMessage as argument
outlookMsg = MapiMessage.from_mail_message(eml);
# Save the message (MSG) file
strMsgFile = "CreatingAndSavingOutlookMessages_out.msg"
outlookMsg.save(dataDir + strMsgFile);
Note: I am working as Support developer/ Evangelist at Aspose.

Parse the body of attachment in outlook mail with MAPI Python

I am using win32com for parsing emails in my outlook, how can I parse the contents of attachment in mail.
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
accounts= win32com.client.Dispatch("Outlook.Application").Session.Accounts
inbox = outlook.Folders(accounts['<Account-Name>'].DeliveryStore.DisplayName)
messages = inbox.Folders['Inbox'].Items
if len(messages) > 0:
for message2 in messages:
title = message2.Subject
if title == '<Title-of-mail>':
attachment = message2.Attachments.Item(1)
print(attachment)
print(message2.Body)
# print(attachment.Body) //Error
I want to get the contents of attachment, not able to find any proper documentation for this. Any help in guiding me to correct direction is highly appreciated.
Firstly, you might want to retrieve the Inbox using
accounts['<Account-Name>'].DeliveryStore.GetDefaultFolder(olFolderInbox)
Secondly, looping through all messages in a folder is a terrible idea - use Items.Find/FindNext or Items.Restrict with a restriction on the Subject property..
Thirdly, Outlook would not let you directly access attachment contents, you would need to save the attachment as a file (Attachment.SaveAsFile), and then read the file contents. If you want to access attachment contents directly, you can use Redemption (I am its author) - it exposes Attachment / RDOAttachment.AsText / AsArray / AsStream properties.

Categories

Resources