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

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

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

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

4 ответов


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


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

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

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

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


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

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

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

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

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

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

Уолтер