메일을 보내지 않고 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=http://stackoverflow.com 비권위 답변: stackoverflow.com MX Preference = 40, 메일 교환기 = STACKOVERFLOW.COM.S9B2PSMTP.com stackoverflow.com MX 기본 설정 = 10, 메일 교환기 = STACKOVERFLOW.COM.S9A1.PSMTP.com stackoverflow.com MX 기본 설정 = 20, 메일 교환기 = STACKOVERFLOW.COM.S9A2PSMTP.com stackoverflow.com MX 기본 설정 = 30, 메일 교환기 = STACKOVERFLOW.COM.S9B1PSMTP.com C:> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25 220 Postini ESMTP 213 y6_35_0c4 준비 완료.CA Business and Professions Code Section 17538.45는 요청되지 않은 전자 메일 광고에 이 시스템을 사용하는 것을 금지합니다.helo hi 250 Postini에서 헬로백 메일: <me@myhost.com> 250 OK 수신인: <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 hirn"); fwrite($smtp_server, "mail from: <me@myhost.com>rn"); fwrite($smtp_server, "rcpt to: <fake@stackoverflow.com>rn");
일반적인 대답은 이메일을 보내면 이메일 주소가 존재하는지 여부를 확인할 수 없다는 것입니다. 그냥 블랙홀에 들어갈 수 있습니다.
거기에 기술된 방법을 말하는 것은 꽤 효과적이다.이것은 ZoneCheck의 프로덕션 코드에서 사용되며, 단, CUIT 대신 RSET를 사용합니다.
유저와 메일 박스의 상호 작용이 고비용이 되지 않는 경우는, 실제로는, 송신자에게 송신할 필요가 있는 비밀 번호를 송신하는 것으로(비밀 URL 에 액세스 하거나, 이 비밀 번호를 전자 메일로 송신하는 것으로), 메일이 어딘가에 도착하고 있는 것을 테스트합니다.대부분의 메일링 리스트는 그렇게 동작합니다.
대상 메일 서버가 greylisting을 사용하는 경우(특히 다른 경우) 실패합니다.
Greylisting: SMTP 서버는 이전에 알 수 없었던 클라이언트가 처음 접속할 때 배달을 거부하고 다음 번에는 허용합니다.이것에 의해, 정규의 메일 송신자가 재시도 할 것으로 예상되기 때문에, 스팸봇의 비율은 일정하게 억제됩니다.
단, 코드가 서버에서1회만 체크되면 greylisting된 서버는 (클라이언트가 처음 접속할 때) 전송을 거부합니다.조금 후에 다시 체크하지 않으면 유효한 전자 메일주소를 잘못 거부할 수 있습니다.
별로..일부 서버는 “rcpt to:”를 체크하지 않을 수 있습니다.
http://www.freesoft.org/CIE/RFC/1123/92.htm
그렇게 하는 것은 보안상의 위험입니다.
서버가 검출하는 경우는, 서버의 모든 주소를 검출하는 봇을 작성할 수 있습니다.