Reinaldo
I had to resort to modifying Tsmtp .. just no other way arount it

.. here is what I did :
// use this public variable
// returns from tsmtp() .T.
lFAIL := .F.
oWndMdi:SetMsg( "Sending Reporting noticication to "+cTO )
WSAStartup()
oOutMail := TSmtp():New( cIP := GetHostByName( cHOST ) )
oOutMail:bConnecting := { || oWndMdi:SetMsg( "Connecting to "+cHOST ) }
oOutMail:bConnected := { || oWndMdi:SetMsg( "Connected" ) }
oOutMail:bDone := { || oWndMdi:SetMsg( "Message sent successfully" ) }
oOutMail:bFailure := { || oOutMail:nStatus := 7 } // keep this
oOutMail:SendMail( cFROM,; // From
{ cTO },; // To
cMESSAGE,; // Msg Text
cSUBJECT,;
{"C:\DBTMP\PROJINFO.BAT"},; // attachment
aCC, ; // cc array
{ }, ; // bc
.F., ; // no return receipt
NIL ) // not html
// wait for e-mail to be sent to get lfail value
SysWait(1)
IF lFAIL = .T.
cSUBJECT := "Email Error FAILED to be Sent"
* MsgInfo( cSUBJECT )
ENDIF
SysReFresh()
// create e-mail record //
cEID := _GenEid(2)
IF cEID = "BOGUS"
ELSE
oRsEmail:AddNew()
oRsEmail:Fields("emaileid"):Value := cEID
oRsEmail:Fields("projecteid"):Value := oRsProj:Fields("projecteid"):Value
oRsEmail:Fields("date_sent"):Value := dtoc(DATE())+" "+time()
oRsEmail:Fields("email_from"):Value := cFROM
oRsEmail:Fields("email_to"):Value := cTO //+", "+AEVAL(aCC)
oRsEmail:Fields("subject"):Value := SUBSTR(cSUBJECT+SPACE(50),1,49)
oRsEmail:Fields("message"):Value := cMESSAGE
oRsEmail:Fields("attachments"):Value := "ProjInfo.Bat"
IF lFAIL = .T.
oRsEmail:Fields("address_error"):Value := "Y"
ELSE
oRsEmail:Fields("address_error"):Value := "N"
ENDIF
oRsEmail:Update()
ENDIF
Notice that I set lFail as PUBLIC and set it to .f. before Tsmtp was initialized .. then in Tsmtp I found the 'bad address' code :
Case ::nStatus == ST_MAILFROM .or. ::nStatus == ST_RCPTTO
If cReply == "250" .or. cReply == "251" // Server happy with our repsonse
If ::nTo <= Len( ::aTo )
oSocket:SendData( StrTran( "RCPT TO:<%>", "%", CleanEMail( ::aTo[ ::nTo ] ) ) + ;
CRLF )
::nStatus := ST_RCPTTO
::nTo++
Elseif ::nCC <= Len( ::aCC )
oSocket:SendData( StrTran( "RCPT TO:<%>", "%", CleanEMail( ::aCC[ ::nCC ] ) ) + ;
CRLF )
::nStatus := ST_RCPTTO
::nCC++
Elseif ::nBCC <= Len( ::aBCC )
oSocket:SendData( StrTran( "RCPT TO:<%>", "%", CleanEMail( ::aBCC[ ::nBCC ] ) ) + ;
CRLF )
::nStatus := ST_RCPTTO
::nBCC++
Else
::nStatus := ST_DATA
oSocket:SendData( "DATA" + CRLF )
Endif
Else
// failure here is e-mail address is bad
// Rick added to trap
lFAIL := .T.
Msginfo( "Message Failed to be sent because of a Bad Address")
::Failure( oSocket, nWSAError, cReply )
Endif
Then notice the SysWait(1) was very important here to reliably allow lFail to initalize and return back with it's correct value .. then I write the "address_error" field to Y if it failed N if it worked .. then when I browse the e-mail sent records I turn the row 'red' based on the value of 'address_error'.
This is not a perfect solution and the return code of Smtp is not always consistant .. and I found I could NOT put my lFail in the Failure() method .. was too inconsistant there ..
For now I have a work around .. not perfect because the SMTP error does not always return the same code..
Rick