[python-win32] How to send mail via Extended MAPI
David Fraser
davidf at sjsoft.com
Fri Aug 20 14:20:56 CEST 2004
Hi Mark
Attached. In retrospect, setting the target address to the list wasn't
the wisest thing!
David
Mark Hammond wrote:
>This looks good. Would it be possible for you to:
>* Add a bit of a header, including that URL you ported it from.
>* Give yourself credit for writing it.
>* Make the default target email address a variable, and set it somewhere
>invalid :)
>
>Then send it back to me, and I will stick it in the next distribution.
>
>Mark.
>
>
>
>>-----Original Message-----
>>From: python-win32-bounces at python.org
>>[mailto:python-win32-bounces at python.org]On Behalf Of David Fraser
>>Sent: Friday, 20 August 2004 1:29 AM
>>To: python-win32 at python.org
>>Subject: [python-win32] How to send mail via Extended MAPI
>>
>>
>>Hi
>>
>>I'm sure this code will be useful to others 'cause it took some blood
>>sweat and tears to work out ...
>>Perhaps it could be included (in some form) in the win32 mapi classes?
>>
>>David
>>
>>PS You can send mail easily using the Simple MAPI COM wrappers but it
>>has several problems with various patches for Outlook that bring up
>>dialogs etc.
>>
-------------- next part --------------
#!/usr/bin/env python
"""module to send mail with Extended MAPI using the pywin32 mapi wrappers..."""
# this was based on Jason Hattingh's C++ code at http://www.codeproject.com/internet/mapadmin.asp
# written by David Fraser <davidf at sjsoft.com> and Stephen Emslie <stephene at sjsoft.com>
# you can test this by changing the variables at the bottom and running from the command line
from win32com.mapi import mapi
from win32com.mapi import mapitags
# Pre 2.2.1 compat.
try: True, False
except NameError: True = 1==1; False = 1==0
def SendEMAPIMail(Subject="", Message="", SendTo=None, SendCC=None, SendBCC=None, MAPIProfile=None):
"""Sends an email to the recipient using the extended MAPI interface
Subject and Message are strings
Send{To,CC,BCC} are comma-separated address lists
MAPIProfile is the name of the MAPI profile"""
# initialize and log on
mapi.MAPIInitialize(None)
session = mapi.MAPILogonEx(0, MAPIProfile, None, mapi.MAPI_EXTENDED | mapi.MAPI_USE_DEFAULT)
messagestorestable = session.GetMsgStoresTable(0)
messagestorestable.SetColumns((mapitags.PR_ENTRYID, mapitags.PR_DISPLAY_NAME_A, mapitags.PR_DEFAULT_STORE),0)
while (True):
rows = messagestorestable.QueryRows(1, 0)
if len(rows) != 1:
break
row = rows[0]
propertyid, propertyvalue = row[0]
if (propertyid == mapitags.PR_DEFAULT_STORE and propertyvalue == True):
break
# unpack the row and open the message store
(eid_tag, eid), (name_tag, name), (def_store_tag, def_store) = row
msgstore = session.OpenMsgStore(0,eid,None,mapi.MDB_NO_DIALOG | mapi.MAPI_BEST_ACCESS)
# get the outbox
hr, props = msgstore.GetProps((mapitags.PR_IPM_OUTBOX_ENTRYID), 0)
(tag, eid) = props[0]
outboxfolder = msgstore.OpenEntry(eid,None,mapi.MAPI_BEST_ACCESS)
# create the message and the addrlist
message = outboxfolder.CreateMessage(None,0)
# note: you can use the resolveaddress functions for this. but you may get headaches
pal = []
def makeentry(recipient, recipienttype):
return ((mapitags.PR_RECIPIENT_TYPE, recipienttype),
(mapitags.PR_SEND_RICH_INFO, False),
(mapitags.PR_DISPLAY_TYPE, 0),
(mapitags.PR_OBJECT_TYPE, 6),
(mapitags.PR_EMAIL_ADDRESS_A, recipient),
(mapitags.PR_ADDRTYPE_A, 'SMTP'),
(mapitags.PR_DISPLAY_NAME_A, recipient))
if SendTo:
pal.extend([makeentry(recipient, mapi.MAPI_TO) for recipient in SendTo.split(",")])
if SendCC:
pal.extend([makeentry(recipient, mapi.MAPI_CC) for recipient in SendCC.split(",")])
if SendBCC:
pal.extend([makeentry(recipient, mapi.MAPI_BCC) for recipient in SendBCC.split(",")])
# add the resolved recipients to the message
message.ModifyRecipients(mapi.MODRECIP_ADD,pal)
message.SetProps([(mapitags.PR_BODY_A,Message),
(mapitags.PR_SUBJECT_A,Subject)])
# save changes and submit
outboxfolder.SaveChanges(0)
message.SubmitMessage(0)
if __name__ == '__main__':
MAPIProfile = ""
# Change this to a valid email address to test
SendTo = "an.invalid at address"
SendMessage = "testing one two three"
SendSubject = "Testing Extended MAPI!!"
SendEMAPIMail(SendSubject, SendMessage, SendTo, MAPIProfile=MAPIProfile)
More information about the Python-win32
mailing list