]> gitweb.michael.orlitzky.com - email-validator.git/blobdiff - src/Main.hs
Use a hyphen instead of an underscore in the program name.
[email-validator.git] / src / Main.hs
index 9b22f5cfa20afe00ac3b82160a743781061ae754..fc1b1b18eba02c44d549de693cc8f3d65fd6ea1e 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 (
@@ -60,17 +60,35 @@ validate_mx resolver domain
         _       -> return True
 
 
+-- | 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
+validate :: Resolver -> Bool -> Address -> IO (Address, Bool)
+validate resolver accept_a address = do
   let valid_syntax = validate_syntax 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)
 
@@ -112,7 +130,7 @@ 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 actions = map (validate resolver accept_a) nonempty_addresses
     -- And compute them in parallel.
     results <- parallel actions
     stopGlobalPool