Как проверить, существует ли адрес электронной почты без отправки электронной почты?

Я сталкивался с этим PHP-код для проверки адреса электронной почты с использованием SMTP без отправки электронного письма.

Кто-нибудь пробовал что-нибудь подобное или у вас работает? Можете ли вы сказать, правильно ли введен клиент / пользователь электронной почты & существует?

107

Решение

Есть два метода, которые вы можете иногда используйте, чтобы определить, существует ли получатель на самом деле:

  1. Вы можете подключиться к серверу и выполнить команду VRFY. Очень немногие серверы поддерживают эту команду, но она предназначена именно для этого. Если сервер отвечает DSN 2.0.0, пользователь существует.

    VRFY пользователь

  2. Вы можете выдать RCPT и посмотреть, отклонено ли письмо.

    ПОЧТА ОТ:<>

    RCPT TO:<пользователь @ домен>

Если пользователь не существует, вы получите DSN 5.1.1. Однако то, что электронное письмо не отклонено, не означает, что пользователь существует. Некоторые серверы будут молча отбрасывать подобные запросы, чтобы предотвратить перечисление своих пользователей. Другие серверы не могут проверить пользователя, и должны принять сообщение независимо.

Существует также метод защиты от спама, называемый «серый список», который заставит сервер первоначально отклонить адрес, ожидая, что настоящий SMTP-сервер попытается выполнить повторную доставку через некоторое время. Это испортит попытки проверить адрес.

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

83

Другие решения

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

Вы можете подключиться к почтовому серверу через telnet, чтобы узнать, существует ли адрес электронной почты. Вот пример тестирования адреса электронной почты для stackoverflow.com:

C: \> nslookup -q = mx stackoverflow.com
Неофициальный ответ:
stackoverflow.com Предпочтение MX = 40, почтовый обменник = STACKOVERFLOW.COM.S9B2.PSMTP.com
stackoverflow.com Предпочтение MX = 10, почтовый обменник = STACKOVERFLOW.COM.S9A1.PSMTP.com
stackoverflow.com Предпочтение MX = 20, почтовый обменник = STACKOVERFLOW.COM.S9A2.PSMTP.com
stackoverflow.com Предпочтение MX = 30, почтовый обменник = STACKOVERFLOW.COM.S9B1.PSMTP.com

C: \> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4 готов. Раздел «Кодекс бизнеса и профессий CA», раздел 17538.45, запрещает использование этой системы для нежелательной рекламы по электронной почте.

привет привет
250 Постини говорит привет

почта от: <me@myhost.com>
250 хорошо

rcpt to: <fake@stackoverflow.com>
550-5.1.1 Учетная запись электронной почты, к которой вы пытались обратиться, не существует. Пожалуйста, попробуй
550-5.1.1 перепроверить адрес электронной почты получателя на предмет опечаток или
550-5.1.1 лишних пробелов. Узнайте больше на
550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71

Строки с префиксом с цифровым кодом являются ответами от SMTP-сервера. Я добавил несколько пустых строк, чтобы сделать его более читабельным.

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

Обратите внимание, что почтовые серверы могут занести вас в черный список, если вы сделаете слишком много запросов к ним.


В PHP я считаю, что вы можете использовать fsockopen, fwrite а также fread выполнить вышеуказанные шаги программно:

$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <me@myhost.com>\r\n");
fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>\r\n");
44

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

При этом описанный там метод достаточно эффективен. Используется в производственном коде в ZoneCheck за исключением того, что он использует RSET вместо QUIT.

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

8

Не совсем ….. Некоторые серверы могут не проверять «rcpt to:»

http://www.freesoft.org/CIE/RFC/1123/92.htm

Это риск для безопасности …..

Если сервер делает, вы можете написать бота для обнаружения каждого адреса на сервере ….

6

Это не удастся (среди прочих случаев), когда целевой почтовый сервер использует серый список.

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

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

5

Некоторые вопросы:

  1. Я уверен, что некоторые SMTP-серверы немедленно сообщат вам, если адрес, который вы им дадите, не существует, но некоторые не будут использоваться в качестве меры конфиденциальности. Они просто примут любые адреса, которые вы им дадите, и молча проигнорируют несуществующие.
  2. Как говорится в статье, если вы будете делать это слишком часто на некоторых серверах, они попадут в черный список.
  3. Для некоторых SMTP-серверов (например, gmail) вам нужно использовать SSL, чтобы что-либо делать. Это верно только при использовании SMTP-сервера Gmail для Отправить Эл. адрес.
4
function EmailValidation($email)
{
$email = htmlspecialchars(stripslashes(strip_tags($email))); //parse unnecessary characters to prevent exploits
if (eregi('[a-z||0-9]@[a-z||0-9].[a-z]', $email)) {
//checks to make sure the email address is in a valid format
$domain = explode( "@", $email ); //get the domain name
if (@fsockopen ($domain[1],80,$errno,$errstr,3)) {
//if the connection can be established, the email address is probably valid
echo "Domain Name is valid ";
return true;
} else {
echo "Con not a email domian";
return false; //if a connection cannot be established return false
}
return false; //if email address is an invalid format return false
}
}
3

«Можете ли вы сказать, правильно ли введен клиент / пользователь электронной почты? & существует?»

На самом деле это две разные вещи. Это может существовать но может быть не правильно.

Иногда вы должны принять пользовательские данные по номинальной стоимости. Есть много способов победить систему в противном случае.

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector