]> gitweb.michael.orlitzky.com - email-validator.git/blobdiff - src/Main.hs
Increase the timeout from 5s to 10s.
[email-validator.git] / src / Main.hs
index d2346c427f18845d932631e7250001326e387190..ac72ad513919bc932866bed73608268935ec8062 100644 (file)
@@ -15,7 +15,7 @@ import Network.DNS (
   defaultResolvConf,
   makeResolvSeed,
   withResolver)
-import Network.DNS.Lookup (lookupMX)
+import Network.DNS.Lookup (lookupA, lookupMX)
 import System.Directory (doesFileExist)
 import System.Exit (exitWith, ExitCode(..))
 import System.IO (
@@ -33,10 +33,10 @@ import EmailAddress
 import ExitCodes (exit_input_file_doesnt_exist)
 
 
--- | Resolver parameters. We increase the default timeout from 3 to 5
+-- | Resolver parameters. We increase the default timeout from 3 to 10
 --   seconds.
 resolv_conf ::  ResolvConf
-resolv_conf = defaultResolvConf { resolvTimeout = 5 * 1000 * 1000 }
+resolv_conf = defaultResolvConf { resolvTimeout = 10 * 1000 * 1000 }
 
 -- | A list of common domains, there's no need to waste MX lookups
 --   on these.
@@ -60,23 +60,35 @@ validate_mx resolver domain
         _       -> return True
 
 
--- | 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)
+-- | Check whether the given domain has a valid A record.
+validate_a :: Resolver -> Domain -> IO Bool
+validate_a resolver domain
+  | domain `elem` common_domains = return True
+  | otherwise = do
+      result <- lookupA resolver domain
+      case result of
+        Nothing -> return False
+        _       -> return True
 
 
 -- | Validate an email address by doing some simple syntax checks and
 --   (if those fail) an MX lookup. We don't count an A record as a mail
 --   exchanger.
-validate :: Resolver -> Address -> IO (Address, Bool)
-validate resolver address = do
-  let valid_syntax = validate_syntax address
+validate :: Resolver -> Bool -> Bool -> Address -> IO (Address, Bool)
+validate resolver accept_a rfc5322 address = do
+  let valid_syntax = validate_syntax rfc5322 address
   if valid_syntax then do
     let (_,domain) = parts address
     mx_result <- validate_mx resolver domain
-    return (address, mx_result)
+    if mx_result
+    then return (address, True)
+    else
+      if accept_a
+      then do
+        a_result <- validate_a resolver domain
+        return (address, a_result)
+      else
+        return (address, False)
   else
     return (address, False)
 
@@ -118,7 +130,8 @@ main = do
   rs <- makeResolvSeed resolv_conf
   withResolver rs $ \resolver -> do
     -- Construst a list of [IO (Address, Bool)]
-    let actions = map (validate resolver) nonempty_addresses
+    let validate' = validate resolver accept_a rfc5322
+    let actions = map validate' nonempty_addresses
     -- And compute them in parallel.
     results <- parallel actions
     stopGlobalPool