проверка электронной почты «Ошибка: строгие стандарты» или любой лучший способ проверки электронной почты?

У меня есть скрипт, который проверяет адрес электронной почты, и я думаю, что это единственное решение для проверки электронных писем при отправке формы? Я заканчиваю с этим сценарием

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

Есть ли способ удалить ОШИБКУ? и УЛУЧШИТЬ код? Существует ли какая-либо проверка электронной почты, которая действительно проверяет электронную почту?


person Darline    schedule 21.11.2013    source источник
comment
ты решил свою проблему   -  person Venkata Krishna    schedule 21.11.2013
comment
Какая у вас версия PHP?   -  person Krish R    schedule 21.11.2013
comment
тебе нужна помощь в этом еще   -  person Venkata Krishna    schedule 21.11.2013
comment
напишите мне кратко о своей проблеме на мою электронную почту @[email protected]   -  person Venkata Krishna    schedule 22.11.2013
comment
Почему вы делаете свою собственную проверку? Почему бы не использовать сторонний API проверки, такой как LeadSpend.com?   -  person JoshSamBob    schedule 25.11.2013


Ответы (3)


Причина в том, что функция end(explode("@", $email)); вызывает ошибку, end() нужна ссылка, для этого вы можете попробовать использовать приведенный ниже код,

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

mixed end ( array &$array )

end() продвигает внутренний указатель массива к последнему элементу и возвращает его значение.

Параметр:

массив: этот массив передается по ссылке, поскольку он изменяется функцией. Это означает, что вы должны передать ему реальную переменную, а не функцию, возвращающую массив, поскольку по ссылке можно передавать только фактические переменные.

Возвращаемые значения: возвращает значение последнего элемента или FALSE для пустого массива.

person Krish R    schedule 21.11.2013
comment
$EmailArray = взорвать(@, $email); $first = конец($EmailArray); Я обновил свой ответ, вы можете попробовать - person Krish R; 21.11.2013
comment
кажется, что вам нужно передать его другой переменной. да, это помогает моей проблеме :) - person Darline; 21.11.2013
comment
хочешь помощи? - person Krish R; 21.11.2013

вы могли бы сделать что-то вроде этого

<?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>
person Detention    schedule 21.11.2013

вы можете попробовать, как показано ниже в качестве примера

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

Но это не надежно. днс вообще не надежен. Это лучшее усилие. Это также может занять много времени, если указан недопустимый домен, поэтому вам нужно учитывать потенциальную DOS вашей системы, если кто-то забьет ваш скрипт большим количеством недействительных/автономных доменов.

На самом деле (малоизвестно), доменам даже не нужно иметь запись MX для доставки почты. Доставка почты должна вернуться к использованию записи A для указанного хоста. В наши дни это может не так часто происходить, но в теории...

чтобы вы могли подтвердить свою электронную почту с помощью preg match, например

 //$email = "abc123@lolhaha"; // Invalid email address 
    $email = "[email protected]"; // 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.";
    } 
person Siraj Khan    schedule 21.11.2013
comment
регулярное выражение не может проверить электронную почту, оно просто проверяет ввод. - person Darline; 21.11.2013