Подтвердить что ты не робот

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

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

Все сообщения спама используют поддельные адреса электронной почты, например. [email protected]

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

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

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

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

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

Я использую:

$email_domain = preg_replace('/^[email protected]/', '', $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 за резервный отзыв A)

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

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= '[email protected]';

if(mxrecordValidate($email)) {
        echo('This MX records exists; I will accept this email as valid.');
}
else {
        echo('No MX record exists;  Invalid email.');
}

Ответ 4

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

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

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

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

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

Вальтер

Ответ 5

//The Code *https://davidwalsh.name/php-email-validator*  
function domain_exists($email, $record = 'MX'){
    list($user, $domain) = split('@', $email);
    return checkdnsrr($domain, $record);
}

if(domain_exists('[email protected]')) {
    echo('This MX records exists; I will accept this email as valid.');
} else {
    echo('No MX record exists;  Invalid email.');
}