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

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

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

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

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

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


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

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

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


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

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

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

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

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


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

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

Я лично проверил бы запись DNS MX, а затем отправил бы проверку электронной почты, если запись 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 в домене адреса электронной почты и т. д.) для нескольких проектов с хорошими результатами. Он также проверяет наличие общих опечаток witch довольно полезно. Демо здесь.


предполагая, что пользователя address, некоторые почтовые серверы позволяют команде 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";

?>