如何使用PHP检查电子邮件地址是真实还是有效

时间:2013-10-09 02:25:50

标签: php email email-verification bouncedemail

是否可以检查是否存在与此网站类似的电子邮件?

http://verify-email.org/

<?php
    if($_POST['email'] != ''){
        // The email to validate
        $email = $_POST['email'];

        // An optional sender
        function domain_exists($email, $record = 'MX'){
            list($user, $domain) = explode('@', $email);
            return checkdnsrr($domain, $record);
        }
        if(domain_exists($email)) {
            echo('This MX records exists; I will accept this email as valid.');
        }
        else {
            echo('No MX record exists;  Invalid email.');
        }
    }
?>
<form method="POST">
    <input type="text" name="email">
    <input type="submit" value="submit">
</form>

这就是我现在所拥有的。 它会检查域是否存在但是无法检查是否存在 用户的电子邮件存在于该域。是否可以使用PHP来做到这一点?

5 个答案:

答案 0 :(得分:39)

您应该查看SMTP。

这意味着您必须连接到该电子邮件的SMTP服务器。

连接到SMTP服务器后,您应该发送以下命令:

HELO somehostname.com
MAIL FROM: <no-reply@gmail.com>
RCPT TO: <emailtovalidate@domain.com>

如果您收到“&lt; emailtovalidate@domain.com>拒绝接力”,则表示此电子邮件无效。

有一个简单的PHP类。你可以使用它:

http://www.phpclasses.org/package/6650-PHP-Check-if-an-e-mail-is-valid-using-SMTP.html

答案 1 :(得分:33)

如果没有向该帐户发送电子邮件,您无法验证电子邮件是否确实存在。但你可以验证它至少格式化为一个

if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
    //Email is valid
}

如果需要,您可以添加其他支票。解析域名,然后运行checkdnsrr

if(checkdnsrr($domain)) {
     // Domain at least has an MX record, necessary to receive email
}

由于人们不断低估这一点,如果您受到约束并决定验证电子邮件,请参考以下注意事项:

  1. 垃圾邮件发送者也会做连接技巧,所以不要以为所有服务器都会以相同的方式响应。另一个答案链接到this library有这个警告

      

    某些邮件服务器会默默拒绝测试邮件,以防止垃圾邮件发送者检查其用户的电子邮件并过滤有效的电子邮件,因此此功能可能无法与所有邮件服务器一起正常运行。

    因此,如果地址无效,您可能无法获得无效的地址响应。最热门的答案没有提到这一点。

  2. 垃圾邮件列表。是的,你可以尝试这样做被列入黑名单(记得我说垃圾邮件发送者也知道这些技巧)。他们按IP地址列入黑名单,如果您的服务器不断进行验证连接,则可能会在Spamhaus或其他阻止列表中清盘。如果您被列入黑名单,那么验证电子邮件地址有什么用呢?

  3. 如果验证电子邮件地址非常重要,则接受的方法是强制用户回复电子邮件。向他们发送完整的电子邮件,其中包含他们必须单击以进行验证的链接。这不是垃圾邮件,你仍然可以验证它是否有效。

答案 2 :(得分:1)

我整个上午一直在寻找同样的答案,并且几乎发现可能无法验证您需要检查的每个电子邮件地址是否在您需要验证时确实存在。因此,作为一种解决方法,我创建了一个简单的PHP脚本来验证电子邮件地址的格式是否正确,并且还验证所使用的域名是否正确。

GitHub此处https://github.com/DukeOfMarshall/PHP---JSON-Email-Verification/tree/master

<?php

# What to do if the class is being called directly and not being included in a script     via PHP
# This allows the class/script to be called via other methods like JavaScript

if(basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])){
$return_array = array();

if($_GET['address_to_verify'] == '' || !isset($_GET['address_to_verify'])){
    $return_array['error']              = 1;
    $return_array['message']            = 'No email address was submitted for verification';
    $return_array['domain_verified']    = 0;
    $return_array['format_verified']    = 0;
}else{
    $verify = new EmailVerify();

    if($verify->verify_formatting($_GET['address_to_verify'])){
        $return_array['format_verified']    = 1;

        if($verify->verify_domain($_GET['address_to_verify'])){
            $return_array['error']              = 0;
            $return_array['domain_verified']    = 1;
            $return_array['message']            = 'Formatting and domain have been verified';
        }else{
            $return_array['error']              = 1;
            $return_array['domain_verified']    = 0;
            $return_array['message']            = 'Formatting was verified, but verification of the domain has failed';
        }
    }else{
        $return_array['error']              = 1;
        $return_array['domain_verified']    = 0;
        $return_array['format_verified']    = 0;
        $return_array['message']            = 'Email was not formatted correctly';
    }
}

echo json_encode($return_array);

exit();
}

class EmailVerify {
public function __construct(){

}

public function verify_domain($address_to_verify){
    // an optional sender  
    $record = 'MX';
    list($user, $domain) = explode('@', $address_to_verify);
    return checkdnsrr($domain, $record);
}

public function verify_formatting($address_to_verify){
    if(strstr($address_to_verify, "@") == FALSE){
        return false;
    }else{
        list($user, $domain) = explode('@', $address_to_verify);

        if(strstr($domain, '.') == FALSE){
            return false;
        }else{
            return true;
        }
    }
    }
}
?>

答案 3 :(得分:0)

我遇到过EmailPie

https://github.com/apilayer/emailpie,需要安装:

确保已在标准端口上安装并运行redis!

git clone git@github.com:bryanhelmig/emailpie.git
cd emailpie
mkvirtualenv emailpie
pip install -r requirements
python rundev.py
Visit http://localhost:5000/v1/check?email=test@gmail.com

答案 4 :(得分:0)

您应该检查电子邮件是否包含MX记录。 Zend-Framwork的过滤器组件具有根据MX记录验证电子邮件的方法。