2009-02-19 4 views
96

Я столкнулся с этим PHP code to check email address using SMTP without sending an email.Как проверить, существует ли почтовый адрес без отправки электронной почты?

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

+0

Аналогичный вопрос: [Можно проверить, существует ли почтовый адрес с использованием .net?] (Http://stackoverflow.com/questions/3883518/can-i-check-if-an-email-address-exists-using -net) – sleske

+2

Просто интересно, почему у этого есть тег Telnet? – Piccolo

+2

Существует библиотека PHP, которая делает именно это: https://github.com/kickboxio/kickbox-php – Dan

ответ

75

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

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

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

  2. Вы можете оформить RCPT, и посмотреть, если почта отвергается.

    MAIL FROM: < >

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

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

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

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

+8

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

+2

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

+5

@Shehi: На самом деле спамеры * могут * использовать этот метод, это трудно сказать. Однако, поскольку спамеры * могут * использовать его, почти все почтовые серверы отключают VRFY, поэтому на практике VRFY, вероятно, бесполезен. – sleske

6

не очень ..... Некоторые серверы могут не проверять "RCPT TO:"

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

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

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

+0

Я тоже об этом думал :) –

7

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

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

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

4

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

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

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

+0

Извините, моя ошибка. Если вы хотите * отправить * электронную почту с помощью SMTP-сервера gmail, вы должны использовать SSL. –

2

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

На самом деле это две отдельные вещи. Возможно, есть, но может быть и не так.

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

+2

+1 Вы не можете быть уверены, что это правильно, не отправляя электронное письмо и фактически получая от него ответ от человека, например, щелчок по ссылке. –

+0

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

1

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

1

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

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

1

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

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

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

38

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

Вы можете подключиться к почтовому серверу через 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'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: <[email protected]>\r\n"); 
fwrite($smtp_server, "rcpt to: <[email protected]>\r\n"); 
+0

шляпы выключены! одна проблема, которую я нашел, делает порт 25 всегда работает с записью с низким приоритетом mx? –

+0

@DhruvenkumarShah, извините, я не знаю. Если вы узнаете, прокомментируйте это. –

+0

Привет, я просто пытался создать собственную учетную запись университета, чтобы узнать все о MX-записях, но это не сработало для 25 .. но онлайн-сайт check-email.org действительно работал .. как они это делают .. Я сообщу об этом, если узнаю об этом –

4

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

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

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

+0

(личный опыт: мне пришлось спорить взад и вперед с моим провайдером электронной почты, что * да * , Я знаю, что я делаю, и * да *, мне нужно отключить greylisting, потому что эти проверки со стороны сторонней службы не выполнялись) – Piskvor

+0

@Sinto: Привет, это горячая линия $ your_service_provider, как я могу помочь ты? О, подожди: Нет, я не. – Piskvor

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

порт 80 не имеет смысла – jrosell

+4

Я думаю, что это просто проверка имени домена, а не проверка самого письма. –

-6
<?php 

    $email = "[email protected] mple.com"; 

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

?> 
+0

Пользователь запрашивает решение .Net, а не php. – 2017-10-19 12:55:40

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^