php - MX 레코드를 사용하여 이메일 주소 유효성 검사



email-validation mx-record (3)

DNS 조회는 네트워크 트래픽 및 정체에 따라 때때로 느릴 수 있으므로주의해야 할 사항입니다.

내가 당신의 신발에 있었다면, 나는 그것을 시험해보고 그것이 어떻게되는지 보았습니다. 1 주일 정도 동안 모든 전자 메일을 데이터베이스 또는 로그 파일에 기록하고 스팸 또는 합법적 인 전자 메일로 표시할지 여부를 나타내는 필드를 포함시킵니다. 일주일이 지나면 결과를보고 예상대로 수행되는지 확인하십시오.

이 로깅 / 테스트 방식을 사용하면 테스트 할 수있는 유연성을 제공하고 고객 전자 메일 손실에 대해 걱정하지 않아도됩니다.

CSS로 숨겨진 양식에 여분의 필드를 추가하는 습관이 들었습니다. 스팸 봇이 제출했다고 가정합니다. 나는 또한 스팸 봇의 합법적 인 필드 이름처럼 보이는 "url"또는 "website_url"과 같은 이름을 사용해야합니다. '이 입력란을 작성하지 않음'과 같은 라벨을 추가하여 누군가의 브라우저가 올바르게 렌더링하지 못하면 스팸 필드를 채우지 않는 것을 알게됩니다. 지금까지 그것은 나를 위해 아주 잘 작동하고 있습니다.

대본:
내 웹 앱에 문의 양식이있어 스팸이 많이 발생합니다.
전자 메일 주소의 형식을 느슨하게 확인합니다 ^[email protected]+\..+$
스팸 필터링 서비스 (defensio)를 사용하고 있지만 반환 된 스팸 점수가 유효한 메시지와 중첩되어 있습니다. 0.4의 임계 값에서 일부 스팸이 통과되고 일부 고객의 질문이 잘못 로그에 표시되고 오류가 표시됩니다.

모든 스팸 메일은 가짜 이메일 주소 (예 : [email protected])를 사용합니다.

전용 PHP5 리눅스 서버, mysql, 스팸 로깅, 비 스팸 메일을 이메일로 보내기 (저장하지 않음).

제안 : checkdnsrr(preg_replace(/^[email protected]/, '', $_POST['email']), 'MX') 주소가 유효한 주소로 확인되고, 파일에 로그 한 다음에 리디렉션되는지 확인하기 위해 PHP의 checkdnsrr(preg_replace(/^[email protected]/, '', $_POST['email']), 'MX') 을 사용하십시오 해결되지 않는 메시지에 대한 오류는 checkdnsrr() 에 따라 해결되는 주소에 대해 이전과 마찬가지로 스팸 필터 서비스로 진행합니다.

나는이 유형의 검증을 원격 조회까지 두지 말아야한다는 것을 읽었다. (그리고 나는 이것에 대해 회의적이다.) 왜 그런가?

연결 문제 외에도 어쨌든 연락 양식보다 더 큰 문제가있는 곳은 checkdnsrr이 거짓 긍정 / 부정적인 문제가 발생할 것입니까?
해결되지 않는 주소 유형이 있습니까? 정부 주소? IP 이메일 주소?
checkdnsrr ()에 전달한 호스트 이름을 이스케이프 처리해야합니까?

해결책 : 세 가지 대답 모두를 조합하여 (하나 이상의 답을 받아 들일 수 있기를 바랍니다).

나는 다음을 사용하고있다.

$email_domain = preg_replace('/^[email protected]/', '', $email).'.';
if(!checkdnsrr($email_domain, 'MX') && !checkdnsrr($email_domain, 'A')){
   //validation error
}

모든 스팸이 기록되고 순환됩니다. 나중에 작업 대기열로 업그레이드하는보기.

사용자가 메일 서버에 확인을 요청하는 것에 대해 몇 가지 의견이 제기되었습니다. 너무 많은 트래픽이 발생하고 내 서버가 어떤 방식 으로든 문제를 일으킬 수 있다는 느낌이 들었습니다. 이는 대부분의 이메일을 차단하는 것입니다. 잘못된 서버 주소로 인해 다시 반송되었습니다.

http://en.wikipedia.org/wiki/Fqdn

RFC2821
The lookup first attempts to locate an MX record associated with the name.
If a CNAME record is found instead, the resulting name is processed as if 
it were the initial name.
If no MX records are found, but an A RR is found, the A RR is treated as
if it was associated with an implicit MX RR, with a preference of 0,
pointing to that host.  If one or more MX RRs are found for a given
name, SMTP systems MUST NOT utilize any A RRs associated with that
name unless they are located using the MX RRs; the "implicit MX" rule
above applies only if there are no MX records present.  If MX records
are present, but none of them are usable, this situation MUST be
reported as an error.

모두에게 많은 감사를 전합니다 (특히 A 레코드 폴백 팁을위한 ZoogieZork)


MX 조회는 그림의 일부일뿐입니다. 이메일 주소 자체가 유효한지 확인하려면 해당 계정으로 이메일을 보내야합니다.

가능한 다른 시나리오는 누군가가 손상된 시스템의 하이재킹 된 전자 메일 계정을 단순히 사용하는 것일 수 있습니다. 물론, 아마 그럴 가능성은 적지 만 여전히 그렇습니다.

이메일 주소 유효성 검사 라이브러리가 있습니다. 간단히 이메일 유효성 검사를 검색하십시오.

이 모든 작업은 비동기식으로 수행 할 수 있습니다. 내 사이트에이 설정이있는 경우 전자 메일이 데이터베이스에 저장되고 (감사 목적으로) 대기열에있는 작업이 실행되면 작업이 실행될 때 해당 시점에 추가 유효성 검사가 수행됩니다. 무거운 짐을 다른 실로 옮깁니다.

사용자에게 전자 메일이 이미 전송 된 것처럼 보이고 (데이터베이스에 있음) 내부적으로 볼 수 있지만 실제 전자 메일은 해당 작업이 실행될 때까지 즉시 발송되지 않거나 일부 설정 될 수 있습니다 시간은 서버로드에 따라 다릅니다.

월터


function mxrecordValidate($email){
        list($user, $domain) = explode('@', $email);
        $arr= dns_get_record($domain,DNS_MX);
        if($arr[0]['host']==$domain&&!empty($arr[0]['target'])){
                return $arr[0]['target'];
        }
}
$email= '[email protected]';

if(mxrecordValidate($email)) {
        echo('This MX records exists; I will accept this email as valid.');
}
else {
        echo('No MX record exists;  Invalid email.');
}




mx-record