Я наткнулся на этот PHP-код для проверки адреса электронной почты с помощью SMTP без отправки электронного письма .
Кто-нибудь пробовал что-нибудь подобное или у вас работает? Можете ли вы сказать, правильно ли введен электронный адрес клиента / пользователя?
Ответы:
Иногда можно использовать два метода, чтобы определить, существует ли получатель на самом деле:
Вы можете подключиться к серверу и дать
VRFY
команду. Очень немногие серверы поддерживают эту команду, но она предназначена именно для этого. Если сервер отвечает DSN 2.0.0, пользователь существует.Вы можете
RCPT
отправить письмо и посмотреть, отклонено ли письмо.Если пользователь не существует, вы получите 5.1.1 DSN. Однако то, что письмо не отклонено, не означает, что пользователь существует. Некоторые серверы автоматически отбрасывают подобные запросы, чтобы предотвратить перечисление своих пользователей. Другие серверы не могут проверить пользователя и должны принять сообщение в любом случае.
Существует также метод защиты от спама, называемый серым списком, который заставляет сервер изначально отклонять адрес, ожидая, что реальный SMTP-сервер попытается повторно доставить адрес через некоторое время. Это помешает попыткам проверить адрес.
Честно говоря, если вы пытаетесь проверить адрес, лучший подход - использовать простое регулярное выражение для блокировки заведомо недействительных адресов, а затем отправить фактическое электронное письмо со ссылкой обратно в вашу систему, которая подтвердит, что электронное письмо было получено. Это также гарантирует, что пользователь ввел свой фактический адрес электронной почты, а не небольшую опечатку, которая принадлежит кому-то другому.
источник
В других ответах здесь обсуждаются различные проблемы, связанные с попыткой сделать это. Я подумал, что покажу, как вы можете попробовать это, если хотите научиться, делая это самостоятельно.
Вы можете подключиться к почтовому серверу через telnet, чтобы узнать, существует ли адрес электронной почты. Вот пример проверки адреса электронной почты на
stackoverflow.com
:Строки с префиксом числовых кодов представляют собой ответы от SMTP-сервера. Я добавил несколько пустых строк, чтобы было удобнее читать.
Многие почтовые серверы не возвращают эту информацию в качестве средства предотвращения сбора адресов электронной почты спамерами, поэтому вы не можете полагаться на этот метод. Однако у вас может быть некоторый успех в очистке некоторых явно плохих адресов электронной почты путем обнаружения недопустимых почтовых серверов или отклонения адресов получателей, как указано выше.
Также обратите внимание, что почтовые серверы могут занести вас в черный список, если вы сделаете к ним слишком много запросов.
В PHP я верю , что вы можете использовать
fsockopen
,fwrite
иfread
выполнить указанные выше действия программно:источник
Общий ответ заключается в том, что вы не можете проверить, существует ли событие для адреса электронной почты, если вы отправите на него электронное письмо: он может просто попасть в черную дыру.
При этом описанный там метод весьма эффективен. Он используется в производственном коде в ZoneCheck, за исключением того, что он использует RSET вместо QUIT.
Там, где взаимодействие пользователя с его почтовым ящиком не является чрезмерно дорогостоящим, многие сайты фактически проверяют, что почта куда-то приходит, отправляя секретный номер, который должен быть отправлен обратно отправителю (либо путем перехода по секретному URL-адресу, либо путем отправки этого секретного номера по электронной почте). Так работает большинство списков рассылки.
источник
Не совсем ..... Некоторые серверы могут не проверять "rcpt to:"
http://www.freesoft.org/CIE/RFC/1123/92.htm
Это угроза безопасности ...
Если сервер это делает, вы можете написать бота для обнаружения каждого адреса на сервере ....
источник
Это не удастся (среди прочего), если целевой почтовый сервер использует серые списки.
Серый список : SMTP-сервер отклоняет доставку при первом подключении ранее неизвестного клиента, разрешает следующий раз (а); это предотвращает попадание некоторого процента спам-ботов, в то же время позволяя законное использование - поскольку ожидается, что законный отправитель почты повторит попытку , что и будут делать обычные агенты передачи почты.
Однако, если ваш код проверяет сервер только один раз , сервер с серыми списками отклонит доставку (поскольку ваш клиент подключается впервые); если вы не вернетесь через некоторое время, возможно, вы ошибочно отклоняете действительные адреса электронной почты.
источник
Некоторые вопросы:
Для некоторых SMTP-серверов (например, Gmail) вам нужно использовать SSL, чтобы что-то делать.Это верно только при использовании SMTP-сервера Gmail для отправки электронной почты.источник
Хотя этот вопрос немного устарел, этот совет по обслуживанию может помочь пользователям, ищущим аналогичное решение, проверять адреса электронной почты за пределами проверки синтаксиса перед отправкой.
Я использовал эту службу с открытым исходным кодом для более глубокой проверки электронных писем (проверка записей mx в домене адреса электронной почты и т. Д.) Для нескольких проектов с хорошими результатами. Он также проверяет типичные опечатки, что весьма полезно. Демо здесь .
источник
«Можете ли вы сказать, правильно ли введен электронный адрес клиента / пользователя?»
На самом деле это две разные вещи. Он может существовать, но может быть неправильным.
Иногда приходится принимать вводимые пользователем данные за чистую монету. В противном случае есть много способов победить систему.
источник
Все, что вы можете сделать, это выполнить поиск в DNS и убедиться, что домен, который находится в адресе электронной почты, имеет запись MX, кроме того, что нет надежного способа справиться с этим.
Некоторые серверы могут работать с методом rcpt-to, когда вы разговариваете с SMTP-сервером, но это полностью зависит от конфигурации сервера. Другая проблема может заключаться в том, что перегруженный сервер может возвращать код 550, говорящий о том, что пользователь неизвестен, но это временная ошибка, есть постоянная ошибка (451, я думаю?), Которую можно вернуть. Это полностью зависит от конфигурации сервера.
Я лично проверил бы запись MX DNS, а затем отправил бы подтверждение по электронной почте, если запись MX существует.
источник
источник
getmxrr
Предполагая, что это адрес пользователя , некоторые почтовые серверы позволяют команде SMTP VRFY фактически проверять адрес электронной почты по своим почтовым ящикам. Большая часть крупного сайта не предоставит вам много информации; ответ Gmail - «если вы попытаетесь отправить его по почте, мы постараемся доставить его» или что-то в этом роде.
источник
Я думаю, что вы не можете, существует очень много сценариев, когда даже отправка электронной почты может не удастся. Например. почтовый сервер на стороне пользователя временно не работает, почтовый ящик существует, но переполнен, поэтому сообщение не может быть доставлено и т. д.
Вероятно, поэтому так много сайтов подтверждают регистрацию после того, как пользователь подтвердил, что получил электронное письмо с подтверждением.
источник
Я могу подтвердить ответы Джозефа и Дрю, чтобы использовать
RCTP TO: <address_to_check>
. Я хотел бы добавить несколько небольших дополнений к этим ответам.Все поставщики
Некоторые почтовые провайдеры реализуют универсальную политику, что означает, что команда
*@mydomain.com
вернет положительный результатRCTP TO:
. Но это не обязательно означает, что почтовый ящик «существует», как в «принадлежит человеку». Здесь ничего особенного сделать нельзя, просто имейте в виду.Серый / черный список IP-адресов
Серый список: 1-е соединение с неизвестного IP заблокировано. Решение: повторите попытку как минимум 2 раза.
Черный список: если вы отправляете слишком много запросов с одного IP, этот IP блокируется. Решение: используйте ротацию IP-адресов; Ричер использует Tor.
HTTP-запросы в формах регистрации
Это очень зависит от поставщика, но иногда вы можете использовать хорошо продуманные HTTP-запросы и анализировать ответы на эти запросы, чтобы узнать, зарегистрировано ли уже имя пользователя у этого поставщика или нет.
Вот соответствующая функция из библиотеки с открытым исходным кодом, которую я написал для проверки
*@yahoo.com
адресов с помощью HTTP-запросов: check-if-email-exists . Я знаю, что мой код - Rust, и эта ветка помечена как PHP, но применимы те же идеи.Полный почтовый ящик
Это может быть крайний случай, но когда у пользователя полный почтовый ящик,
RCTP TO:
он вернет5.1.1 DSN
сообщение об ошибке, в котором говорится, что он заполнен. Это означает, что учетная запись действительно существует!раскрытие
Я использую Reacher , API проверки электронной почты в реальном времени. Мой код написан на Rust и полностью открыт. Проверьте это, если вам нужно более надежное решение:
Github: https://github.com/amaurymartiny/check-if-email-exists
С помощью комбинации различных техник, позволяющих преодолеть препятствия, мне удается проверить около 80% писем, которые проверяют мои клиенты.
источник
источник