Мой первый пост здесь, хотя я много раз использовал этот сайт, чтобы найти исправления для кода.
Я использую скрипт для проверки электронной почты на моем старом хосте, который работает нормально, но новый хост (123-reg) он вообще не проверяет их правильно.
Этот скрипт фактически проверяет существование электронной почты, а не только ее формат.
см. следующие ссылки: t43.co.uk/emailcheck.php?email=asdasdasd@hotmail.com (отлично работает) smile-database.co.uk/emailcheck.php?email=asdasdasd@hotmail.com (всегда говорит, что действует, когда я знаю, что это не так)
мой сценарий ниже.
function checkEmail( $email, $chFail = false ) { $msgs = Array(); $msgs[] = 'Received email address: '.$email; if( !preg_match( "/^(([^<>()[\]\\\\.,;:\s@\"]+(\.[^<>()[\]\\\\.,;:\s@\"]+)*)|(\"([^\"\\\\\r]|(\\\\[\w\W]))*\"))@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([az\-0-9áàäçéèêñóòôöüæøå]+\.)+[az]{2,}))$/i", $email ) ) { $msgs[] = 'Email address was not recognised as a valid email pattern<br><br>'; return $chFail ? Array( false, $msgs ) : false; } $msgs[] = 'Email address was recognised as a valid email pattern'; //get the mx host name if( preg_match( "/@\[[\d.]*\]$/", $email ) ) { $mxHost[0] = preg_replace( "/[\w\W]*@\[([\d.]+)\]$/", "$1", $email ); $msgs[] = 'Email address contained IP address '.$mxHost[0].' - no need for MX lookup'; } else { //get all mx servers - if no MX records, assume domain is MX (SMTP RFC) $domain = preg_replace( "/^[\w\W]*@([^@]*)$/i", "$1", $email ); if( !getmxrr( $domain, $mxHost, $weightings ) ) { $mxHost[0] = $domain; $msgs[] = 'Failed to obtain MX records, defaulting to '.$domain.' as specified by SMTP protocol'; } else { array_multisort( $weightings, $mxHost ); $cnt = ''; $co = 0; foreach( $mxHost as $ch ) { $cnt .= ( $cnt ? ', ' : '' ) . $ch . ' (' . $weightings[$co] . ')'; $co++; } $msgs[] = 'Obtained the following MX records for '.$domain.': '.$cnt; } } //check each server until you are given permission to connect, then check only that one server foreach( $mxHost as $currentHost ) { $msgs[] = 'Checking MX server: '.$currentHost; if( $connection = @fsockopen( $currentHost, 25 ) ) { $msgs[] = 'Created socket ('.$connection.') to '.$currentHost; if( preg_match( "/^2\d\d/", $cn = fgets( $connection, 1024 ) ) ) { $msgs[] = $currentHost.' sent SMTP connection header - no futher MX servers will be checked: '.$cn; while( preg_match( "/^2\d\d-/", $cn ) ) { $cn = fgets( $connection, 1024 ); $msgs[] = $currentHost.' sent extra connection header: '.$cn; } if( !$_SERVER ) { global $HTTP_SERVER_VARS; $_SERVER = $HTTP_SERVER_VARS; } //attempt to send an email from the user to themselves (not <> as some misconfigured servers reject it) echo $_SERVER['HTTP_HOST'] . "<BR>"; $localHostIP = gethostbyname(preg_replace("/^.*@|:.*$/",'',$_SERVER['HTTP_HOST'])); echo $localHostIP . "<BR>"; $localHostName = gethostbyaddr($localHostIP); fputs( $connection, 'HELO '.($localHostName?$localHostName:('['.$localHostIP.']'))."\r\n" ); if( $success = preg_match( "/^2\d\d/", $hl = fgets( $connection, 1024 ) ) ) { $msgs[] = $currentHost.' sent HELO response: '.$hl; fputs( $connection, "MAIL FROM: <$email>\r\n" ); if( $success = preg_match( "/^2\d\d/", $from = fgets( $connection, 1024 ) ) ) { $msgs[] = $currentHost.' sent MAIL FROM response: '.$from; fputs( $connection, "RCPT TO: <$email>\r\n" ); if( $success = preg_match( "/^2\d\d/", $to = fgets( $connection, 1024 ) ) ) { $msgs[] = $currentHost.' sent RCPT TO response: '.$to; } else { $msgs[] = $currentHost.' rejected recipient: '.$to; } } else { $msgs[] = $currentHost.' rejected MAIL FROM: '.$from; } } else { $msgs[] = $currentHost.' rejected HELO: '.$hl; } fputs( $connection, "QUIT\r\n"); fgets( $connection, 1024 ); fclose( $connection ); //see if the transaction was permitted (ie does that email address exist) $msgs[] = $success ? ('Email address was accepted by '.$currentHost) : ('Email address was rejected by '.$currentHost); return $chFail ? Array( $success, $msgs ) : $success; } elseif ( preg_match( "/^550/", $cn ) ) { $msgs[] = 'Mail domain denies connections from this host - no futher MX servers will be checked: '.$cn; return $chFail ? Array( false, $msgs ) : false; } else { $msgs[] = $currentHost.' did not send SMTP connection header: '.$cn; } } else { $msgs[] = 'Failed to create socket to '.$currentHost; } } $msgs[] = 'Could not establish SMTP session with any MX servers'; return $chFail ? Array( false, $msgs ) : false; } echo "<br><br>Email Validation Check<br><br>"; $return_msgs = checkEmail( $_REQUEST['email'], true ); if ( $return_msgs[0] == 0 ) { echo "<img src='img/Fail.png'> May be invalid<br>".$_REQUEST['email']; } elseif ( $return_msgs[0] == 1 ) { echo "<img src='img/OK.png'> Valid<br>".$_REQUEST['email']; } else { echo "<img src='img/Caution.png'> Caution<br>".$_REQUEST['email']; }
Я прочитал одну замечательную тему о проверке подлинности электронной почты. Автор предлагает использовать это регулярное выражение: /.+@.+\..+/i
и дать отличное описание для многих «почему именно это регулярное выражение»,
'somestring' @ 'somestring'. 'somestring'