Как опpеделить валидность E-mail?

warlock

Новичок
Репутация
0 / 411
Код:
<? function valid_mail ($email) { 
if (eregi("^[_\.0-9a-z-]+@([0-9a-z][0-9a-z-\.]+)\.([a-z]{2,4}$)", $email, $check)) { 
if (getmxrr($check[1] . "." . $check[2], $mxhosts)) { 
return "Valid"; 
} else { 
return "No MX for " . $check[1] . "." . $check[2]; 
} 
} else { 
return "Badly formed address"; 
} 
} 
?>

Maxim Matyukhin

Другой способ, использующий сокеты.

Код:
<?
/*By: Jon S. Stevens [email][email protected][/email] 
  Copyright 1998-1999 Jon S. Stevens, Clear Ink 
  This code has all the normal disclaimers. 
  It is free for any use, just keep the credits intact.*/ 

function validateEmail ( $email ) 
  { 
  global $SERVER_NAME; 
  $return = array ( false, "" ); 
  list ( $user, $domain ) = split ( "@", $email, 2 ); 
  $tld = $domain; 
  if ( checkdnsrr ( $tld, "MX" ) ) 
  { 
  if ( getmxrr ( $tld, $mxhosts, $weight ) ) 
  { 
  for ( $i = 0; $i < count ( $mxhosts ); $i++ ) 
  { 
  $fp = fsockopen ( $mxhosts[$i], 25 ); 
  if ( $fp ) 
  { 
  $s = 0; 
  $c = 0; 
  $out = ""; 
  set_socket_blocking ( $fp, false ); 
  do 
  { 
  $out = fgets ( $fp, 2500 ); 
  if ( ereg ( "^220", $out ) ) 
  { 
  $s = 0; 
  $out = ""; 
  $c++; 
  } 
  else if ( ( $c > 0 ) && ( $out == "" ) ) 
  { break; } 
  else 
  { $s++; } 
  if ( $s == 9999 ) { break; } 
  
  } while ( $out == "" ); 
  set_socket_blocking ( $fp, true ); 
  fputs ( $fp, "HELO $SERVER_NAME\n" ); 
  $output = fgets ( $fp, 2000 ); 
  fputs ( $fp, "MAIL FROM: <info@" . $tld . ">\n" );   
  $output = fgets ( $fp, 2000 ); 
  fputs ( $fp, "RCPT TO: <$email>\n" ); 
  $output = fgets ( $fp, 2000 ); 
  if ( ereg ( "^250", $output ) ) 
  { 
  $return[0] = true; 
  } 
  else 
  { 
  $return[0] = false; 
  $return[1] = $output; 
  } 
  fputs ( $fp, "QUIT\n" ); 
  fclose( $fp ); 
if ( $return[0] == true ) 
  { break; } 
  } 
  } 
  } 
  } 
  return $return; 
  } 
?>
Источник:
 
мдя, как раз пример для рубрики "зачем просто когда можно сложно"

вообще-то для валидации достаточно всего одной строчки:

Код:
filter_var($mail, FILTER_VALIDATE_EMAIL)

при условии что пхп старше 5.2, т.е. практически любой современный сервер
 
Посмотрите на дату поста и подумайте какая версия рнр была актуальна в то время :rolleyes:
 
да никаких проблем - просто если инфа становится неактуальной, ее лучше обновить
иначе и через год-два-пять новички будут изобретать самопальные функции для самых простых вещей
 
Коллега, если люди до сих пор не могут перейти на mуsqli и давятся от старых проблем, та какие там filter_var, людям проще показать продвинутость и пострадать регэкспами...
 
Код:
define('return_email','noreply@domain'); 
 function win_getmxrr($hostname, &$mxhosts, &$mxweight=false) { 
 if (strtoupper(substr(PHP_OS, 0, 3)) != 'WIN') return; 
 if (!is_array ($mxhosts) ) $mxhosts = array(); 
 if (empty($hostname)) return; 
 $exec='nslookup -type=MX '.escapeshellarg($hostname); 
 @exec($exec, $output); 
 if (empty($output)) return; 
 $i=-1; 
 foreach ($output as $line) { 
 $i++; 
 if (preg_match("/^$hostname\tMX preference = ([0-9]+), mail exchanger = (.+)$/i", $line, $parts)) { 
 $mxweight[$i] = trim($parts[1]); 
 $mxhosts[$i] = trim($parts[2]); 
 } 
 if (preg_match('/responsible mail addr = (.+)$/i', $line, $parts)) { 
 $mxweight[$i] = $i; 
 $mxhosts[$i] = trim($parts[1]); 
 } 
 } 
 return ($i!=-1); 
 } 

 // Define 
 if (!function_exists('getmxrr')) { 
 function getmxrr($hostname, &$mxhosts, &$mxweight=false) { 
 return win_getmxrr($hostname, $mxhosts, $mxweight); 
 } 
 } 


 function verify_email($em,$connect=true) 
 { 
 $em=filter_var($em, FILTER_SANITIZE_EMAIL); 
 if(filter_var($em,FILTER_VALIDATE_EMAIL)) //email looks valid 
 { 
 if(!$connect) return true; 
 list(,$domain)=split('@',$em); 
 getmxrr($domain, $mxhosts, $weights); 
 if(!empty($mxhosts)) // there is at least one MX record 
 { 
 $lowest=array_keys($weights, min($weights)); 
 if(is_array($lowest))$lowest=$lowest[0]; 
 $domain=$mxhosts[$lowest]; // MX server with lowest priority number 
 } 
 // probe connection to the remote SMTP server 
 $code = 0; 
 $fp = @fsockopen($domain, 25, $errno, $errstr, 3); 
 if ($fp) { 
 send_command($fp, 'HELO '.$_SERVER["HTTP_HOST"]); 
 send_command($fp, 'MAIL FROM:<'.return_email.'>'); 
 $erg = send_command($fp, 'RCPT TO:<'.$em.'>'); 
 send_command($fp, 'QUIT'); 
 fclose($fp); 
 $code = intval(substr($erg, 0, 3)); 
 } 
 if ($code==250||$code==451) return true; //valid email address. 451 for greylisting - might be the correct one 
 } 
 return false; 
 } 

 function send_command($fp, $out){ 
 fwrite($fp, $out . "\r\n"); 
 return get_data($fp); 
 } 
 function get_data($fp){ 
 $s=""; 
 stream_set_timeout($fp, 2); 

 for($i=0;$i<2;$i++) 
 $s.=fgets($fp, 1024); 

 return $s; 
 }
verify_email('мыло',connect);
connect - true (по умолчанию) пытается подключиться к удаленному smtp и проверить мыло после проверки его валидности
- false не подключается, а только проверяет валидность
возвращает true или false

© Cheery
 
или всунуть громоздкий быдлокод с кучей циклов и условных операторов в тему, которая посвящена валидации e-mail
в некоторых случаях нужно взять у юзера валидный мейл, а не просто правильно введенный. это две большие разницы :pistol:
 

Похожие темы

Сверху