[php] 이메일을 보내지 않고 이메일 주소가 존재하는지 확인하는 방법은 무엇입니까?

이메일을 보내지 않고 SMTP를 사용하여 이메일 주소를 확인하기 위해이 PHP 코드를 발견했습니다. .

누군가 비슷한 것을 시도했거나 당신에게 효과가 있습니까? 고객 / 사용자가 입력 한 이메일이 정확하고 존재하는지 알 수 있습니까?



답변

당신이 할 수있는 두 가지 방법이 있습니다 가끔 받는 사람이 실제로 존재하는지 확인하는 데 사용할는 :

  1. 서버에 연결하여 VRFY명령을 실행할 수 있습니다 . 이 명령을 지원하는 서버는 거의 없지만 정확히이를위한 것입니다. 서버가 2.0.0 DSN으로 응답하면 사용자가 존재하는 것입니다.

    VRFY user
  2. 을 발행 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 서버는 이전에 알려지지 않은 클라이언트가 처음 연결할 때 배달을 거부하고 다음 번에 허용합니다. 이렇게하면 스팸봇의 일부를 차단하는 동시에 합법적 인 사용을 허용 합니다. 합법적 인 메일 발신자가 재 시도 할 것으로 예상되므로 정상적인 메일 전송 에이전트가 수행합니다.

그러나 코드가 서버에서 한 번만 확인하는 경우 그레이 리스팅이있는 서버는 전달을 거부합니다 (클라이언트가 처음으로 연결됨). 잠시 후에 다시 확인하지 않으면 유효한 전자 메일 주소를 잘못 거부 할 수 있습니다.


답변

몇 가지 문제 :

  1. 일부 SMTP 서버는 귀하가 제공 한 주소가 존재하지 않는 경우 즉시 알려줄 것이지만 일부는 개인 정보 보호 수단으로 사용되지 않습니다. 그들은 당신이 그들에게 제공하는 모든 주소를 받아들이고 존재하지 않는 주소는 조용히 무시합니다.
  2. 기사에서 알 수 있듯이 일부 서버에서이 작업을 너무 자주 수행하면 블랙리스트에 올 것입니다.
  3. 일부 SMTP 서버 (예 : gmail)의 경우 SSL을 사용하여 작업을 수행해야합니다. 이는 Gmail의 SMTP 서버를 사용 하여 이메일 을 보낼 때만 해당됩니다 .

답변

이 질문은 약간 오래되었지만이 서비스 팁은 사용자가 보내기 전에 구문 유효성 검사를 넘어 이메일 주소를 확인하는 유사한 솔루션을 검색하는 데 도움이 될 수 있습니다.

저는이 오픈 소스 서비스 를 사용하여 좋은 결과를 얻은 몇 가지 프로젝트에 대해 이메일을보다 심도있게 검증 (이메일 주소 도메인에서 mx 레코드 확인 등)했습니다. 또한 일반적인 오타를 확인하는 마녀가 매우 유용합니다. 여기에서 데모 .