Функция проверки электронной почты PHP

Есть ли эквивалент mysql_real_escape_string () для инъекций электронной почты? У меня есть форма, в которой пользователь отправляет свою электронную почту. Я боюсь, что кто-то может вставить список писем, разделенных запятыми, и использовать мой сайт для рассылки спама.

Вы можете использовать filter_var для проверки адреса электронной почты:

 if (!filter_var($address, FILTER_VALIDATE_EMAIL)) { // invalid e-mail address } 

Просто подтвердите поле против общепринятого регулярного выражения для одного адреса электронной почты

 function validate_email($e){ return (bool)preg_match("`^[a-z0-9!#$%&'*+\/=?^_\`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_\`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$`i", trim($e)); } 

Для тех, у кого есть более старые версии

 /* # PHP Email Validation for versions LESS than PHP 5.2.0) */ $strEmail= mysql_real_escape_string($_POST['email_e']); if (!eregi("^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[az]{2,3})$", $strEmail)){ // valid email } else { // not a valid email } 

Если ваша основная проблема заключается в том, что, как говорится в этом вопросе, проверить, чтобы пользователи не пытались обмануть вас в рассылке для них, введя список адресов, разделенных запятыми, то не является очевидным ответом просто проверить, есть ли какие-либо запятые во вход пользователя?

Я обнаружил, что хорошая проверка электронной почты не так проста, поэтому просто решил проверить, есть ли «@» и «.». находится в строке.

 function email_valid($email){ /* EMAIL VALIDATION, CHECKS IF STRING CONTAINS "@" and "." */ if( strpos($email, "@") AND strpos($email, ".") ){ return TRUE; } else { return FALSE; } } 

PS, если вы не используете подготовленные инструкции PDO для записи в базу данных, УБЕДИТЕСЬ, чтобы отфильтровать символы, которые могут вызвать SQL-инъекцию

Было бы проще проверить общую длину строки, т. Е. Локальную часть max 64 + раздел домена @ + максимум 255 символов = 320 символов, но тогда короткие спам-сообщения будут по-прежнему возможны. В настоящее время я изучаю подтверждение электронной почты для своего проекта и нашел эту интересную проверку электронной почты по электронной почте, которая объясняет глубинные действительные адреса электронной почты и rfc2822. Там они предлагают гораздо более простой способ проверки, который предотвратил бы списки, разделенные запятыми, как эффективную форму спама.

 $isValid = true; $atIndex = strrpos($email, "@"); if (is_bool($atIndex) && !$atIndex) { $isValid = false; } else { $domain = substr($email, $atIndex+1); $local = substr($email, 0, $atIndex); // ... work with domain and local parts } 

Это просто разрушает адрес электронной почты, нажимая последний знак @ и объявляет все, что проходит перед ним, как локальную часть адреса, которая имеет лимит в 64 символа. Если нет знака @, то strrpos вернет боловое значение false. Я буду использовать это в своей функции проверки.