Sending emails with outlook using Python and HTML - python

How do I successfully use a sender account with a password that is not already signed in to on the Outlook application on my laptop? I want to send a message from the example account, "from#outlook.com" but it has a password. I have this password. Am I able to enter this into the existing code?
import win32com.client as client
import datetime,time
outlook=client.Dispatch("Outlook.Application")
message=outlook.Createitem(0)
namespace=outlook.GetNameSpace('MAPI')
inbox=namespace.GetDefaultFolder(6)
message=inbox.items.add
message.To="to#outlook.com"
message.CC=""
message.BCC=""
From = "from#outlook.com"
#password = ""
message.Subject="Subject text here"
message.BodyFormat = 2
message.HTMLBody = "<html><h2><span style='color:red'>There is an error with the file </b></span></h2> <body>Please check your submission and try again </body></html>"
message.Save()
message.Display()
time.sleep(5)
message.Send()

Firstly, MailItem object does not expose the From property. It exposes read-only Sender / SenderEmailAddress / SenderName properties, but they obviously cannot be set. You can set the MailItem.Account property to an instance of the Account object retrieved from the Application.Session.Accounts collection, but that requires you to configure the relevant account in Outlook first.
As a general rule, Outlook wont' let you send from an arbitrary one-off account not previously configured 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.

Python client.Dispatch("outlook.application") fails in specific case (#company emails)

Hi there,
Everything is working fine, except one thing I can't send email to clients that have non-standard email (if their email are #gmail, #outlook, etc, it sends the email normally)
I have a client with the following email client#company.com (not the real email obviously), I can't send that email to him. There goes my method. I'd love some help.
mail.Send()
File "", line 2, in Send pywintypes.com_error:
(-2147024809, 'The parameter is incorrect.', None, None)
def main_send_email(self, to, header, attached_msg, pdf_files=None):
import pythoncom
# return super().main_send_email(to, header, attached_msg, pdf_files)
self.outlook_app = client.Dispatch(
'outlook.application', pythoncom.CoInitialize())
s = client.Dispatch("Mapi.Session")
mail = self.outlook_app.CreateItem(0)
# set the account
account = None
for acc in mail.Session.Accounts:
if "39" in acc.DisplayName:
account = acc
mail._oleobj_.Invoke(*(64209, 0, 8, 0, account))
# mail.SendUsingAccount = self.outlook_app.Session.Accounts.Item(1)
# set email sender
# mail.To = 'silsilinhas#gmail.com'
mail.To = to
mail.Subject = header
mail.HTMLBody = attached_msg
if pdf_files is not None:
for pdf in pdf_files:
mail.Attachments.Add(pdf)
mail.Send()
First of all, I've noticed the following line of code which is useless and never used:
s = client.Dispatch("Mapi.Session")
It seems there is no need to create a new MAPI session in the code if you automate Outlook.
Second, the Send method may trigger a security issue when automating Outlook from external applications. It can be a security prompt or just an exception thrown at runtime. There are several ways for suppressing such prompts/issues:
Use a third-party components for suppressing Outlook security warnings. See Security Manager for Microsoft Outlook for more information.
Use a low-level API which doesn't trigger such issues/prompts instead of OOM. Or any other third-party wrappers around that API, for example, Redemption.
Develop a COM add-in which has access to the trusted Application object. And then communicate from a standalone application with an add-in using standard .Net tools (Remoting).
Use group policy objects for setting up machines to not throw such issues.
Install the latest AV software.
Third, you may try to set recipients for the mail item using the Recipients collection which provides the Resolve method which attempts to resolve a Recipient object against the Address Book. Read more about that in the How To: Fill TO,CC and BCC fields in Outlook programmatically article.
In a program i wrote I have found the error "(-2147024809, 'The parameter is incorrect.', None, None)" whenever I try using mail.Send() before calling mail.Display().
Seems fairly consistent but can't explain why!
Hope this helps (sorry if it doesn't!)
...
if pdf_files is not None:
for pdf in pdf_files:
mail.Attachments.Add(pdf)
mail.Display() ##this line here
mail.Send()

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.

How authentication works while reading outlook emails with python and win32com

I understood that we can read emails from outlook using the following code(Reading e-mails from Outlook with Python through MAPI).
import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6) # "6" refers to the index of a folder - in this case,
# the inbox. You can change that number to reference
# any other folder
messages = inbox.Items
message = messages.GetLast()
body_content = message.body
print body_content
But we are not providing username and password anywhere in the above code.
Then How did the code authenticate the outlook account.
Can any one explain how the authentication is happening here.
win32com.client is interacting with Outlook COM object. Since Outlook is a singleton, you are actually spawning a "hidden" instance of Outlook. Remember that every time that you log in to Outlook you don't need to put username and password. This is why Username and Password are not required here as well.
Moreover, as long as the COM object of Outlook is opened, you won't be able to open Outlook through "exlporer". This is because only one instance of Outlook is allowed. You might notice that although you never opened Outlook's GUI, you still receiving the pop-up messages of new email.

How to attach a calendar invite to SES send_raw_email?

I use send_raw_email to send emails with HTML content and file attachments. How do I insert an ical/ics invite to the email?
I use icalendar to generate ics content.
This is what I came up with so far, but it shows in Gmail as a file attachment.
if calendar_reminder_date:
cal = Calendar()
cal.add('prodid', '-//My calendar product//mxm.dk//')
cal.add('version', '2.0')
cal.add('calscale', 'GREGORIAN')
cal.add('method', 'REQUEST')
event = Event()
event['dtstart'] = calendar_reminder_date.strftime("%Y%m%dT%H%M%SZ")
event['dtstamp'] = calendar_reminder_date.strftime("%Y%m%dT%H%M%SZ")
event['summary'] = 'Python meeting about calendaring'
cal.add_component(event)
attachment_part = MIMEText(cal.to_ical())
print repr(cal.to_ical())
del attachment_part['Content-Type']
attachment_part.add_header('Content-Type', 'text/calendar', name='invite.ics')
attachment_part.add_header('Content-Disposition', 'attachment', filename='invite.ics')
msg.attach(attachment_part)
Hard to tell without seeing the actual full MIME message as received on the Google side but there are definitely several things missing here:
a calendar REQUEST must have an ORGANIZER property, as well as at least one ATTENDEE property with a value corresponding to the email address of the gmail user (prefixed with a mailto:).
your content-type is missing a METHOD=REQUEST parameter and you probably do not want to set any content-disposition.
See also Multipart email with text and calendar: Outlook doesn't recognize ics

Categories

Resources