Как проверить, существует ли почтовый ящик на удаленном сервере

Есть ли API для проверки наличия почтового ящика на удаленном сервере? my-addr.com прекрасно справляется с этой задачей и выводит на удивление высокоуровневую информацию о ящике.

  • [email protected] : "Учетная запись электронной почты, к которой вы пытались подключиться, превышает квоту. Пожалуйста, направьте"
  • [email protected] : "gsmtp/e-mail существует"
  • [email protected] : "Учетная запись электронной почты, к которой вы пытались подключиться, не существует".

Инструмент, на который я ссылался, вызывает процесс «обратный поиск по электронной почте», но поиск того же самого вызывает «поиск человека по адресу электронной почты» и другие подобные инструменты.

Как это работает? Есть ли способ сделать это непосредственно из PHP или С#?


person Robin Rodricks    schedule 15.04.2014    source источник


Ответы (2)


Я думаю, вы обнаружите, что много раз эти функции будут лгать вам, чтобы победить спамеров. Если бы существовал способ подтверждения подлинности электронного письма, кроме нажатия пользователем на ссылку подтверждения (или отказа от подписки....), то спамеры использовали бы его все время.

Лучший способ проверить адрес электронной почты — отправить пользователю электронное письмо, содержащее ссылку, и попросить его щелкнуть ссылку, чтобы убедиться, что он получил электронное письмо. При этом вашими единственными вариантами будут команды SMTP RCPT TO или VRFY.

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

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

Класс PHP, выполняющий проверку RCPT TO: http://code.google.com/p/php-smtp-email-validation/

person Karl-Henrik    schedule 15.04.2014

Я не вижу в Условиях использования my-addr.com ничего, что запрещало бы использовать его программно: поскольку если вы довольны результатами сайта, вы можете рассмотреть (т.е. взвесить с технической, юридической и этической точки зрения) использование самого my-addr.com в качестве «API».

В качестве отправной точки можно использовать Fiddler Запрос на код C# для я выполнил быструю проверку существования почтового ящика:

private void MakeRequests()
{
    HttpWebResponse response;

    if (Request_my_addr_com(out response))
    {
        response.Close();
    }
}

private bool Request_my_addr_com(out HttpWebResponse response)
{
    response = null;

    try
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://my-addr.com/email/?mail=baz%40gmail.com&x=0&y=0");

        request.KeepAlive = true;
        request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
        request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36";
        request.Referer = "http://my-addr.com/email/?mail=foo%40gmail.com&x=15&y=12";
        request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip,deflate,sdch");
        request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.8");
        request.Headers.Set(HttpRequestHeader.Cookie, @"PHPSESSID=ne655jvfdte82b94gn0oumegj6");

        response = (HttpWebResponse)request.GetResponse();
    }
    catch (WebException e)
    {
        if (e.Status == WebExceptionStatus.ProtocolError) response = (HttpWebResponse)e.Response;
        else return false;
    }
    catch (Exception)
    {
        if(response != null) response.Close();
        return false;
    }

    return true;
}
person J0e3gan    schedule 15.04.2014
comment
Хорошая попытка, но у нее ограничение 30 в день!! Придется найти правильный способ сделать это... или заплатить за массовую проверку... email-verify.my-addr.com/ - person Robin Rodricks; 17.04.2014