# Saturday, July 16, 2005

The code below requires BLAT 2.40 (the version of the DLL that was based on 1.9.4 will not send multiple comma delimited attachments).  So, if you don't have it, download BLAT here.

BLAT comes in two flavors, the Exe and the DLL.  I personally prefer the the DLL... it's small around 100kb and it is a C DLL so it doesn't need to be registered on a user's machine.  The best part of BLAT is that it was released into the Public Domain (Free as Free gets) and it is open source (you get the code).  The features that this little component has are pretty impressive.  Once you've had an opportunity to run the code below, take a look at some of the other features (switches) that are available.  Also, here is the official site for BLAT where you can get additional information regarding the project.

Okay, with all that out of the way, let's take a look at the code.

*******************************
*!* Example of using SendViaBLAT
*******************************
#DEFINE PRIORITYHIGH 1
#DEFINE PRIORITYLOW 0

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 lcFrom, lcTo, lcSubject, lcBody, lcCC, lcBCC, lcMailServer, lcUserName, lcPassword, lnPort, lnPriority, llHTMLFormat, lcErrReturn

lcFrom = "me@myhost.com"
lcTo = "someone@theirhost.com"
lcSubject = "Hey Have You Tried VFP Email?"
*!* Sending the body in HTML format
llHTMLFormat = .T. && change to .F. to send plain text message
lcBody = "<a href='http://www.sweetpotatosoftware.com/SPSBlog/default.aspx'>" + ;
 "Hey Have You Tried VFP Email?" + ;
 "</a>"
lcCC = "someoneelse@someotherhost.com"
lcBCC = "myboss@bosshost.com"
lcMailServer = "mail.myhost.com" && my SMTP Server
lnPort = 25 && default SMTP Server port
lcUserName = "MyUsername" && my SMTP username
lcPassword = "My_PaSsWoRd" && my SMTP password
lnPriority = PRIORITYHIGH

SendViaBLAT(@lcErrReturn, lcFrom, lcTo, lcSubject, lcBody, @aryAttach, lcCC, lcBCC, lcMailServer, lnPort, lcUserName, lcPassword, lnPriority, llHTMLFormat)

IF EMPTY(lcErrReturn)
 MESSAGEBOX("'" + lcSubject + "' sent successfullly.", 64, "Send email via BLAT")
ELSE
 MESSAGEBOX("'" + lcSubject + "' failed to be sent.  Reason:" + CHR(13) + lcErrReturn, 64, "Send email via BLAT")
ENDIF

*******************************************
PROCEDURE SendViaBLAT(tcReturn, tcFrom, tcTo, tcSubject, tcBody, taFiles, tcCC, tcBCC, tcMailServer, tnPort, tcUserName, tcPassword, tnPriority, tlHTMLFormat)
*******************************************
 LOCAL lcBlatParam, lcBodyFile, lnCountAttachments, lnResult, loError as Exception
 
 lcBodyFile = ""
 
 TRY
  *!* Include full path in Declare, such as "C:\Blat240\full\blat.dll"
  *!* or make sure that blat.dll is included in the system's PATH variable
  DECLARE INTEGER Send IN "blat.dll" STRING cParam
  
  lcBodyFile = ADDBS(SYS(2023)) + SYS(2015) + ".txt"
  STRTOFILE(tcBody, lcBodyFile, 0) && body is placed in a text file to be sent by BLAT
  
  lcBlatParam = GetShortPath(lcBodyFile)
  
  IF TYPE("tcTo") = "C"
    lcBlatParam = lcBlatParam + " -to " + ALLTRIM(tcTo)
  ENDIF
  IF TYPE("tcFrom") = "C"
    lcBlatParam = lcBlatParam + " -f " + ALLTRIM(tcFrom)
  ENDIF
  IF TYPE("tcCC") = "C"
    lcBlatParam = lcBlatParam + " -cc " + ALLTRIM(tcCC)
  ENDIF
  IF TYPE("tcBCC") = "C"
    lcBlatParam = lcBlatParam + " -bcc " + ALLTRIM(tcBCC)
  ENDIF
  IF TYPE("tcSubject") = "C"
    lcBlatParam = lcBlatParam + [ -s "] + ALLTRIM(tcSubject) + ["]
  ENDIF
  IF TYPE("tcMailserver") = "C"
    lcBlatParam = lcBlatParam + " -server " + ALLTRIM(tcMailserver)
  ENDIF
  IF TYPE("tnPort") = "N"
    lcBlatParam = lcBlatParam + ":" + TRANSFORM(tnPort)
  ENDIF
  IF TYPE("tcUsername") = "C"
    lcBlatParam = lcBlatParam + " -u " + ALLTRIM(tcUsername)
  ENDIF
  IF TYPE("tcPassword") = "C"
    lcBlatParam = lcBlatParam + " -pw " + ALLTRIM(tcPassword)
  ENDIF
  IF TYPE("tnPriority") = "N" AND BETWEEN(tnPriority, 0, 1)
    lcBlatParam = lcBlatParam + " -priority " + TRANSFORM(tnPriority)
  ENDIF
  IF TYPE("tlHTMLFormat") = "L" AND tlHTMLFormat
    lcBlatParam = lcBlatParam + " -html"
  ENDIF

  IF TYPE("taFiles", 1) = "A"
    lcBlatParam = lcBlatParam + " -attach "
   FOR lnCountAttachments = 1 TO ALEN(taFiles)
     lcBlatParam = lcBlatParam + GetShortPath(ALLTRIM(taFiles(lnCountAttachments))) + ","
   ENDFOR
   lcBlatParam = LEFT(lcBlatParam, LEN(lcBlatParam) - 1) && Remove Extra Comma
  ENDIF

  lnResult = Send(ALLTRIM(lcBlatParam))
  
  IF lnResult != 0
   DO CASE
    CASE lnResult = -2
     THROW "The server actively denied our connection./The mail server doesn't like the sender name. "
    CASE lnResult = -1
     THROW "Unable to open SMTP socket" OR ;
       "SMTP get line did not return 220" OR ;
       "command unable to write to socket" OR ;
       "Server does not like To: address" OR ;
       "Mail server error accepting message data."
    CASE lnResult = 1
     THROW "File name (message text) not given" OR ;
       "Bad argument given"
    CASE lnResult = 2
     THROW "File (message text) does not exist"
    CASE lnResult = 3
     THROW "Error reading the file (message text) or attached file"
    CASE lnResult = 4
     THROW "File (message text) not of type FILE_TYPE_DISK "
    CASE lnResult = 5
     THROW "Error Reading File (message text)"
    CASE lnResult = 12
     THROW "-server or -f options not specified and not found in registry"
    CASE lnResult = 13
     THROW "Error opening temporary file in temp directory"
    OTHERWISE
     THROW "Unknown Error"
   ENDCASE
  ENDIF

 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
  CLEAR DLLS "Send"
  IF FILE(lcBodyFile)
   ERASE (lcBodyFile)
  ENDIF
 ENDTRY
ENDPROC

****************************************
Function GetShortPath
****************************************
 LPARAMETERS lcFileName
 LOCAL lnReturn, lcBuffer

 Declare Integer GetShortPathNameA In Win32API As GetShortPathName String, String, Integer

 lcBuffer = SPACE(255)
 lnReturn= GetShortPathName(lcFileName, @lcBuffer, 255)

 Clear Dlls "GetShortPathName"
 
 Return (Left(lcBuffer, lnReturn))
ENDFUNC

Saturday, July 16, 2005 11:29:38 AM (GMT Daylight Time, UTC+01:00)  #    Comments [4]

 

Archive

<July 2005>
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456