+validate_mx resolver domain
+ | domain `elem` common_domains = return True
+ | otherwise = do
+ result <- lookupMX resolver domain
+ case result of
+ Nothing -> return False
+ _ -> return True
+
+-- | Split an address into local/domain parts.
+parts :: Address -> (BSU.ByteString, BSU.ByteString)
+parts address = bytestring_split address '@'
+
+-- | Check that the lengths of the local/domain parts are within spec.
+validate_length :: Address -> Bool
+validate_length address =
+ (BSU.length localpart <= 64) && (BSU.length domain <= 255)
+ where
+ (localpart, domain) = parts address
+
+-- | Validate an email address against a simple regex. This should
+-- catch common addresses but disallows a lot of (legal) weird stuff.
+validate_regex :: Address -> Bool
+validate_regex address =
+ case matches of
+ Nothing -> False
+ _ -> True
+ where
+ regex_str = "(\\w+)([\\w\\-\\.]*)@(([0-9a-zA-Z\\-]+\\.)+)[a-zA-Z]{2,4}"
+ regex_bs = BSU.fromString regex_str
+ regex = compile regex_bs [utf8]
+ matches = match regex address []
+
+-- | Validate the syntax of an email address by checking its length
+-- and validating it against a simple regex.
+validate_syntax :: Address -> Bool
+validate_syntax address =
+ (validate_length address) && (validate_regex address)