>  기사  >  php教程  >  PHP는 이메일 주소가 존재하는지 정확하게 확인합니다.

PHP는 이메일 주소가 존재하는지 정확하게 확인합니다.

大家讲道理
大家讲道理원래의
2016-11-08 14:02:241384검색

배경

PHP에서 이메일 주소를 확인하는 방법에는 여러 가지가 있습니다. 가장 일반적인 방법은 정규식을 직접 작성하는 것입니다. 그러나 정규식에는 자체적인 확인 방법이 있습니다.

filter_var

filter_var는 PHP에 내장된 변수 필터링 방법으로 다양한 실용적인 필터를 제공하며 정수, 부동 소수점 숫자, 이메일 주소, URL, MAC 주소 등을 확인하는 데 사용할 수 있습니다.

특정 필터 참조:filters.validate

filter_var가 false를 반환하면 변수가 필터를 통과할 수 없다는 의미이므로 불법입니다.




$email = "lastchiliarch@163.com";
 
var_dump(filter_var($email,  FILTER_VALIDATE_EMAIL));
 
 
$email = "asb";
var_dump(filter_var($email,  FILTER_VALIDATE_EMAIL));
 
$email = "1@a.com";
var_dump(filter_var($email,  FILTER_VALIDATE_EMAIL));

출력:

string(21) "lastchiliarch @163.com"

bool(false)

string(7) "1@a.com"

asb와 같은 불법 메일함의 경우 형식이 false를 반환했지만 1@a.com의 경우 통과했지만 여전히 약간의 결함이 있었습니다.

그러나 일반 규칙을 통과하면 1@a.com이 합법적인 이메일 주소로 간주됩니다. 그렇다면 이를 더 정확하게 확인할 수 있는 방법이 없을까요?

checkdnsrr

checkdnsrr은 실제로 지정된 호스트의 DNS 레코드를 쿼리하는 데 사용되며 사서함이 존재하는지 확인할 수 있습니다.

1@a.com의 경우 MX 레코드가 절대 존재하지 않습니다.

   
$email = "lastchiliarch@163.com";
    var_dump(checkdnsrr(array_pop(explode("@",$email)),"MX"));
    $email = "1@a.com";
    var_dump(checkdnsrr(array_pop(explode("@",$email)),"MX"));

출력:

bool(true)

bool(false)

보시다시피 완벽합니다. 유일한 단점은 결국 네트워크 요청입니다. 따라서 이 방법을 사용하여 동시에 많은 수의 사서함을 확인하는 것은 적합하지 않습니다.

filter_var+checkdnsrr

확인을 위해 filter_var와 checkdnsrr을 결합할 수 있습니다. 대부분의 불법 메일함은 filter_var을 사용하면 확실히 실패하고 나머지는 다시 사용할 수 있습니다.

추가 판단을 위해 dnsrr을 확인하세요.

$email_arr = array("lastchiliarch@163.com", "1@a.com");
    foreach($email_arr as $email) {
        if (filter_var($email) === false) {
            echo "invalid email: $email \n";
            continue;
        }
 
        if(checkdnsrr(array_pop(explode("@",$email)),"MX") === false) {
            echo "invalid email: $email \n";
            continue;
        }
    }

출력: 잘못된 이메일: 1@a.com

그러나 MX 레코드만 확인하기 때문에 163.com이 존재한다는 것만 확인할 수 있지만 사용자 lastchiliarch가 존재한다는 것을 증명할 수는 없다는 점에 유의해야 합니다.

더 정확하게 메일함의 존재를 확인하고 싶다면 SMTP 서버에 접속해서만 확인하면 됩니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.