Hello,
Is it possible to use TSMTP class and send email automatically (without Outlook) with from user authentication? If so, can you provide sample code?
Thank you,
Hello,
Is it possible to use TSMTP class and send email automatically (without Outlook) with from user authentication? If so, can you provide sample code?
Thank you,
Darrell,
There is a modification for FWH Class TSmtp but it looks as it does not work properly on all circunstances.
As Rene suggested, you may use funcky SMTP component as it supports authentication.
Hi Antonio,
Where can I obtain the funky SMTP component?
Thank you,
Darrell,
Anyhow, here you have the Class TSmtp from FiveWin modified to support authentication by Luis Krause:
Antonio Linares wrote:Darrell,
www.funcky.com
Anyhow, here you have the Class TSmtp from FiveWin modified to support authentication by Luis Krause:
http://fivetechsoft.com/forums/viewtopi ... entication
Hi Evans,
I own SEE32 also but I was told it does not work with FWH? Did you get it to work with FWH?
cdmmaui wrote:Hi Evans,
I own SEE32 also but I was told it does not work with FWH? Did you get it to work with FWH?
#define ST_INIT 0
#define ST_CONNECTED 1
#define ST_RESET 2
#define ST_MAILFROM 3
#define ST_RCPTTO 4
#define ST_DATA 5
#define ST_SENT 6
#define ST_QUIT 7
#define ST_DONE 8
#define ST_ERROR 9
// AS 08/09/2005 New status code for authentication
#define ST_AUTH 10
::lSimpleSMTP := file(FixPath(cExepath()) + "HELOSMTP.MSG")
METHOD OnRead( oSocket ) CLASS qSmtp
/*
Handles receiving data from the mail server and responding to it
*/
Local cData := oSocket:Getdata()
Local n := 0
Local nCount := 0
Local nStop := 0
Local cCC := ""
Local cReply := left(cData, 3)
Local nPos := 0
Local cTempFileTemplate := ""
Local cTempMimeFile := ""
Local aMimeFiles := {}
Local cMailHeader := ""
Local cNextPartHeader := ""
Local cTempMsgMimeFile := ""
Local lMultiPart := .f.
Local lHtmlMsg := ""
Local lHtmlMsgFile := ""
Local nNow := 0
// PK 29/08/2005
Local nRemSeconds := 0
// Buffer received data, as you do not necessarily receive all the server data in one go e.g.
::cReceived += cData // cReceived is built up until it is a complete server response
// Pull out full lines received
Do While at(CRLF, ::cReceived) > 0
nPos := at(CRLF, ::cReceived)
// Build up an array of all the server replies
aadd(::acReply, left(::cReceived, nPos - 1))
::cReceived := substr(::cReceived, nPos + 2)
Enddo
// Has closing line been received i.e. full reply from server (may come in dribs and drabs)
If substr(atail(::acReply), 4, 1) == " "
// We now have the full server response, now process it.
// AS 08/09/2005
cReply := substr(atail(::acReply), 1, 3)
If ::lLog
// AS 08/09/2005
aeval(::acReply, {|pcReply| LogFile(::cLogFile, {"SERVER: " + pcReply})})
// LogFile(::cLogFile, {"MAILSERVER (Status = " + NTRIM(::nStatus)+"): " + cReply})
Endif
Do Case
Case ::nStatus == ST_INIT
If cReply == "220" // Server acknowleges connection
// Send helo and hop to next status
::nStatus := ST_CONNECTED
// AS 20/01/2006
If ::lSimpleSMTP
::SendData("HELO " + strtoken(::cFrom, 2, "@") + CRLF )
Else
// AS 08/09/2005 Enhanced response request (causes server to list capabilities, and requirements)
::SendData("EHLO " + strtoken(::cFrom, 2, "@") + CRLF )
Endif
If ::bConnected != nil
eval( ::bConnected )
Endif
Else
::Failure(atail(::acReply))
Endif
Case ::nStatus == ST_CONNECTED
// We are connected
Do Case
Case cReply == "250" // Server happy
// Send mail from and hop to next status
// AS 08/09/2005 Check if authentication is indicated in the reply, and see if our supported method of authentication is accepted
//
If (nPos := ascan(::acReply, {|pcReply| left(pcReply, 8) == "250-AUTH"})) > 0 ;
.and. !empty(::cEmailUser) // PK 03/10/2005, only try authenticate if a user name is setup
// We need to authenticate, but can we handle it?
If at("LOGIN", ::acReply[nPos]) > 0
// We can do it
// AS 22/09/2005 Check if we have user name and password
If empty(::cEmailUser) .or. empty(::cEmailPassword)
::Failure("The email server requires authentication, but the user name and/or password are blank.")
Else
::cAuthType := "LOGIN"
::nStatus := ST_AUTH
::SendData("AUTH LOGIN" + CRLF)
Endif
Else
::Failure("Unsupported authentication method")
Endif
Else
// Previous code
::nStatus := ST_MAILFROM
::SendData(strtran( "MAIL FROM:<%>", "%", ::cFrom ) + CRLF )
::nTo := 1 // First recipient index to send mail to
Endif
// AS 20/01/2006 Cater for servers not understanding EHLO command
Case cReply == "500" // Server said "Say what?"
If !::lSimpleSMTP
// Try Simple SMTP
::lSimpleSMTP := .t.
::SendData("HELO " + strtoken(::cFrom, 2, "@") + CRLF )
Else
// Simple failed
::Failure(atail(::acReply))
Endif
Otherwise
::Failure(atail(::acReply))
Endcase
// AS 08/09/2005 Manage authentication
Case ::nStatus == ST_AUTH
Do Case
Case cReply == "334"
Do Case
Case ::cAuthType == "LOGIN"
// We're logging in
If !::lSentUser
::lSentUser := .t.
::SendData(cmimeenc(alltrim(::cEmailUser)) + CRLF)
Else
If !::lSentPassword
::lSentPassword := .t.
::SendData(cmimeenc(alltrim(::cEmailPassword)) + CRLF)
Endif
Endif
Endcase
Case cReply == "235"
// Authentication OK
::nStatus := ST_MAILFROM
::SendData(strtran( "MAIL FROM:<%>", "%", ::cFrom ) + CRLF )
::nTo := 1 // First recipient index to send mail to
// PK 22/09/2005
// CASE cReply == "501"
Case cReply == "501" .or. left(cReply, 3) == "535"
// Authentication failure
::Failure("Authentication failure")
Otherwise
::Failure(atail(::acReply))
EndcaseHi Evans,
Does the SEE32 library support sending HTML as well?
Funcky is the way to go, support everything, authentication, htm support, and e-mail existing routines.
A little pricy, but worth the price.
Ok, dumb question - which one? for C++ for Xbase++ ?
Ollie:
Look for the COM component (Delphi, VB, BC++) works via OLE, here a sample:
http://www.google.d2g.com/funckydemo.zip
Regards
RF
ok