电子邮件验证'错误:严格标准'或任何验证电子邮件的最佳方式?

时间:2013-11-21 06:00:11

标签: php email-validation strict

我有一个脚本可以验证电子邮件地址&我认为这是在表单提交时验证电子邮件的唯一解决方案吗?我最终得到了这个脚本

<?php
if(isset($_POST['email']))

{
    $email = $_POST['email'];  

    if (strpos($email, '@')) 
    {
        $first = end(explode("@", $email));

        if(checkdnsrr($first, 'MX')) 
        {
            $validate = 'Valid email.';
        }
        else 
        {
            $validate = 'Invalid email.';   
        }
    }
    else
    {
        $validate = 'Invalid email.';
    }

    echo $validate;
}
?>  
<form method="POST">
<input type="text" name="email">
<input type="submit" value="submit">
</form>

它运行正常,但我有错误Strict standards: Only variables should be passed by reference

有没有办法删除 ERROR ?和改进代码?到目前为止是否有任何电子邮件验证真正验证电子邮件?

3 个答案:

答案 0 :(得分:1)

你可以做这样的事情

<?php
if(isset($_POST['email']))

{
    $email = $_POST['email'];  

    if (strpos($email, '@')) 
    {
        $first = explode("@", $email);

        $validate = checkdnsrr($first[1], 'MX') ? 'Valid email.' : 'Invalid email.';
    }
    else
    {
        $validate = 'Invalid email.';
    }

    echo $validate;
}
?>  
<form method="POST">
<input type="text" name="email">
<input type="submit" value="submit">
</form>

答案 1 :(得分:0)

您可以尝试以下作为示例

 <?php

    function domain_exists($email, $record = 'MX'){
        list($user, $domain) = explode('@', $email);
        return checkdnsrr($domain, $record);
    }
    if(isset($_POST['email'])){
        $email = $_POST['email'];
        if(domain_exists($email)) {
            echo('This MX records exists; I will accept this email as valid.');
        }
        else {
            echo('No MX record exists;  Invalid email.');
        }
    }
    ?>

但是,这不可靠。 dns一般不可靠。这是最好的努力。提供无效域时也可能需要很长时间,因此如果有人使用大量无效/脱机域来破坏您的脚本,则需要考虑系统的潜在DOS。

在(鲜为人知的)事实中,域甚至不需要具有MX记录来传递邮件。邮件传递应该回退到使用指定主机的A记录。这些日子可能并没有真正发生,但在理论上......

因此您可以使用preg匹配来验证您的电子邮件,例如

 //$email = "abc123@lolhaha"; // Invalid email address 
    $email = "somebody@somesite.com"; // Valid email address 

    $regex = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/'; 

    if (preg_match($regex, $email)) {
         echo $email . " is a valid email. We can accept it.";
    } else { 
         echo $email . " is an invalid email. Please try again.";
    } 

答案 2 :(得分:-1)

共鸣是,end(explode("@", $email));函数导致错误,end()需要引用,因为您可以尝试使用以下代码,

$EmailArray = explode("@", $email);
$first = end($EmailArray);

mixed end ( array &$array )

end()使数组的内部指针前进到最后一个元素,并返回其值。

<强>参数:

array :此数组通过引用传递,因为它被函数修改。这意味着你必须传递一个实变量,而不是一个返回数组的函数,因为只有实际的变量可以通过引用传递。

返回值:返回最后一个元素的值,或返回空数组的FALSE。