X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FMain.hs;h=ac72ad513919bc932866bed73608268935ec8062;hb=b145be12d1587d37fc02ab6d12cc01b2506cfd25;hp=d2346c427f18845d932631e7250001326e387190;hpb=a5e228280dfbdbd8f2b1f271adb362fee1a43de4;p=email-validator.git diff --git a/src/Main.hs b/src/Main.hs index d2346c4..ac72ad5 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -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