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 computeraryAttach(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 formatllHTMLFormat = .T. && change to .F. to send plain text messagelcBody = "<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 ServerlnPort = 25 && default SMTP Server portlcUserName = "MyUsername" && my SMTP usernamelcPassword = "My_PaSsWoRd" && my SMTP passwordlnPriority = 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 ENDTRYENDPROC
****************************************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
Remember Me
a@href@title, b, blockquote@cite, em, i, strike, strong, sub, super, u