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


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

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

13 100

13 ответов:

есть два способа иногда используется для определения того, существует ли получатель на самом деле:

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

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

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

    почта От кого:

    RCPT TO:

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

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

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

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

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

C:\>nslookup -q=mx stackoverflow.com
Non-authoritative answer:
stackoverflow.com       MX preference = 40, mail exchanger = STACKOVERFLOW.COM.S9B2.PSMTP.com
stackoverflow.com       MX preference = 10, mail exchanger = STACKOVERFLOW.COM.S9A1.PSMTP.com
stackoverflow.com       MX preference = 20, mail exchanger = STACKOVERFLOW.COM.S9A2.PSMTP.com
stackoverflow.com       MX preference = 30, mail exchanger = STACKOVERFLOW.COM.S9B1.PSMTP.com

C:\>telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4 ready.  CA Business and Professions Code Section 17538.45 forbids use of this system for unsolicited electronic mail advertisements.

helo hi
250 Postini says hello back

mail from: <me@myhost.com>
250 Ok

rcpt to: <fake@stackoverflow.com>
550-5.1.1 The email account that you tried to reach does not exist. Please try
550-5.1.1 double-checking the recipient's email address for typos or
550-5.1.1 unnecessary spaces. Learn more at
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");

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

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

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

Не совсем так.....Некоторые сервера не могут проверить "rcpt to:"

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

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

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

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

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

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

несколько вопросов:

  1. Я уверен, что некоторые SMTP-серверы сразу же сообщат вам, если адрес, который вы им даете, не существует, но некоторые из них не будут в качестве меры конфиденциальности. Они просто принимают все адреса, которые вы им даете, и молча игнорируют те, которые не существуют.
  2. как говорится в статье, если вы делаете это слишком часто с некоторыми серверами, они внесут вас в черный список.
  3. для некоторых SMTP-серверов (например, gmail) вам нужно использовать SSL, чтобы сделать что угодно.это верно только при использовании SMTP-сервера gmail для отправить Эл.почта.

" можете ли вы сказать, если почтовый клиент / пользователь входит правильно и существует?"

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

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

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

некоторые серверы могут работать с методом rcpt-to, где вы разговариваете с SMTP-сервером, но это полностью зависит от конфигурации сервера. Другой проблемой может быть перегруженный сервер может вернуть 550 код, говорящий, что пользователь неизвестен, но это временная ошибка, есть постоянная ошибка (451 я думаю?) это можно вернуть. Это зависит полностью о конфигурации сервера.

Я бы лично проверить DNS-записи MX, а затем отправить проверки электронной почты, если такая запись.

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
    }
}

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

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

предполагая, что пользователя адрес, некоторые почтовые серверы позволяют команде SMTP VRFY фактически проверять адрес электронной почты по своим почтовым ящикам. Большая часть основного сайта не даст вам много информации; ответ gmail: "если вы попытаетесь отправить его, мы постараемся доставить его" или что-то умное.

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

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

<?php

   $email = "someone@exa mple.com";

   if(!filter_var($email, FILTER_VALIDATE_EMAIL))
      echo "E-mail is not valid";
   else
      echo "E-mail is valid";

?>