local objMsg, msgStream, tmpFilename && (1) Prepare a CDO message objMsg = CreateObject('CDO.Message') objMsg.To = 'colin@colin-northway.com' objMsg.subject ='Meet for lunch' if( .t. ) && not a html file objMsg.TextBody ='Please join me for sandwich. We can meet at noon' else objMsg.HTMLbody = FileToStr('d:\tmp\pp.htm') endif && add attachment if needed =m.objMsg.AddAttachment('d:\tmp\1.pdf') objMsg.Fields("urn:schemas:mailheader:x-unsent")=1 =m.objMsg.Fields.Update() && (2) Save the stream of the CDO message to a temp eml file msgStream = m.objMsg.GetStream() tmpFilename = 'd:\tmp\1.eml' =m.msgStream.SaveToFile(m.tmpFilename ) && (3) Launch ShellExecute - it will open the default mail (outlook, windows live mail, ...) DECLARE INTEGER ShellExecute IN shell32.dll ; INTEGER hndWin, STRING cAction, STRING cFileName, ; STRING cParams, STRING cDir, INTEGER nShowWin =ShellExecute(0,"open",m.tmpFilename ,"","",1) && (4) get rid of the temp eml file && left for you