If you can count on your users using Outlook for their email client (as opposed to Eudora or whatever), then the following code can come in handy.  Sending email via Outlook Automation gives us access to a number of features that come stock with the MailItem object.  I’ve touched on a few below, but for more information refer to the MailItem Object information out on the MSDN.







*******************************
*!* Example of using SendViaOutlook
*******************************
#DEFINE olImportanceLow 0
#DEFINE olImportanceNormal 1
#DEFINE olImportanceHigh 2


DIMENSION aryAttach(2)
aryAttach(1) = “C:\attachment1.txt” && change to an actual file that exists on your computer
aryAttach(2) = “C:\attachment2.zip” && change to an actual file that exists on your computer


LOCAL lcTo, lcSubject, lcBody, lcCC, lcBCC, llHTMLFormat, llOpenEmail, lcErrReturn


lcTo = “someone@sommehost.com
lcSubject = “Hey Have You Tried VFP Email?”
*!* Sending the body in HTML format
llHTMLFormat = .T.
lcBody = “<a href=’http://www.sweetpotatosoftware.com/SPSBlog/default.aspx’>” + ;
 “Hey Have You Tried VFP Email?” + ;
 “</a>”
lcCC = “
someoneelse@anotherhost.com
lcBCC = “
myboss@bosshost.com


*!* to automatically send email set llOpenEmail to .F.
llOpenEmail = .T. && Whether email is opened in Outlook or not


SendViaOutlook(@lcErrReturn, lcTo, lcSubject, lcBody, @aryAttach, lcCC, lcBCC, llHTMLFormat, olImportanceHigh, llOpenEmail)


IF EMPTY(lcErrReturn)
 MESSAGEBOX(“‘” + lcSubject + “‘” + IIF(llOpenEmail, ” opened “, ” sent “) + “successfullly.”, 64, “Send email via Outlook”)
ELSE
 MESSAGEBOX(“‘” + lcSubject + “‘ failed to be sent.  Reason:” + CHR(13) + lcErrReturn, 64, “Send email via Outlook”)
ENDIF


*******************************************
PROCEDURE SendViaOutlook(tcReturn, tcTo, tcSubject, tcBody, taFiles, tcCC, tcBCC, tlHTMLFormat, tnImportance, tlOpenEmail)
 *******************************************
 LOCAL loOutlook, loItem, lnCountAttachments, loMapi
 TRY
  loOutlook = CREATEOBJECT(“outlook.application”)
  loMapi = loOutLook.GetNameSpace(“MAPI”)
  loMapi.Logon()
  loItem = loOutlook.CreateItem(0)
  WITH loItem
   .Subject = tcSubject
   .TO = tcTo
   IF tlHTMLFormat
    .HTMLBody = tcBody
   ELSE
    .Body = tcBody
   ENDIF
   IF TYPE(“tcCC”) = “C”
    .CC = tcCC
   ENDIF
   IF TYPE(“tcBCC”) = “C”
    .BCC = tcBCC
   ENDIF
   IF TYPE(“tnImportance”) != “N”
    tnImportance = 1 && normal importance
   ENDIF
   .Importance = tnImportance
   IF TYPE(“tafiles”,1) = “A”
    FOR lnCountAttachments = 1 TO ALEN(taFiles)
     .Attachments.ADD(taFiles(lnCountAttachments))
    ENDFOR
   ENDIF
   IF tlOpenEmail
    .DISPLAY()
   ELSE
    .SEND()
   ENDIF
  ENDWITH
 CATCH TO loError
  tcReturn = [Error: ] + STR(loError.ERRORNO) + CHR(13) + ;
   [LineNo: ] + STR(loError.LINENO) + CHR(13) + ;
   [Message: ] + loError.MESSAGE + CHR(13) + ;
   [Procedure: ] + loError.PROCEDURE + CHR(13) + ;
   [Details: ] + loError.DETAILS + CHR(13) + ;
   [StackLevel: ] + STR(loError.STACKLEVEL) + CHR(13) + ;
   [LineContents: ] + loError.LINECONTENTS
 FINALLY
  RELEASE oOutlook, oItem
  STORE .NULL. TO oOutlook, oItem
 ENDTRY
ENDPROC


UPDATES
07/12/2005 – changed attachment names, changed PCOUNT() > 4 to use Type() instead, removed unused lnCount variable, centered table containing code, fixed lcBody variable assignment that had gotten butchered when I switched into HTML mode while posting blog entry, changed title so subject matter could be easily discerned


02/10/2006 – added lomapi.logon() code