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


email validation 'Error : Strict Standards' or any best way to validate email?

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

<?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

是否有任何方法可以删除错误?和改进代码?到目前为止,是否有电子邮件验证真正验证电子邮件?

您可以执行类似的操作

<?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>

您可以尝试下面的示例

 <?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.";
    } 

原因是,end(explode("@", $email));函数导致错误,end()需要一个参考,为此您可以尝试使用以下代码,

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

mixed end ( array &$array )

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

参数:

array:此数组是通过引用传递的,因为它是由函数修改的。这意味着您必须将实际变量而不是返回数组的函数传递给它,因为只有实际变量才能通过引用传递。

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