Безопасная электронная почта PHP блокирует ложные электронные письма, но позволяет пройти регистрацию

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

Я новичок в PHP, и проблема, с которой я столкнулся, заключается в том, что когда форма отправляется с ложным адресом электронной почты в поле электронной почты, появляется сообщение об ошибке, в котором говорится, что адрес электронной почты недействителен, но все же позволяет пройти регистрацию, добавив его в базу данных.

вот код

function spamcheck($field) {
    // filter_var() sanitizes the e-mail
    // address using FILTER_SANITIZE_EMAIL
    $field = filter_var($field, FILTER_SANITIZE_EMAIL);

    // filter_var() validates the e-mail
    // address using FILTER_VALIDATE_EMAIL
    if(filter_var($field, FILTER_VALIDATE_EMAIL)) {
        return TRUE;
    }
    else {
        return FALSE;
    }
}

if(isset($_REQUEST['email'])) {
    // if "email" is filled out, proceed
    // check if the email address is invalid
    $mailcheck = spamcheck($_REQUEST['email']);
    if ($mailcheck==FALSE) {
        die("<font color='red'>Your email address is invalid, please try again.</font><br/><br/><form><INPUT TYPE='button' VALUE='Back' onClick='history.go(-1);return true;'></form>");
    }
    else {//send email
        $to = "$email";
        $from = "[email protected]";
        $message = "Just a message";
        $subject = "Subject";

        mail($to, $message, $subject, "From: $from", "-f$from");
    }
}

Любая помощь будет принята с благодарностью.


person Paul Meadows    schedule 28.09.2012    source источник
comment
Код для добавления его в БД не показан, однако он не будет отправлять почту - в этом случае убедитесь, что вызов для сохранения регистрации в БД находится в вашем разделе, куда вы отправляете почту.   -  person BugFinder    schedule 28.09.2012
comment
Привет, спасибо, электронное письмо проходит, и чуть ниже находится код, чтобы добавить его в базу данных, я переместил его (чуть ниже значений) и та же проблема.   -  person Paul Meadows    schedule 28.09.2012
comment
Он не может показывать вам, что ваш адрес электронной почты недействителен, и отправлять почту, которая не соответствует опубликованному коду. спам статус.   -  person BugFinder    schedule 28.09.2012


Ответы (2)


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

Так что либо делайте очистку вне функции проверки, либо, на мой взгляд, даже лучше, только проверяйте ввод без санации (лучше дать пользователю понять, что он ввел его неправильно, чем пытаться его исправить).

function checkEmail($input)
{
  return filter_var($input, FILTER_VALIDATE_EMAIL);
}

Редактировать:

На самом деле должна быть другая проблема, потому что при выполнении кода die(...Your email address is invalid...) обработка страницы останавливается. Нам нужно было бы увидеть часть кода, которая пишет в базу данных.

person martinstoeckli    schedule 28.09.2012
comment
$insert = mysql_query(ВСТАВИТЬ В пользователей (название, имя пользователя, пароль, электронная почта, имя, фамилия, возраст, национальность, город_город, язык_обучения, как_учиться, уровень_языка, понедельник, вторник, среда, четверг, пятница, суббота, воскресенье, телефон, ) ЗНАЧЕНИЯ ( '$title', '$username', '$password', '$email', '$firstname', '$secondname', '$age', '$nationality', '$town_city', '$language_to_study ', '$how_to_study', '$language_level', '$понедельник', '$вторник', '$среда', '$четверг', '$пятница', '$суббота', '$воскресенье', '$телефон ',)); функция спамчек($поле) - person Paul Meadows; 28.09.2012
comment
@Paul Meadows - Итак, вы вставляете нового пользователя перед проверкой адреса электронной почты? Запрос следует выполнять только после успешной проверки электронной почты. Запрос должен быть в том же месте, где вы вызываете функцию mail(). - person martinstoeckli; 28.09.2012
comment
Хорошо, спасибо за ваш ответ, я поместил все это выше, вставив его в базу данных, и, похоже, это сработало, спасибо за вашу помощь, я ломал голову над этим часами, ха. - person Paul Meadows; 28.09.2012
comment
@Paul Meadows - Добро пожаловать! Возможно, я неправильно понял ваш комментарий, но если вы сделаете запрос на вставку после if(isset($_REQUEST['email'])) {...}, кто-то может оставить адрес электронной почты пустым, код не проверит адрес электронной почты, но он все равно будет вставлен в базу данных. - person martinstoeckli; 28.09.2012

Во-первых, распечатайте Mailcheck, посмотрите, что он говорит.

die('Проверка почты: ' . $mailcheck);

Если это ничего, установите его равным ===

если($mailcheck === false){

}

person Case    schedule 28.09.2012
comment
Спасибо за ваш ответ, извините, я полный новичок, должен ли я поставить этот код перед if ($mailcheck==FALSE) { die( - person Paul Meadows; 28.09.2012