Использование записей MX для проверки адресов электронной почты

Сценарий:
У меня есть контактная форма в моем веб-приложении, она получает много спама.
Я правильно проверяю формат адресов электронной почты, т.е. ^.+@.+\..+$
Я использую службу фильтрации спама (defensio), но полученные спам-счета перекрываются с действительными сообщениями. На пороге 0,4 происходит спам, и некоторые вопросы клиента ошибочно попадают в журнал и отображается ошибка.

Все спам-сообщения используют поддельные адреса электронной почты, например zxmzxm@ywduasm.com

Выделенный сервер PHP5 Linux в США, mysql, только журналирование спама, отправка сообщений о нежелательной почте (не сохраняется).

Предложение: используйте checkdnsrr(preg_replace(/^.+?@/, '', $_POST['email']), 'MX') php checkdnsrr(preg_replace(/^.+?@/, '', $_POST['email']), 'MX') чтобы проверить, что домен электронной почты разрешает действительный адрес, записывать в файл, а затем перенаправлять с помощью ошибка для сообщений, которые не разрешаются, перейдите к службе фильтрации спама, как и прежде, для адресов, которые разрешают в соответствии с checkdnsrr() .

Я прочитал (и я скептически отношусь к этому самому), что вы никогда не должны оставлять этот тип проверки до удаленных поисков, но почему?

Помимо проблем с подключением, в любом случае у меня будут большие проблемы, чем контактная форма, проведет checkdnsrr, чтобы встретить ложные срабатывания / негативы?
Будут ли какие-то типы адресов, которые не разрешат? gov адреса? ip адресов электронной почты?
Нужно ли мне избегать имени хоста i pass to checkdnsrr ()?

Решение. Сочетание всех трех ответов (желательно, чтобы я мог принять более одного в качестве составного ответа).

Я использую:

 $email_domain = preg_replace('/^.+?@/', '', $email).'.'; if(!checkdnsrr($email_domain, 'MX') && !checkdnsrr($email_domain, 'A')){ //validation error } 

Все спам регистрируется и поворачивается. С целью обновления до очереди работы на более позднюю дату.

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

http://en.wikipedia.org/wiki/Fqdn и

 RFC2821 The lookup first attempts to locate an MX record associated with the name. If a CNAME record is found instead, the resulting name is processed as if it were the initial name. If no MX records are found, but an A RR is found, the A RR is treated as if it was associated with an implicit MX RR, with a preference of 0, pointing to that host. If one or more MX RRs are found for a given name, SMTP systems MUST NOT utilize any A RRs associated with that name unless they are located using the MX RRs; the "implicit MX" rule above applies only if there are no MX records present. If MX records are present, but none of them are usable, this situation MUST be reported as an error. 

Огромное спасибо всем (особенно ZoogieZork за рекордный отзыв)

    Я не вижу вреда в поиске MX с помощью checkdnsrr() и я также не вижу, как могут появляться ложные срабатывания. Вам не нужно избегать имени хоста, на самом деле вы можете использовать эту технику и немного продолжить ее, поговорив с MTA и проверив, существует ли пользователь на данном хосте (однако этот метод может и, возможно, положительных в некоторых хостах).

    DNS-запросы могут быть медленными в разы, в зависимости от сетевого трафика и перегруженности, так что это то, о чем нужно знать.

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

    Принятие этого подхода к регистрации / тестированию дает вам возможность проверить его и не беспокоиться о потере электронных писем клиентов.

    Я привык добавлять дополнительное поле в свои формы, которое скрыто с помощью CSS, если оно заполнено, я предполагаю, что он отправляется спам-ботом. Я также должен использовать имя, подобное «url» или «website_url», что-то похожее на законное имя поля для спам-бота. Добавьте ярлык для поля, в котором говорится что-то вроде «Не заполняйте это поле», поэтому, если кто-то из браузеров не отображает его правильно, они будут знать, что не заполняют спам-поле. Пока это работает очень хорошо для меня.

    MX Lookup – это только часть изображения, если вы хотите убедиться, что адрес электронной почты сам по себе действителен, тогда вам нужно попытаться отправить электронное письмо на эту учетную запись.

    Другим возможным сценарием является то, что в любом случае кто-то может просто использовать удаленные учетные записи электронной почты на скомпрометированной машине. Конечно, это, вероятно, немного реже, но это все равно.

    Существуют библиотеки проверки адресов электронной почты, которые делают это, просто выполните поиск проверки по электронной почте.

    Все это можно сделать асинхронно. У меня есть эта настройка на моем сайте, и в этом случае электронное письмо сохраняется в базе данных (для целей аудита), задание в очереди, а затем, когда задание приходит к исполнению, любая дополнительная проверка выполняется в этот момент времени. Он разгружает тяжелый подъем на другую нить.

    Для пользователя кажется, что письмо было отправлено уже, оно было (оно находится в базе данных) и может быть просмотрено внутренне, но фактическое электронное письмо не будет отправлено по почте, пока это задание не будет выполнено, что может быть немедленно или каким-либо установленным количество времени в зависимости от нагрузки на сервер.

    Вальтер

     function mxrecordValidate($email){ list($user, $domain) = explode('@', $email); $arr= dns_get_record($domain,DNS_MX); if($arr[0]['host']==$domain&&!empty($arr[0]['target'])){ return $arr[0]['target']; } } $email= 'user@radiffmail.com'; if(mxrecordValidate($email)) { echo('This MX records exists; I will accept this email as valid.'); } else { echo('No MX record exists; Invalid email.'); }