Как стать автором
Обновить

Комментарии 79

Спасибо. Натолкнули на идею. А вроде бы на поверхности лежала). Есть один минус — если сервер пользователя находится в дауне — ваш скрипт вызовет ошибку. И юзер откроет широко глаза…
Можно расширить данную функцию, проверив домен на наличие в спамлистах. Тогда вообще круто будет.
А спам-листы это идея, попробую реализовать в свободное время(:
Не сервер, а ДНС в дауне, тогда ошибка будет.
«домен на наличие в спамлистах»?

это ерунда, хотите, я вам спам от вашего же почтового адреса зашлю?
давай
диктуйте ваш почтовый адрес и ваш MX.
может вам ещё пароль сказать, чтобы наверняка? :)
это совсем не обязательно.

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

в MAIL FROM:<example@example.com> при инициировании SMTP-сессии можно подставить что угодно, это во-первых.

во-вторых, что угодно можно подставить и в заголовок From самого письма.
Данная тема заинтересовала, подскажите какой-нибудь
онлайн-сервис для быстрой проверки записей домена,
включая МХ записи
Этот сервис я знаю, он только записи МХ проверяет,
а более подробно, включая
проверку DNS записей A, NS, MX, CNAME, PTR, TXT…
man dig?
Сделайте кат, пожалуйста.
Давно ничего не писал, забыл совсем(:
у меня чисто теоретический вопрос — А что часто бывают домены без MX записей? (вопрос без под%ба, просто интересно)
Действительно было бы гораздо эффективней ИМХО проверять на наличие в спам листах. Но и тут бывают косяки. Взять хотябы спамхаус — там полроссии заблочено.
Существование домена без МХ записей — возможно, но встречается редко. Часто бывает, что указаны неправильные МХ.
по первому согласен. А вот что вы понимаете под «неправильным MX» для меня загадка
Я имел в виду умышленную или неумышленную ошибку в МХ записи, или указание МХ левого ресурса.
у меня в MX прописан домен моего сервера, который отличается от самого домена email, это не запрещено и нормально работает, не всегда почта хостится там же где и сайт.
Да. У меня тоже МХ на Гугл прописаны. В данном случае — если указаны МХ другого ресурса — неважно, знает он вас или нет, тогда функции будут показывать, что все ок. Сработает ошибка только когда МХ не найден.
Это на случай, если пользователь введет что-нить типа 'qwer@asfasfasf.ru', в большинстве случаев все же заставляет ввести существующий емыл(: Ну и избавление от назойливого экспшена доктрины, иногда бывает, что внести изменения в модель нет возможности.
Может я ошибаюсь, но в этом случае, как мне кажется, быстрее валидировать домен на существование чем MX
Домены без MX записей? Ещё как бывают!
При этом MTA лезет на запись @ IN A…
> А что часто бывают домены без MX записей?

Строго говоря, MX-запись не обязательна. Поэтому разработчики должны исходить из того, что её может и не быть.
Если у домена нет MX записи, то значит что у него нет почты. А если нет почты — то и указывать ее нечего.
Опа, ссылку, пожалуйста на обоснование.
Если бы я сказал, что если у домена нет A записи, то у него нет сайта, то тоже бы потребовался пруфлинк?
Да, ибо без A-записи сайт не может работать в принципе. Однако без MX-записи почта работать может, что прямо утверждается в RFC 2821:

Usually, intermediate hosts are determined via the DNS MX record, not
by explicit "source" routing (see section 5 and appendices C and
F.2).
…
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.
Спасибо, не знал.
Но имхо, моветон — не использовать MX-записи. У меня несколько почтовых серверов, и ни на одном из них нет веб-сервера.
A-запись — это вовсе не веб-сервер.

Вернее, наличие A-записи не означает наличие веб-сервера.
Да, вы правы. Я слишком обобщил)
а вы не ставили перед собой задачу помимо мх-ов проверять еще и существование учетки на сервере, чтобы исключить возможность фейковых адресов, например dfglkshdfsgdfgs@host.ru?
каким образом?
отсылать пустое мыло на адрес и смотреть код ответа
точнее имитировать отправку письма. а потом обрывать.
не сойдёт, например, Exchange-сервера с дефолтными настройками принимают почту для любого аккаунта, даже несуществующего.
Нашел.

Альтернативой checkdnsrr() может стать функция getmxrr(), предназначенная для возврата MX — записей для предоставленного домена. В случае, если ни одной записи не найдено, функция вернет false. Массив $mxhosts используется для сохранения всех найденных записей MX для предоставленного домена.

Ссылка на источник — netbird.ru/articles/view/email_verification
Там полностью описан процес верификации почты — от даваскрипта и до проверки МХ
это опять же проверка мх-ов, а не учетки :)
Мда. Поспешил я однако. Наверное — тогда соглашусь с вами. Можно определить по коду ответа при отправке письма по адресу. Хотя и не 100% он придет. Но для реальных систем — это уже излишество. Надо придумать универсальный метод. Из академического интереса.
if (@getmxrr($domen, $mxhostsarr, $weight)) // забираем мх
{
   if (is_array($mxhostsarr) && count($mxhostsarr))
   {
      foreach ($mxhostsarr as $mxhost) // долбимся в каждый мх
      {
         $smtp_conn = @fsockopen($mxhost, 25, $errno, $errstr, 60); // устанавливаем соединение
         if ($smtp_conn)
         {
           echo "conn to ".$mxhost."\n";
           flush();
           sleep(10);
           fputs($smtp_conn,"helo hostname.ru\r\n"); // представляемся
           sleep(2);
           fputs($smtp_conn,"mail from:<>\r\n"); 
           sleep(2);
           foreach($email_list as $k => $email)
           {
              if ($smtp_conn && $email['checked']==0)  // если еще есть соединение и адрес непроверен
              {
                 fputs($smtp_conn,"rcpt to:<".$k.">\r\n"); // имитируем письмо, получаем ответ
                 sleep(1);
                 while ($str = fgets($smtp_conn))
                 {
                    $result = $str;
                    echo $k."==".$str."\n";
                    flush();
                 }
                 $ans = substr($result,0,3); 
                 if ($ans=="250")
                 {
                   // адрес проверен, активный                             
                 }
                 elseif ($ans=="550")
                 {
                    // адрес проверен, ненеактивный
                 }
                 else
                 {
                    // не удалось проверить адрес
		 }
              }
           }
           fputs($smtp_conn,"quit\r\n"); // закрываем соединение
           unset($smtp_conn);
        }
     }
   }
}



как-то так выглядят мои попытки проверки :)
Круто)) И не лень вам было сейчас писать. Есть проблемма — 25 порт. Он не всегда есть портом по умолчанию.
Также настораживает
sleep(10);
sleep(2);
sleep(2);
Значит вам надо будет на валидацию одного адреса >14 секунд.
Надо новый почтовый протокол придумать).

Хотел также спросить. Только 250 — код успеха? Или есть еще?
писала полгода назад, сейчас просто нашла этот кусок.
да, долго, да 25 порт не везде по умолчанию, но в любом случае, часть мусора такой скрипт в состоянии разобрать.
насчет кодов ответа и сам smtp можете почтитать тут
При сочетании всех методов — исчезает вероятность ошибочного ввода адреса.
а вот и нет :)
как уже писали:
1. почтовый сервак может быть временно в ауте, а мх вы его не получите.
2. как ни билась, но на ВСЕ адреса с mail.ru мне приходил положительный ответ о существовании учетки. даже на фейковые.
3. при удалении учетки, ее данные хранятся на серваке еще 3 месяца. а по факту писать некому.

это первое, что приходит в голову. может еще какие проблемы есть. так что на 100% неправильность мыла проверить нельзя.
Только-что проверил. Да. Вы правы. Мейл.ру — нормальные ответы возвращает на любой адрес. Надо что-то понадежнее искать.
Может вариантом будет завести у себя черный список таких серверов и отправлять юзерам письмо активации почты? Другого выхода в данном направлении я не вижу.
ну так письмо при регистрации с подтверждением не только эту проблему решает :)
что значит 25 порт не всегда по умолчанию?

если сервер, записанный в MX, не принимает соединения на TCP 25, то это уже неверная MX-запись.
А что же вы скажете о случае, когда 25 порт блокируют в целях безопасности, открывая 465 порт (secure SMTP) или 587 (Submission)? Оба варианта также описаны с помощью RFC.
Извините, но если ты объявляешь себя MX'ом — то обязан принимать соединения по tcp/25.

см. rfc 4409

не принимаешь — то извини, то ты не MX, а просто MTA «для своих».
Извините, пожалуйста но в приведенном вами доке не совсем о том говорится. Там ни словом не упоминаются MxRR.

Посмотрите, что я накопал.

RFC 2821 Simple Mail Transfer Protocol

It is important to note that MX records can point to SMTP servers
which act as gateways into other environments, not just SMTP relays
and final delivery systems

Вот то о чем я говорил. А рассматривать МТА из внешней сети не стоит. С сетью работает MSA(587), который и есть каналом между МUA и MTA.

Ссылка на RFC: tools.ietf.org/html/rfc2821
Страница: 24

Может, я, конечно, в чем-то не прав. Не серчайте на меня=)
На серверах с целью защиты от спамером часто включают задержку SMTP Greeting. Она может быть до 30 секунд. Для нормальных почтовиков это не страшно, но для такого скрипта и спамеров — это вилы!
Если вы делаете такую проверку то я могу использовать ваш сервис для абуза чужих емайл серверов.
я вас не поняла. честно полезла гуглить слово *абуз*, но все равно не поняла :)
проверять спам-лист на «живые» емылы, видимо это имелось в виду
abuse = абуз — злоупотребление чужими ресурсами. абузо устойчивый хостинг — типичный для спамеров, которые не принимают абуз письма(жалобы).
Зачем столько слипов? Можно просто использовать блокированные сокеты с таймаутом и все.
увы, но подобный код не пройдёт дальше greylisting'а
Это будет атака типа Directory Harvesting. На большинстве почтовиков от нее защита.
НЛО прилетело и опубликовало эту надпись здесь
добавить проверку А записи ничего не стоит. Так будет хотя бы гарантия, что домен существует. А дальше по старой схеме — активация учетки через е-мыл
Т.е. теперь проверка будет выполнятся дважды (т.е. два запроса на удаленные сервера)? Не проще ли обрабатывать exception?
Думаю, стоит ознакомиться с вопросом что такое эксепшн и найти способ проще… Хотя может вселенские законы только для питона? :)
НЛО прилетело и опубликовало эту надпись здесь
перехватывать этот самый эксепшн.
НЛО прилетело и опубликовало эту надпись здесь
я так понял эксепшн кидает валидатор. поймать его можно например в методе isValid() формы.
этот способ валидации не соответствует стандартам.

согласно RFC 2821, если MX-записи нет, то MTA должен отправлять почту на A-запись.
НЛО прилетело и опубликовало эту надпись здесь
Вот и я не понимаю — зачем весь этот огород.
Просто не задавайте для поля правило валидации на email и все. Особенно учитывая что email уже прошел валидацию в контроле symfony!
Если надо получить 100% работающий почтовый ящик — зашлите на него письмо со ссылко для активации этого ящика в учетной записи пользователя (или активации самого пользователя).
это скорей всего для случая с формой заказа без регистрации
В любом случае важно получить работающий емейл. Единственный способ в этом убедиться — отправить на него письмо. Что, если пользователь ошибся в имени, корректно указав домен? MX-запись для такого емейл будет в полном порядке, но связь с пользователем будет потеряна…

А избегать эксепшин доктрины да еще после валидации в контроле симфони таким образом — по моему как-то слишком сложно… Эксепшина можно избежать много проще.
просто тут какой момент

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

тут избегания эксепшына это не задача а симптом

задача — получить валидное мыло

хотелось бы иметь такй метод проверки на вооружении конечно всем, но он неработает по самой своей сути.
Дело в том что спамеры собирают свою базу ящиков из двух источников. Первое — парсинг сайтов(пауки), второе — опрос днс серверов. Последнее уже известно много лет назад, в связи с чем многие средства антиспама блокируют такие запросы.
А что можно узнать у DNS-сервера кроме MX-записи?
SRV-записи, правда, в данном контексте они фактически не нужны.
Единственный адрес, который может быть полезен спамерам — это адрес администратора домена.
Да конечно это я протупил. Я имел ввиду другое. Почтовые сервера — на них можно подавать запросы на отправку письма а потом резко обрывать и делать вывод о наличии такого ящика в этом домене. Таким образом можно отсканировать довольно большой список адресов. Но эту лавочку прикрыли фильтры антиспама.
Одно непонятно
где тут Doctrine?
Пригодилось еще как!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации