2013-10-09 6 views
33

Можно ли проверить, существует ли электронная почта, аналогичная этому сайту?Как проверить, действительно ли действительный или действительный адрес электронной почты с помощью PHP

http://verify-email.org/

<?php 
    if($_POST['email'] != ''){ 
     // The email to validate 
     $email = $_POST['email']; 

     // An optional sender 
     function domain_exists($email, $record = 'MX'){ 
      list($user, $domain) = explode('@', $email); 
      return checkdnsrr($domain, $record); 
     } 
     if(domain_exists($email)) { 
      echo('This MX records exists; I will accept this email as valid.'); 
     } 
     else { 
      echo('No MX record exists; Invalid email.'); 
     } 
    } 
?> 
<form method="POST"> 
    <input type="text" name="email"> 
    <input type="submit" value="submit"> 
</form> 

Это то, что я прямо сейчас. Он проверяет, существует ли домен, , но он не может проверить, существует ли электронное письмо в этом домене. Можно ли это сделать с помощью PHP?

+1

Да, * отправить их по электронной почте и посмотреть, если они ответа *. В противном случае нет, потому что спамеры. – Hamish

+3

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

+1

http://stackoverflow.com/a/566121/2812842 –

ответ

21

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

if(filter_var($email, FILTER_VALIDATE_EMAIL)) { 
    //Email is valid 
} 

Вы можете добавить еще одну проверку, если хотите. Разбираем домен и затем запустить checkdnsrr

if(checkdnsrr($domain)) { 
    // Domain at least has an MX record, necessary to receive email 
} 

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

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

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

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

  2. Спам-списки. Да, вы можете попасть в черный список, пытаясь это сделать (помните, я сказал, что спамеры тоже знают эти трюки). Они занесены в черный список по IP-адресу, и если ваш сервер постоянно выполняет проверки соединений, вы рискуете нанести ущерб Spamhaus или другому списку блоков. Если вы попадаете в черный список, что вам нужно, чтобы подтвердить адрес электронной почты?

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

+1

, это не проверяет, существует ли электронная почта. Это похоже на проверку правильности выражения –

+1

. Он не предлагает, чтобы проверить, существует ли почта, только то, что его формат является допустимым. –

+1

Как я уже сказал в своем ответе, нет надежной проверки, чтобы узнать, существует ли электронное письмо. Не каждый сервер скажет вам, что учетная запись недействительна, если вы попытаетесь отправить ей электронное письмо, и если вы начнете рассылать спам на сервере с помощью тестовых запросов нежелательной почты, это может привести вас в черный список (т. Е. Spamhaus и т. Д.) – Machavity

28

Вы должны проверить с помощью SMTP.

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

После подключения к серверу SMTP необходимо отправить следующие команды:

HELO somehostname.com 
MAIL FROM: <[email protected]> 
RCPT TO: <[email protected]> 

Если вы получаете «< [email protected]>: Релейный доступ запрещен», что означает, что это письмо в недействительны.

Существует простой класс PHP.Вы можете использовать его:

http://www.phpclasses.org/package/6650-PHP-Check-if-an-e-mail-is-valid-using-SMTP.html

+1

упомянутый класс работает как шарм! – Timo002

+1

Этот сценарий замечательный, однако, когда я тестировал его на серверах outlook, live и hotmail, код ответа 554 появляется в существующих письмах, а затем скрипт зависает до тех пор, пока он не истечет. – TMMDev

+4

Я попробовал класс, и все действительные сообщения электронной почты возвращаются с «действительными, но не существующими!» –

0

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

GitHub здесь https://github.com/DukeOfMarshall/PHP---JSON-Email-Verification/tree/master

<?php 

# What to do if the class is being called directly and not being included in a script  via PHP 
# This allows the class/script to be called via other methods like JavaScript 

if(basename(__FILE__) == basename($_SERVER["SCRIPT_FILENAME"])){ 
$return_array = array(); 

if($_GET['address_to_verify'] == '' || !isset($_GET['address_to_verify'])){ 
    $return_array['error']    = 1; 
    $return_array['message']   = 'No email address was submitted for verification'; 
    $return_array['domain_verified'] = 0; 
    $return_array['format_verified'] = 0; 
}else{ 
    $verify = new EmailVerify(); 

    if($verify->verify_formatting($_GET['address_to_verify'])){ 
     $return_array['format_verified'] = 1; 

     if($verify->verify_domain($_GET['address_to_verify'])){ 
      $return_array['error']    = 0; 
      $return_array['domain_verified'] = 1; 
      $return_array['message']   = 'Formatting and domain have been verified'; 
     }else{ 
      $return_array['error']    = 1; 
      $return_array['domain_verified'] = 0; 
      $return_array['message']   = 'Formatting was verified, but verification of the domain has failed'; 
     } 
    }else{ 
     $return_array['error']    = 1; 
     $return_array['domain_verified'] = 0; 
     $return_array['format_verified'] = 0; 
     $return_array['message']   = 'Email was not formatted correctly'; 
    } 
} 

echo json_encode($return_array); 

exit(); 
} 

class EmailVerify { 
public function __construct(){ 

} 

public function verify_domain($address_to_verify){ 
    // an optional sender 
    $record = 'MX'; 
    list($user, $domain) = explode('@', $address_to_verify); 
    return checkdnsrr($domain, $record); 
} 

public function verify_formatting($address_to_verify){ 
    if(strstr($address_to_verify, "@") == FALSE){ 
     return false; 
    }else{ 
     list($user, $domain) = explode('@', $address_to_verify); 

     if(strstr($domain, '.') == FALSE){ 
      return false; 
     }else{ 
      return true; 
     } 
    } 
    } 
} 
?> 
+0

Это не проверяет, существует ли почта, но проверяет, существует ли запись mx и вверх, на этой неделе выполните задание https://github.com/hbattat/verifyEmail –

1

я наткнулся EmailPie

https://github.com/bryanhelmig/emailpie, которая требует эту установку:

Убедитесь, что Redis установлена ​​и работает на стандартных портах!

git clone [email protected]:bryanhelmig/emailpie.git 
cd emailpie 
mkvirtualenv emailpie 
pip install -r requirements 
python rundev.py 
Visit http://localhost:5000/v1/[email protected] 
+0

Это сообщение не заполнено? – Sekai

+1

** Важное замечание ** 'Мы рады сообщить, что бесплатный API электронной почты электронной почты теперь интегрирован в API почтового ящика. Вы можете возобновить бесплатный доступ к API, зарегистрировавшись здесь. 'Https://github.com/apilayer/emailpie – crmpicco

0

Вы должны проверить, имеет ли электронная почта запись MX. Компонент фильтра Zend-Framwork имеет методы проверки электронной почты с записью MX.