As we’ve seen in the previous entries, emailing from VFP can be done in a variety of ways.  In this entry, I explore the use of a freely avaliable ActiveX control, simply known as EsSmtp.  This control was once sold commercially by Eurosource, but now resides on SourceForge.  It’s not only free, it’s open source (you get the source code). There’s quite a few controls available, but the only one I am currently familiar with is EsSmtp.

You’ll need to download and register this control in order for this example to work.  You can Download it here.  And, additional information about the properties and methods of the control can be found here.

Okay, without taking up anymore precious time, here’s the code.

*!* Example of using SendViaEsSmtp
DIMENSION aryAttach(2)
aryAttach(1) = “C:\attachment1.txt” && change to an actual file that exists on your computer
aryAttach(2) = “C:\” && change to an actual file that exists on your computer

LOCAL lcFromName, lcFromAddress, lcTo, lcSubject, lcBody, lcCC, lcBCC, lcSMTPServer, lcErrReturn

lcFromName = “My Name”
lcFromAddress = “
lcTo = “
lcSubject = “Hey Have You Tried VFP Email?”
lcBody = “Just wanted to let you know that VFP is pretty versatile and has a lot of ways to send email.”
lcCC = “
lcBCC = “
lcSMTPServer = “”

SendViaEsSmtp(@lcErrReturn, lcFromName, lcFromAddress, lcTo, lcSubject, lcBody, @aryAttach, lcCC, lcBCC, lcSMTPServer)

IF EMPTY(lcErrReturn)
 MESSAGEBOX(“‘” + lcSubject + “‘ sent successfullly.”, 64, “Send email via EsSmtp”)
 MESSAGEBOX(“‘” + lcSubject + “‘ failed to be sent.  Reason:” + CHR(13) + lcErrReturn, 64, “Send email via EsSmtp”)

PROCEDURE SendViaEsSmtp(tcReturn, tcFromName, tcFromAddress, tcTo, tcSubject, tcBody, taFiles, tcCC, tcBCC, tcSMTPSever)
 LOCAL loEsSmtp, lnCountAttachments, lnErrorNo
  loEsSmtp = CREATEOBJECT(“ESSMTP.EsSmtpCtrl.1”)
  WITH loEsSmtp
   IF TYPE(“tcSMTPSever”) = “C”
    .SMTPServer = tcSMTPSever
   IF TYPE(“tcFromName”) = “C”
    .SourceName = tcFromName
   IF TYPE(“tcFromAddress”) = “C”
    .SourceAddress = tcFromAddress
   .DestinationAddress = tcTo
   IF TYPE(“tcCC”) = “C”
    .CCDestinationAddress = tcCC
   IF TYPE(“tcBCC”) = “C”
    .BCCDestinationAddress = tcBCC
   .Subject = tcSubject
   .MailData = tcBody
   IF TYPE(“taFiles”, 1) = “A”
    FOR lnCountAttachments = 1 TO ALEN(taFiles)
     .AddAttachment(taFiles(lnCountAttachments), 0) && 0 signifies base64 encoding when needed
   IF .SendMail() != 1 && there was a problem
    lnErrorNo = .ErrorNo
     CASE lnErrorNo = 421
      THROW “Service not available, closing transmission channel”
     CASE lnErrorNo = 450
      THROW “Requested mail action not taken: mailbox unavailable [E.g., mailbox busy]”
     CASE lnErrorNo = 451
      THROW “Requested action aborted: local error in processing”
     CASE lnErrorNo = 452
      THROW “Requested action not taken: insufficient system storage”
     CASE lnErrorNo = 500
      THROW “Syntax error, command unrecognized [This may include errors such as command line too long]”
     CASE lnErrorNo = 501
      THROW “Syntax error in parameters or arguments”
     CASE lnErrorNo = 502
      THROW “Command not implemented”
     CASE lnErrorNo = 503
      THROW “Bad sequence of commands”
     CASE lnErrorNo = 504
      THROW “Command parameter not implemented”
     CASE lnErrorNo = 550
      THROW “Requested action not taken: mailbox unavailable [E.g., mailbox not found, no access]”
     CASE lnErrorNo = 552
      THROW “Requested mail action aborted: exceeded storage allocation”
     CASE lnErrorNo = 553
      THROW “Requested action not taken: mailbox name not allowed [E.g., mailbox syntax incorrect]”
     CASE lnErrorNo = 554
      THROW “Transaction failed”
      THROW “Unknown Error – Might be WinSock Related”

 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
  RELEASE loEsSmtp
  loEsSmtp = .NULL.