Email 如何以编程方式检查电子邮件是否存在

Email 如何以编程方式检查电子邮件是否存在,email,Email,如何编写代码来检查电子邮件是否存在?比如驴子_sdh123@gmail.com,驴子_sdh123@yahoo.com,还是驴子_sdh123@lycos.com所有这些电子邮件都不存在于gmail、yahoo和lycos数据库中 请看屏幕截图。驴子_sdh123@gmail.com这很糟糕。这意味着它不存在。我如何在我的项目中实现相同的东西 JavaScript、jQuery shell脚本、C或C++都是受欢迎的。没有.net。可以通过telnet连接到远程smtp服务器: 唯一的问

如何编写代码来检查电子邮件是否存在?比如驴子_sdh123@gmail.com,驴子_sdh123@yahoo.com,还是驴子_sdh123@lycos.com所有这些电子邮件都不存在于gmail、yahoo和lycos数据库中


请看屏幕截图。驴子_sdh123@gmail.com这很糟糕。这意味着它不存在。我如何在我的项目中实现相同的东西


JavaScript、jQuery shell脚本、C或C++都是受欢迎的。没有.net。

可以通过telnet连接到远程smtp服务器:

唯一的问题是,许多邮件服务器不会接受smtp(如yahoo),而且由于有关某个地址对垃圾邮件发送者是否有价值的信息,因此,让人们很容易发现存在哪些电子邮件地址并不符合任何电子邮件主机的利益

您可以使用ping或其他网络扫描对域是否存在进行基本检查,并且您可以使用googleapi搜索电子邮件地址,以防该地址以明文形式出现在互联网上。但是你和所有的骗子都在做同样的事情,所以可能不值得一试

另一件需要注意的事情是,许多电子邮件提供商允许用户提供派生、临时或别名地址,这些地址将在有限的时间内工作或使用,但它们本身不是邮箱。在这种情况下,即使是工作的检查人员也会认为该地址不存在,即使用户会收到发送给它的电子邮件


由于过期的地址可能不会被公布(以防止人们收到以前用户的邮件),因此会有误报的来源(检查说是,但是错误的),也会有误报的来源(检查说不是,但是错误的),以及被当作垃圾邮件发送者对待的所有摩擦。

简言之:这是不可能的。最多您可以尝试检查相关域是否有MX记录,并尝试连接到其邮件服务器。即使这样也不能保证它处于工作状态

您绝对无法检查特定的电子邮件是否以某种标准化的方式存在,因为许多服务器都采用了许多伪装和别名的方法。服务器可以并且将在SMTP交换中报告不存在的地址,因为
VRFY
MAIL
/
RCPT
中存在多种原因。您能得到的唯一明确答案是,如果电子邮件被
邮件
/
RCPT
拒绝,则电子邮件无效,但被接受并不是它有效的确切证据,因为它可以在电子邮件处理过程中被拒绝。滥用
邮件
/
RCPT
而不实际发送任何内容也会导致您被阻止

如果您想验证用户提供的电子邮件,最好是在那里发送确认信


如果您真的需要确认的工作电子邮件,您还应该查看。

请参阅我从web上获得的代码

 class SmtpValidator {

    private $options = array(
            "port" => 25,
            "timeout" => 1,  // Connection timeout to remote mail server.
            "sender" => "info@webtrafficexchange.com",
            "short_response" => false,
    );

    /**
     *  Override the options for those specified.
     */
    function __construct($options = null) {
        if (!empty($options)) {
            if (is_array($options)) {
                foreach ($options as $key => $value) {
                    $this->options[$key] = $value;
                }
            }
        }
    }

    /**
     *  Validate the email address via SMTP.
     *  If 'shore_response' is true, the method will return true or false;
     *  Otherwise, the entire array of useful information will be provided.
     */
    public function validate($email, $options = null) {

        $result = array("valid" => false);
        $errors = array();

        // Email address (format) validation
        if (empty($email)) {
            $errors = array("Email address is required.\n");
        } else if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $errors = array("Invalid email address.\n");
        } else {
            list($username, $hostname) = split('@', $email);
            if (function_exists('getmxrr')) {
                if (getmxrr($hostname, $mxhosts, $mxweights)) {
                    $result['mx_records'] = array_combine($mxhosts, $mxweights);
                    asort($result['mx_records']);
                } else {
                    $errors = "No MX record found.";
                }
            }

            foreach ($mxhosts as $host) {
                $fp = @fsockopen($host, $this->options['port'], $errno, $errstr, 
                                       $this->options['timeout']);
                if ($fp) {
                    $data = fgets($fp);
                    $code = substr($data, 0, 3);
                    if($code == '220') {
                        $sender_domain = split('@', $this->options['sender']);
                        fwrite($fp, "HELO {$sender_domain}\r\n");
                        fread($fp, 4096);
                        fwrite($fp, "MAIL FROM: <{$this->options['sender']}>\r\n");
                        fgets($fp);
                        fwrite($fp, "RCPT TO:<{$email}>\r\n");
                        $data = fgets($fp);
                        $code = substr($data, 0, 3);
                        $result['response'] = array("code" => $code, "data" => $data);
                        fwrite($fp, "quit\r\n");
                        fclose($fp);
                        switch ($code) {
                            case "250":  // We're good, so exit out of foreach loop
                            case "421":  // Too many SMTP connections
                            case "450":
                            case "451":  // Graylisted
                            case "452":
                                $result['valid'] = true;
                                break 2;  // Assume 4xx return code is valid.
                            default:
                                $errors[] = "({$host}) RCPT TO: {$code}: {$data}\n";
                        }
                    } else {
                        $errors[] = "MTA Error: (Stream: {$data})\n";
                    }
                } else {
                    $errors[] = "{$errno}: $errstr\n";
                }
            }
        }
        if (!empty($errors)) {
            $result['errors'] = $errors;
        }
        return ($this->options['short_response']) ? $result['valid'] : $result;
    }
}
类SmtpValidator{
private$options=array(
“端口”=>25,
“timeout”=>1,//到远程邮件服务器的连接超时。
“发件人”=>“info@webtrafficexchange.com",
“短_响应”=>错误,
);
/**
*覆盖指定选项的选项。
*/
函数构造($options=null){
如果(!空($options)){
if(is_数组($options)){
foreach($key=>$value的选项){
$this->options[$key]=$value;
}
}
}
}
/**
*通过SMTP验证电子邮件地址。
*如果“shore_response”为true,则该方法将返回true或false;
*否则,将提供整个有用信息数组。
*/
公共函数验证($email,$options=null){
$result=数组(“有效”=>false);
$errors=array();
//电子邮件地址(格式)验证
如果(空($email)){
$errors=array(“需要电子邮件地址。\n”);
}如果(!filter_var($email,filter_VALIDATE_email)){
$errors=array(“无效的电子邮件地址。\n”);
}否则{
列表($username,$hostname)=拆分('@',$email);
if(函数_存在('getmxrr')){
if(getmxrr($hostname,$mxhosts,$mxweights)){
$result['mx_records']=array_combine($mxhosts,$mxweights);
asort($result['mx_records']);
}否则{
$errors=“未找到MX记录。”;
}
}
foreach($mxhosts作为$host){
$fp=@fsockopen($host,$this->options['port'],$errno,$errstr,
$this->options['timeout'];
如果($fp){
$data=fgets($fp);
$code=substr($data,0,3);
如果($code==“220”){
$sender_domain=split('@',$this->options['sender']);
fwrite($fp,“HELO{$sender\u domain}\r\n”);
fread(fp,4 096美元);
fwrite($fp,“邮件发件人:选项['sender']}>\r\n”);
fgets(fp);
fwrite($fp,“RCPT TO:\r\n”);
$data=fgets($fp);
$code=substr($data,0,3);
$result['response']=数组(“代码”=>$code,“数据”=>$data);
fwrite($fp,“退出\r\n”);
fclose($fp);
交换机($代码){
案例“250”://我们很好,所以退出foreach循环
案例“421”://SMTP连接太多
案例“450”:
案例“451”://已列出
判例“452”:
$result['valid']=true;
中断2;//假设4xx返回码有效。