이메일을 보내지 않고 SMTP를 사용하여 이메일 주소를 확인하기 위해이 PHP 코드를 발견했습니다. .
누군가 비슷한 것을 시도했거나 당신에게 효과가 있습니까? 고객 / 사용자가 입력 한 이메일이 정확하고 존재하는지 알 수 있습니까?
이메일을 보내지 않고 SMTP를 사용하여 이메일 주소를 확인하기 위해이 PHP 코드를 발견했습니다. .
누군가 비슷한 것을 시도했거나 당신에게 효과가 있습니까? 고객 / 사용자가 입력 한 이메일이 정확하고 존재하는지 알 수 있습니까?
답변:
당신이 할 수있는 두 가지 방법이 있습니다 가끔 받는 사람이 실제로 존재하는지 확인하는 데 사용할는 :
서버에 연결하여 VRFY
명령을 실행할 수 있습니다 . 이 명령을 지원하는 서버는 거의 없지만 정확히이를위한 것입니다. 서버가 2.0.0 DSN으로 응답하면 사용자가 존재하는 것입니다.
VRFY user
을 발행 RCPT
하고 메일이 거부되었는지 확인할 수 있습니다 .
MAIL FROM:<>
RCPT TO:<user@domain>
사용자가 존재하지 않으면 5.1.1 DSN을 받게됩니다. 그러나 이메일이 거부되지 않았다고해서 사용자가 존재한다는 의미는 아닙니다. 일부 서버는 사용자의 열거를 방지하기 위해 이와 같은 요청을 자동으로 삭제합니다. 다른 서버는 사용자를 확인할 수 없으며 관계없이 메시지를 수락해야합니다.
그레이 리스팅 (greylisting)이라고하는 안티 스팸 기술도 있습니다.이 기술은 서버가 처음에 주소를 거부하게하여 실제 SMTP 서버가 나중에 재전송을 시도 할 것으로 예상합니다. 이것은 주소를 확인하려는 시도를 엉망으로 만듭니다.
솔직히 주소의 유효성을 검사하려는 경우 가장 좋은 방법은 간단한 정규식을 사용하여 명백하게 잘못된 주소를 차단 한 다음 이메일이 수신되었는지 확인하는 링크가 포함 된 실제 이메일을 시스템에 다시 보내는 것입니다. 이것은 또한 사용자가 다른 사람에게 속한 사소한 오타가 아닌 실제 이메일을 입력했는지 확인합니다.
여기에있는 다른 답변은 이것을 시도하는 다양한 문제에 대해 논의합니다. 직접 배우고 싶을 때 어떻게해볼 수 있는지 보여 드리겠다고 생각했습니다.
텔넷을 통해 메일 서버에 연결하여 이메일 주소가 있는지 확인할 수 있습니다. 다음은에 대한 이메일 주소를 테스트하는 예입니다 stackoverflow.com
.
C : \> nslookup -q = mx stackoverflow.com 신뢰할 수없는 답변 : stackoverflow.com MX 기본 설정 = 40, 메일 교환기 = STACKOVERFLOW.COM.S9B2.PSMTP.com stackoverflow.com MX 기본 설정 = 10, 메일 교환기 = STACKOVERFLOW.COM.S9A1.PSMTP.com stackoverflow.com MX 기본 설정 = 20, 메일 교환기 = STACKOVERFLOW.COM.S9A2.PSMTP.com stackoverflow.com MX 기본 설정 = 30, 메일 교환기 = STACKOVERFLOW.COM.S9B1.PSMTP.com C : \> 텔넷 STACKOVERFLOW.COM.S9A1.PSMTP.com 25 220 Postini ESMTP 213 y6_35_0c4 준비. CA Business and Professions Code Section 17538.45는 원치 않는 전자 메일 광고에이 시스템을 사용하는 것을 금지합니다. 안녕 안녕 250 Postini가 '안녕하세요'라고 말합니다 메일 : <me@myhost.com> 250 확인 rcpt to : <fake@stackoverflow.com> 550-5.1.1 연락하려는 이메일 계정이 존재하지 않습니다. 시도하십시오 550-5.1.1 수신자의 이메일 주소에 오타가 있는지 다시 확인하거나 550-5.1.1 불필요한 공백. 자세한 내용은 550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71
숫자 코드 접두사가 붙은 줄은 SMTP 서버의 응답입니다. 더 쉽게 읽을 수 있도록 빈 줄을 추가했습니다.
많은 메일 서버는 스팸 발송자가 이메일 주소 수집을 방지하기위한 수단으로이 정보를 반환하지 않으므로이 기술에 의존 할 수 없습니다. 그러나 유효하지 않은 메일 서버를 감지하거나 위와 같이 수신인 주소를 거부하여 명백하게 잘못된 이메일 주소를 정리하는 데 성공할 수 있습니다.
너무 많은 요청을하면 메일 서버가 사용자를 블랙리스트에 올릴 수 있습니다.
PHP에서 나는 당신이 사용할 수있는 생각 fsockopen
, fwrite
그리고 fread
프로그래밍 위의 단계를 수행합니다 :
$smtp_server = fsockopen("STACKOVERFLOW.COM.S9A1.PSMTP.com", 25, $errno, $errstr, 30);
fwrite($smtp_server, "helo hi\r\n");
fwrite($smtp_server, "mail from: <me@myhost.com>\r\n");
fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>\r\n");
일반적인 대답은 이메일을 보내면 이메일 주소가 존재하는지 확인할 수 없다는 것입니다. 그냥 블랙홀에 들어갈 수 있습니다.
거기에 설명 된 방법은 매우 효과적이라고합니다. QUIT 대신 RSET을 사용 한다는 점을 제외하고 는 ZoneCheck의 프로덕션 코드에서 사용됩니다.
사용자가 사서함과 상호 작용하는 데 비용이 많이 들지 않는 경우 실제로 많은 사이트에서 이미 터로 다시 보내야하는 비밀 번호를 전송하여 메일이 어딘가에 도착하는지 테스트합니다 (비밀 URL로 이동하거나이 비밀 번호를 이메일로 다시 전송). 대부분의 메일 링리스트는 그렇게 작동합니다.
별로 ..... 일부 서버는 "rcpt to :"를 확인하지 않을 수 있습니다.
http://www.freesoft.org/CIE/RFC/1123/92.htm
그렇게하는 것은 보안 위험입니다 .....
서버가 작동한다면 서버의 모든 주소를 검색하는 봇을 작성할 수 있습니다 ....
대상 메일 서버가 그레이 리스팅을 사용하는 경우 (다른 경우 중에서) 실패합니다.
그레이 리스팅 : SMTP 서버는 이전에 알려지지 않은 클라이언트가 처음 연결할 때 배달을 거부하고 다음 번에 허용합니다. 이렇게하면 스팸봇의 일부를 차단하는 동시에 합법적 인 사용을 허용 합니다. 합법적 인 메일 발신자가 재 시도 할 것으로 예상되므로 정상적인 메일 전송 에이전트가 수행합니다.
그러나 코드가 서버에서 한 번만 확인하는 경우 그레이 리스팅이있는 서버는 전달을 거부합니다 (클라이언트가 처음으로 연결됨). 잠시 후에 다시 확인하지 않으면 유효한 전자 메일 주소를 잘못 거부 할 수 있습니다.
몇 가지 문제 :
이 질문은 약간 오래되었지만이 서비스 팁은 사용자가 보내기 전에 구문 유효성 검사를 넘어 이메일 주소를 확인하는 유사한 솔루션을 검색하는 데 도움이 될 수 있습니다.
저는이 오픈 소스 서비스 를 사용하여 좋은 결과를 얻은 몇 가지 프로젝트에 대해 이메일을보다 심도있게 검증 (이메일 주소 도메인에서 mx 레코드 확인 등)했습니다. 또한 일반적인 오타를 확인하는 마녀가 매우 유용합니다. 여기에서 데모 .
"고객 / 사용자가 입력 한 이메일이 정확하고 존재하는지 알 수 있습니까?"
사실 이것들은 별개의 두 가지입니다. 그것은 수있는 존재 하지만 정확하지 않을 수 있습니다.
때로는 사용자 입력을 액면 그대로 가져와야합니다. 그렇지 않으면 시스템을 무력화하는 여러 가지 방법이 있습니다.
당신이 할 수있는 일은 DNS를 검색하고 이메일 주소에있는 도메인에 MX 레코드가 있는지 확인하는 것입니다.이를 처리하는 신뢰할 수있는 방법이 없다는 것입니다.
일부 서버는 SMTP 서버와 통신하는 rcpt-to 방법으로 작동 할 수 있지만 전적으로 서버 구성에 따라 다릅니다. 또 다른 문제는 과부하 된 서버가 사용자를 알 수 없다는 550 코드를 반환 할 수 있지만 이는 일시적인 오류이며 영구적 인 오류 (내 생각에 451?)가 반환 될 수 있습니다. 이것은 전적으로 서버 구성에 따라 다릅니다 .
개인적으로 DNS MX 레코드를 확인한 다음 MX 레코드가 있으면 이메일 확인을 보냅니다.
function EmailValidation($email)
{
$email = htmlspecialchars(stripslashes(strip_tags($email))); //parse unnecessary characters to prevent exploits
if (eregi('[a-z||0-9]@[a-z||0-9].[a-z]', $email)) {
//checks to make sure the email address is in a valid format
$domain = explode( "@", $email ); //get the domain name
if (@fsockopen ($domain[1],80,$errno,$errstr,3)) {
//if the connection can be established, the email address is probably valid
echo "Domain Name is valid ";
return true;
} else {
echo "Con not a email domian";
return false; //if a connection cannot be established return false
}
return false; //if email address is an invalid format return false
}
}
사용에 대한 Joseph과 Drew의 답변을 확인할 수 있습니다 RCTP TO: <address_to_check>
. 그 답변 위에 약간의 추가 사항을 추가하고 싶습니다.
일부 메일 공급자는 포괄 정책을 구현 *@mydomain.com
하여 RCTP TO:
명령에 긍정적 인 결과를 반환합니다 . 그러나 이것이 "사람에게 속한다"에서처럼 사서함이 "존재한다"는 의미는 아닙니다. 여기서 할 수있는 일은 많지 않습니다.
그레이 리스팅 : 알 수없는 IP의 첫 번째 연결이 차단되었습니다. 해결 방법 : 2 회 이상 재 시도하십시오.
블랙리스트 : 동일한 IP에서 너무 많은 요청을 보내면이 IP가 차단됩니다. 솔루션 : IP 순환을 사용하십시오. Reacher 는 Tor를 사용합니다.
이것은 매우 공급자별로 다르지만 때로는 잘 만들어진 HTTP 요청을 사용하고 이러한 요청의 응답을 구문 분석하여 사용자 이름이 이미이 공급자에 등록되었는지 여부를 확인할 수 있습니다.
다음은 *@yahoo.com
HTTP 요청을 사용하여 주소 를 확인하기 위해 작성한 오픈 소스 라이브러리의 관련 함수입니다 . check-if-email-exists . 내 코드가 Rust이고이 스레드가 PHP 태그라는 것을 알고 있지만 동일한 아이디어가 적용됩니다.
이것은 극단적 인 경우 일 수 있지만 사용자가받은 편지함이 가득 차면 가득 찼다 RCTP TO:
는 5.1.1 DSN
오류 메시지를 반환합니다 . 이것은 계정이 실제로 존재한다는 것을 의미합니다!
실시간 이메일 확인 API 인 Reacher를 실행 합니다. 내 코드는 Rust로 작성되었으며 100 % 오픈 소스입니다. 보다 강력한 솔루션을 원한다면 확인하십시오.
Github : https://github.com/amaurymartiny/check-if-email-exists
다양한 기술을 결합하여 고객이 확인 하는 이메일의 약 80 %를 확인합니다.
<?php
$email = "someone@exa mple.com";
if(!filter_var($email, FILTER_VALIDATE_EMAIL))
echo "E-mail is not valid";
else
echo "E-mail is valid";
?>