Once in a while you’ll be forced to validate an email address (or many!) — The usual no-brainer method is to perform a quick syntactical test to ensure the address is not malformed, however even a properly formed address may be invalid or, unreachable.
Clearly we must add a second validation step… — Hey I know, let’s check the MX records!
Procedure.s Email_GetHost( eMail.s )
If eMail
ProcedureReturn Right( eMail, Len(eMail) - FindString(eMail, "@", 1) )
EndIf
EndProcedure
Procedure.i Email_ValidateAddress( eMail.s, CompleteValidation.i = #True )
Define.s pattern = "^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$"
Define.i is_valid = #False
Define.i handle = CreateRegularExpression( #PB_Any, pattern )
If IsRegularExpression( handle )
If MatchRegularExpression( handle, eMail )
If CompleteValidation
Dim mx.s(99)
If getmxrr( Email_GetHost(eMail), mx() ) ; see http://gushh.net/blog/2010/07/17/get-mx-records/
is_valid = #True
EndIf
Else
is_valid = #True
EndIf
Else
is_valid = -1
EndIf
FreeRegularExpression( handle )
EndIf
ProcedureReturn is_valid
EndProcedure
For the getmxrr() function click here. Or click here for the full code + example usage
The full code also contains a few other helper routines, I left them in there in case someone finds them useful.
These are the functions included in the source:
Email_GetName()
Email_GetHost()
Email_ValidateAddress()
Email_ConvertToLiteral()
Obviously you’ll have to tweak a bit the code, specially the way it handles the arrays. But overall it should be pretty usable. I might come up with a cross-platform version in the future, but so far I haven’t found a need for it.
Please double-check the example code, make sure you understand the routine could return <= 0 if validation fails (two modes basically, syntax fault and mx fault).
Feel free to leave a comment or send me your own version of the code!
Cheers!