?IsEmailValid("craig1442@.com")
?IsEmailValid("craig1442@mchsi.com")
FUNCTION IsEmailValid(tcEmailAddy)
LOCAL lnAtSymbol, lnDotSymbol, lnLength, lnAtOccurs, llInvalid, lnDomainLen, lnTogether
tcEmailAddy = ALLTRIM(tcEmailAddy) && optional if you want
lnAtSymbol = AT("@",tcEmailAddy)
lnDotSymbol = AT(".",tcEmailAddy)
lnLength = LEN(tcEmailAddy)
lnAtOccurs = OCCURS("@", tcEmailAddy)
llInvalid = LEN(CHRTRAN(tcEmailAddy, "!#$%^&*()=+{}[]|\;:'/?>,< ","")) != lnLength
lnDomainLen = RAT(".", tcEmailAddy)
lnTogether = AT("@.", tcEmailAddy) + AT(".@", tcEmailAddy)
DO case
*!* @ cannot be at beginning or end and must occur only once
CASE lnAtSymbol = 1 OR lnAtSymbol = lnLength OR lnAtOccurs != 1
RETURN .F.
*!* Dot must not be at beginning or end and must occur at least once
CASE lnDotSymbol < 2 OR lnDotSymbol = lnLength
RETURN .F.
*!* length must be at least 8 (xx@xx.xx)
CASE lnLength < 8
RETURN .F.
*!* @ and Dot cannot be together
CASE lnTogether > 0
RETURN .F.
*!* subdomain must be at least 2 characters long (additional check could be done on all valid subdomains)
CASE lnDomainLen < 2
RETURN .F.
*!* no invalid characters
CASE llInvalid
RETURN .F.
*!* Email is potentially valid
OTHERWISE
RETURN .T.
ENDCASE