Trying to send a mail from Outlook 2007 using Python (win32com.client)

17,223

Solution 1

never mind...

import win32com.client
olMailItem = 0x0
obj = win32com.client.Dispatch("Outlook.Application")
newMail = obj.CreateItem(olMailItem)
newMail.Subject = "I AM SUBJECT!!"
newMail.Body = "I AM IN THE BODY\nSO AM I!!!"
newMail.To = "[email protected]"
#newMail.CC = "moreaddresses here"
#newMail.BCC = "address"
#attachment1 = "Path to attachment no. 1"
#attachment2 = "Path to attachment no. 2"
#newMail.Attachments.Add(attachment1)
#newMail.Attachments.Add(attachment2)
#newMail.display()
newMail.Send()

This works on Python 3.2.3 with PyWin32 installed. I have commented out some lines for if you want to play with this.

[2017 EDIT] - adding HTML email support (in case it's handy for anyone)

import win32com.client

#some constants (from http://msdn.microsoft.com/en-us/library/office/aa219371%28v=office.11%29.aspx)
olFormatHTML = 2
olFormatPlain = 1
olFormatRichText = 3
olFormatUnspecified = 0
olMailItem = 0x0


obj = win32com.client.Dispatch("Outlook.Application")
newMail = obj.CreateItem(olMailItem)
newMail.Subject = "I AM SUBJECT!!"
newMail.BodyFormat = olFormatHTML    #or olFormatRichText or olFormatPlain
newMail.HTMLBody = "<h1>I am a title</h1><p>I am a paragraph</p>"
newMail.To = "[email protected]; [email protected]"

# carbon copies and attachments (optional)

#newMail.CC = "moreaddresses here"
#newMail.BCC = "address"
#attachment1 = "Path to attachment no. 1"
#attachment2 = "Path to attachment no. 2"
#newMail.Attachments.Add(attachment1)
#newMail.Attachments.Add(attachment2)

# open up in a new window and allow review before send
newMail.display()

# or just use this instead of .display() if you want to send immediately
#newMail.Send()

Solution 2

the code above works on Python 2.7 as well. the error in the original post is caused by:

s = win32com.client.Dispatch("Mapi.Session") Traceback (most recent call last): File "", line 1, in File "c:\Python27\lib\site-packages\win32com\client__init__.py", line 95, in Dispatch dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx) File "c:\Python27\lib\site-packages\win32com\client\dynamic.py", line 108, in _GetGoodDispatchAndUserName return (_GetGoodDispatch(IDispatch, clsctx), userName) File "c:\Python27\lib\site-packages\win32com\client\dynamic.py", line 85, in _GetGoodDispatch IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.IID_IDispatch)

it used to work in Outlook 2003. I suppose 2007 simply does not need the MAPI and logon.

Share:
17,223
TheDavil
Author by

TheDavil

Check out http://about.me/thedavil for my bio page.

Updated on June 05, 2022

Comments

  • TheDavil
    TheDavil almost 2 years

    I'm attempting to start some Outlook 2007 automation with Python. I got this great script (below) from Steve Townsend on this thread: Send Outlook Email Via Python?

    but I'm having trouble getting started with this.

    import win32com.client
    
    def send_mail_via_com(text, subject, recipient, profilename="Outlook2007"):
        s = win32com.client.Dispatch("Mapi.Session")
        o = win32com.client.Dispatch("Outlook.Application")
        s.Logon(profilename)
    
        Msg = o.CreateItem(0)
        Msg.To = recipient
    
        Msg.CC = "moreaddresses here"
        Msg.BCC = "address"
    
        Msg.Subject = subject
        Msg.Body = text
    
        #attachment1 = "Path to attachment no. 1"
        #attachment2 = "Path to attachment no. 2"
        #Msg.Attachments.Add(attachment1)
        #Msg.Attachments.Add(attachment2)
    
        Msg.Send()
    
    
    send_mail_via_com("test text","test subject", "[email protected]","Outlook2007")
    

    But I get the following Errors:

    Traceback (most recent call last):
      File "C:\Python32\lib\site-packages\win32com\client\dynamic.py", line 83, in _
    GetGoodDispatch
        IDispatch = pythoncom.connect(IDispatch)
    pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "C:\PROJECTS\Python\send_mail_test.py", line 25, in <module>
        send_mail_via_com("test text","test subject", "[email protected]","Outloo
    k2007")
      File "C:\PROJECTS\Python\send_mail_test.py", line 4, in send_mail_via_com
        s = win32com.client.Dispatch("Mapi.Session")
      File "C:\Python32\lib\site-packages\win32com\client\__init__.py", line 95, in
    Dispatch
        dispatch, userName = dynamic._GetGoodDispatchAndUserName(dispatch,userName,c
    lsctx)
      File "C:\Python32\lib\site-packages\win32com\client\dynamic.py", line 108, in
    _GetGoodDispatchAndUserName
        return (_GetGoodDispatch(IDispatch, clsctx), userName)
      File "C:\Python32\lib\site-packages\win32com\client\dynamic.py", line 85, in _
    GetGoodDispatch
        IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx, pythoncom.II
    D_IDispatch)
    pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)
    

    It's probably something silly that I've missed.

    It's Python 3.2 and PyWin32 has been installed

    Many Thanks