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

97

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

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

Показать ещё 2 комментария
Теги:
email
smtp
email-validation
telnet

13 ответов

74
Лучший ответ

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

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

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

  • Вы можете указать RCPT и посмотреть, отклонено ли письмо.

    ПОЧТА ОТ: < gt;

    RCPT TO: < user @domain >

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

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

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

  • 8
    Некоторые серверы даже принимают сообщение, но затем отправляют сообщение об ошибке обратно отправителю конверта, особенно если это большая организация со многими внутренними отделами со своими почтовыми серверами. Пограничный сервер может даже не знать все учетные записи внутри.
  • 2
    Тогда почему спаммеры не используют этот метод для проверки адресов электронной почты? Я имею в виду тот факт, что эти методы поддерживаются очень немногими серверами. Или они?
Показать ещё 5 комментариев
41

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

Вы можете подключиться к почтовому серверу через 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: <[email protected]>
250 Ok

rcpt to: <[email protected]>
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 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: <[email protected]>\r\n");
fwrite($smtp_server, "rcpt to: <[email protected]>\r\n");
  • 0
    снимаю шляпу! Одна проблема, которую я обнаружил, заключается в том, всегда ли порт 25 работает с записью mx с низким приоритетом ??
  • 0
    @DhruvenkumarShah, прости, я не знаю. Если вы узнали, пожалуйста, прокомментируйте еще раз.
Показать ещё 3 комментария
8

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

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

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

6

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

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

Это риск безопасности.....

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

  • 0
    я тоже думал об этом :)
4

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

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

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

  • 0
    (личный опыт: мне приходилось спорить с моим провайдером электронной почты, что да , я знаю, что делаю, и да , мне нужно отключить серые списки - потому что эти проверки из сторонней службы терпели неудачу )
  • 0
    @Sinto: Синто: Здравствуйте, это горячая линия $ your_service_provider, чем я могу вам помочь? Ой, подождите: нет, я не.
4

Некоторые проблемы:

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

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

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

2

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

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

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

2

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

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

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

  • 2
    +1 Вы никогда не можете быть уверены, что это правильно, не отправив электронное письмо и фактически не получив ответа от человека, например, нажав на ссылку.
  • 0
    Вы можете сохранить ссылку (для изображения и т. д.) в теле письма и рассчитывать каждую загрузку для этой ссылки. не нужно ждать кликов
1
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
    }
}
  • 1
    порт 80 не имеет смысла
  • 5
    Я думаю, что это просто проверка доменного имени, а не проверка самой электронной почты.
Показать ещё 1 комментарий
1

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

1

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

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

-5
<?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";

?>
  • 0
    Пользователь запрашивает решение .Net, а не php.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню