How do I check if an email address is valid without sending anything to it?

后端 未结 7 2048
有刺的猬
有刺的猬 2020-12-03 05:41

I have a client with 5000 emails from an old list he has that he wants to promote his services to. He wants to know which emails on the list are still valid. I want to check

7条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-03 06:29

    bucabay's answer is the way forward. What a library like that essentially does is checking for existing DNS record for (mail) servers at specified domains (A, MX, or AAAA). After that, it do what's termed callback verification. That's where you connect to the mail server, tell it you want to send to a particular email address and see if they say OK.

    For callback verification, you should note greylisting servers say OK to everything so there is no 100% guarantee possible without actually sending the emails out. Here's some code I used when I did this manually. It's a patch onto the email address parser from here.

        #
        # Email callback verification
        # Based on http://uk2.php.net/manual/en/function.getmxrr.php
        #
    
        if (strlen($bits['domain-literal'])){
            $records = array($bits['domain-literal']);
        }elseif (!getmxrr($bits['domain'], $mx_records, $mx_weight)){
            $records = array($bits['domain']);
        }else{
            $mxs = array();
    
            for ($i = 0; $i < count($mx_records); $i++){
                $mxs[$mx_records[$i]] = $mx_weight[$i];
            }
    
            asort($mxs);
    
            $records = array_keys($mxs);
        }
    
        $user_okay = false;
        for ($j = 0; $j < count($records) && !$user_okay; $j++){
            $fp = @fsockopen($records[$j], 25, $errno, $errstr, 2);
            if($fp){
                $ms_resp = "";
    
                $ms_resp .= send_command($fp, "HELO ******.com");
                $ms_resp .= send_command($fp, "MAIL FROM:<>");
    
                $rcpt_text = send_command($fp, "RCPT TO:<" . $email . ">");
                $ms_resp .= $rcpt_text;
    
                $ms_code = intval(substr($rcpt_text, 0, 3));
                if ($ms_code == 250 || $ms_code == 451){ // Accept all user account on greylisting server
                    $user_okay = true;
                }
    
                $ms_resp .= send_command($fp, "QUIT");
    
                fclose($fp);
            }
        }
    
    return $user_okay ? 1 : 0;
    

提交回复
热议问题