Python To Send Emails Via Outlook Express
Lenard Lindstrom
len-1 at telus.net
Fri Dec 24 01:41:05 EST 2004
ian at kirbyfooty.com writes:
> Hello again,
> Thanks for the advice!
> Unfortunately I still cannot get it to send attachments.
> It comes up with the following windows error..
> (I have a feeling it has something to do with the file count)
>
> >>> import simplemapi
> >>> simplemapi.SendMail("ian at cgbs.com.au","The Subject","The
> body","c:\ian\ian.txt")
> nFileCount 14
> Traceback (most recent call last):
> File "<interactive input>", line 1, in ?
> File "simplemapi.py", line 111, in SendMail
> raise WindowsError, "MAPI error %i" % rc
> WindowsError: MAPI error 2
>
Two problems:
1) SendMail is looking for a list of attachment files.
2) SendMail wants the attachments to be in the current
working directory; that is what the:
attach = map( os.path.abspath, attach )
is about, right?
Try this:
import simplemapi
import os
os.chdir("c:\ian")
simplemapi.SendMail("ian at cgbs.com.au", "The Subject",
"The body", ["ian.txt"])
>
> This is the updated script..
>
> ----------------------------------
> import os
> from ctypes import *
>
> FLAGS = c_ulong
> LHANDLE = c_ulong
> LPLHANDLE = POINTER(LHANDLE)
>
>
> # Return codes
> SUCCESS_SUCCESS = 0
> # Recipient class
> MAPI_ORIG = 0
> MAPI_TO = 1
>
>
> NULL = c_void_p(None)
>
>
> class MapiRecipDesc(Structure):
> _fields_ = [('ulReserved', c_ulong),
> ('ulRecipClass', c_ulong),
> ('lpszName', c_char_p),
> ('lpszAddress', c_char_p),
> ('ulEIDSize', c_ulong),
> ('lpEntryID', c_void_p),
> ]
> lpMapiRecipDesc = POINTER(MapiRecipDesc)
>
>
> class MapiFileDesc(Structure):
> _fields_ = [('ulReserved', c_ulong),
> ('flFlags', c_ulong),
> ('nPosition', c_ulong),
> ('lpszPathName', c_char_p),
> ('lpszFileName', c_char_p),
> ('lpFileType', c_void_p),
> ]
> lpMapiFileDesc = POINTER(MapiFileDesc)
>
>
> class MapiMessage(Structure):
> _fields_ = [('ulReserved', c_ulong),
> ('lpszSubject', c_char_p),
> ('lpszNoteText', c_char_p),
> ('lpszMessageType', c_char_p),
> ('lpszDateReceived', c_char_p),
> ('lpszConversationID', c_char_p),
> ('flFlags', FLAGS),
> ('lpOriginator', lpMapiRecipDesc), # ignored?
> ('nRecipCount', c_ulong),
> ('lpRecips', lpMapiRecipDesc),
> ('nFileCount', c_ulong),
> ('lpFiles', lpMapiFileDesc),
> ]
> lpMapiMessage = POINTER(MapiMessage)
>
>
> MAPI = windll.mapi32
>
>
> MAPISendMail=MAPI.MAPISendMail
> MAPISendMail.restype = c_ulong # Error code
> MAPISendMail.argtypes = (LHANDLE, # lhSession
> c_ulong, # ulUIParam
> lpMapiMessage, # lpMessage
> FLAGS, # lpFlags
> c_ulong, # ulReserved
> )
>
>
> def SendMail(recipient, subject, body, attach=[]):
> """Post an e-mail message using Simple MAPI
>
>
> recipient - string: address to send to
> subject - string: subject header
> body - string: message text
> attach - string: files to attach
> """
> attach = map( os.path.abspath, attach )
> nFileCount = len(attach)
> if attach:
> MapiFileDesc_A = MapiFileDesc * len(attach)
> fda = MapiFileDesc_A()
> for fd, fa in zip(fda, attach):
> fd.ulReserved = 0
> fd.flFlags = 0
> fd.nPosition = -1
> fd.lpszPathName = fa
> fd.lpszFileName = None
> fd.lpFileType = None
> lpFiles = fda
> else:
> # No attachments
> lpFiles = cast(NULL, lpMapiFileDesc) # Make NULL
>
> print "nFileCount ",nFileCount
>
>
> recip = MapiRecipDesc(0, MAPI_TO, None, recipient, 0, None)
> #msg = MapiMessage(0, subject, body, None, None, None, 0,
> # cast(NULL, lpMapiRecipDesc), 1, pointer(recip),
> # nFileCount, cast(NULL, lpMapiFileDesc))
> msg = MapiMessage(0, subject, body, None, None, None, 0,
> cast(NULL, lpMapiRecipDesc), 1, pointer(recip),
> nFileCount, lpFiles)
>
>
> rc = MAPISendMail(0, 0, byref(msg), 0, 0)
> if rc != SUCCESS_SUCCESS:
> raise WindowsError, "MAPI error %i" % rc
>
> --------------------------
>
> Thanks again for your help so far on this. I really appreciate it!
> Have a safe and very merry Christmas.
>
And the same to you.
Lenard Lindstrom
<len-l at telus.net>
More information about the Python-list
mailing list