1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #!/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, mapitags
-
-
- 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 this is the last row then stop
- if len(rows) != 1:
- break
- row = rows[0]
- # if this is the default store then stop
- if (mapitags.PR_DEFAULT_STORE, True) in row:
- 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]
- # check for errors
- if mapitags.PROP_TYPE(tag) == mapitags.PT_ERROR:
- raise TypeError("got PT_ERROR instead of PT_BINARY: %s" % eid)
- 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)
|