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


123

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

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



2
왜 이것이 Telnet 태그를 가지고 있는지 궁금합니다.
Piccolo

2
정확히 그렇게하는 PHP 라이브러리가 있습니다 : github.com/kickboxio/kickbox-php
Dan

Kickbox는 무료가 아닙니다. 이 API는 서비스에 연결하기위한 래퍼 일뿐입니다.
Ashit Vora

답변:


92

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

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

    VRFY user
  2. 을 발행 RCPT하고 메일이 거부되었는지 확인할 수 있습니다 .

    MAIL FROM:<>
    RCPT TO:<user@domain>

사용자가 존재하지 않으면 5.1.1 DSN을 받게됩니다. 그러나 이메일이 거부되지 않았다고해서 사용자가 존재한다는 의미는 아닙니다. 일부 서버는 사용자의 열거를 방지하기 위해 이와 같은 요청을 자동으로 삭제합니다. 다른 서버는 사용자를 확인할 수 없으며 관계없이 메시지를 수락해야합니다.

그레이 리스팅 (greylisting)이라고하는 안티 스팸 기술도 있습니다.이 기술은 서버가 처음에 주소를 거부하게하여 실제 SMTP 서버가 나중에 재전송을 시도 할 것으로 예상합니다. 이것은 주소를 확인하려는 시도를 엉망으로 만듭니다.

솔직히 주소의 유효성을 검사하려는 경우 가장 좋은 방법은 간단한 정규식을 사용하여 명백하게 잘못된 주소를 차단 한 다음 이메일이 수신되었는지 확인하는 링크가 포함 된 실제 이메일을 시스템에 다시 보내는 것입니다. 이것은 또한 사용자가 다른 사람에게 속한 사소한 오타가 아닌 실제 이메일을 입력했는지 확인합니다.


10
일부 서버는 메시지를 수락하지만 나중에 봉투 발신자에게 오류 메시지를 다시 보냅니다. 특히 자체 메일 서버가있는 내부 부서가 많은 대규모 조직인 경우 더욱 그렇습니다. 경계 서버는 내부의 모든 계정을 알지 못할 수도 있습니다.
David Mårtensson

3
그렇다면 스팸 발송자가이 방법을 사용하여 이메일 주소를 확인하지 않는 이유는 무엇입니까? 이 방법은 매우 적은 수의 서버에서 지원된다는 사실을 제쳐두고 말입니다. 아니면 그들은?
Shahriyar Imanov

7
@Shehi : 실제로 스패머 이 방법을 사용할 있습니다. 그러나 스팸 발송자가 이를 사용할 있기 때문에 거의 모든 메일 서버에서 VRFY를 비활성화하므로 실제로 VRFY는 쓸모가 없을 것입니다.
sleske 2012-07-24

2
RCPT TO : <user @ domain>을 사용하는 방법에 대한 코드 예제를 제공 할 수 있습니까? 감사합니다
Papa De Beau

4
VRFY에 Gmail은 "메일 보내기, 최선을 다하겠습니다"라고 응답합니다. ;-)
Armel Larcier

46

여기에있는 다른 답변은 이것을 시도하는 다양한 문제에 대해 논의합니다. 직접 배우고 싶을 때 어떻게해볼 수 있는지 보여 드리겠다고 생각했습니다.

텔넷을 통해 메일 서버에 연결하여 이메일 주소가 있는지 확인할 수 있습니다. 다음은에 대한 이메일 주소를 테스트하는 예입니다 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");

오프 모자! 내가 찾은 한 가지 문제는 포트 25가 항상 낮은 우선 순위 mx 레코드에서 작동합니까 ??
Dhruvenkumar Shah

@DhruvenkumarShah, 모르겠어요 죄송합니다. 발견하면 다시 의견을 말하십시오.
Drew Noakes 2012

안녕하세요, 저는 MX 레코드에 대한 모든 것을 찾기 위해 제 대학 계정을 만들려고했지만 25 ..에서는 작동하지 않았습니다. 그러나 온라인 verify-email.org 웹 사이트는 작동했습니다 .. 어떻게 작동하는지 .. 나 내가 그것을 찾으면
알려줄

1
@DhruvenkumarShah는 메일 교환 서버 이름을 거의 제공하지 않습니다. 메일 교환기에 대한 답변을 참조하십시오. 따라서 하나가 실패하면 목록의 다른 하나가 작동합니다.
Janaka R Rajapaksha

정말 ... 당신 sir..i 퍼티에 그것을 시도하고 매력처럼 작동 감사합니다 .. MEE에 대한 모든 도움 덕분에 ..
모하메드 Sufian

8

일반적인 대답은 이메일을 보내면 이메일 주소가 존재하는지 확인할 수 없다는 것입니다. 그냥 블랙홀에 들어갈 수 있습니다.

거기에 설명 된 방법은 매우 효과적이라고합니다. QUIT 대신 RSET을 사용 한다는 점을 제외하고 는 ZoneCheck의 프로덕션 코드에서 사용됩니다.

사용자가 사서함과 상호 작용하는 데 비용이 많이 들지 않는 경우 실제로 많은 사이트에서 이미 터로 다시 보내야하는 비밀 번호를 전송하여 메일이 어딘가에 도착하는지 테스트합니다 (비밀 URL로 이동하거나이 비밀 번호를 이메일로 다시 전송). 대부분의 메일 링리스트는 그렇게 작동합니다.



6

대상 메일 서버가 그레이 리스팅을 사용하는 경우 (다른 경우 중에서) 실패합니다.

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

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


(개인적 경험 : , 내가하는 일을 알고 있으며 , 그레이 리스팅을 해제해야 한다고 이메일 제공 업체와 논쟁 해야했습니다. 타사 서비스의 이러한 검사가 실패했기 때문입니다. )
Piskvor는

4

몇 가지 문제 :

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

세 번째 요점에 관해서는 릴레이로 사용하려는 경우에만 발생합니다. SSL이 필요한 메일 교환기에 대해 잘 모릅니다. 이렇게하면 많은 사용자로부터 이메일 수신이 중단됩니다.
kmkaplan

미안 해요, 제 실수입니다. Gmail의 SMTP 서버를 사용하여 이메일 을 보내 려면 SSL을 사용해야합니다.
Graeme Perrow

3

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

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


이 서비스가 오픈 소스라고 주장합니다. 소스에 대한 링크를 제공 할 수 있습니까?
amaurymartiny

@amaurymartiny 죄송합니다. 작성 당시 Mailgun 프로젝트를 올바르게 기억하면 오픈 소스 였지만 이번이 지나면 소스를 제공하는 저장소에 대한 링크를 찾을 수 없습니다.
Henkealg

2

"고객 / 사용자가 입력 한 이메일이 정확하고 존재하는지 알 수 있습니까?"

사실 이것들은 별개의 두 가지입니다. 그것은 수있는 존재 하지만 정확하지 않을 수 있습니다.

때로는 사용자 입력을 액면 그대로 가져와야합니다. 그렇지 않으면 시스템을 무력화하는 여러 가지 방법이 있습니다.


2
+1 이메일을 보내거나 실제로 링크를 클릭하는 것과 같은 사람의 응답을받지 않고서는 그것이 정확한지 확신 할 수 없습니다 .
Daniel Daranas

이메일 본문에 링크 (이미지 등)를 유지하고 해당 링크에 대한 각로드를 계산할 수 있습니다. 클릭을 기다릴 필요가 없습니다
Janaka R Rajapaksha

2

당신이 할 수있는 일은 DNS를 검색하고 이메일 주소에있는 도메인에 MX 레코드가 있는지 확인하는 것입니다.이를 처리하는 신뢰할 수있는 방법이 없다는 것입니다.

일부 서버는 SMTP 서버와 통신하는 rcpt-to 방법으로 작동 할 수 있지만 전적으로 서버 구성에 따라 다릅니다. 또 다른 문제는 과부하 된 서버가 사용자를 알 수 없다는 550 코드를 반환 할 수 있지만 이는 일시적인 오류이며 영구적 인 오류 (내 생각에 451?)가 반환 될 수 있습니다. 이것은 전적으로 서버 구성에 따라 다릅니다 .

개인적으로 DNS MX 레코드를 확인한 다음 MX 레코드가 있으면 이메일 확인을 보냅니다.


2
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
    }
}

1
포트 80은 의미가 없습니다
jrosell

5
이메일 자체를 확인하는 것이 아니라 도메인 이름이 존재하는지 확인하는 것이라고 생각합니다.
The Angry Saxon

이것은 더 유용 할 수 있습니다 :getmxrr
jchook

1

사용자의 주소 라고 가정하면 일부 메일 서버에서는 SMTP VRFY 명령이 실제로 메일 함과 비교하여 이메일 주소를 확인할 수 있습니다. 대부분의 주요 사이트는 많은 정보를 제공하지 않습니다. Gmail 응답은 "메일을 보내려고하면 전달하려고 노력할 것입니다"또는 이와 같은 영리한 응답입니다.


1

이메일을 보내는 것조차 실패 할 수있는 시나리오가 너무 많습니다. 예 : 사용자 측 메일 서버가 일시적으로 다운되고 메일 함이 있지만 가득 차서 메시지를 전달할 수 없습니다.

그래서 많은 사이트가 사용자가 확인 이메일을 수신 한 것을 확인한 후 등록을 확인하는 이유 일 것입니다.


0

사용에 대한 Joseph과 Drew의 답변을 확인할 수 있습니다 RCTP TO: <address_to_check>. 그 답변 위에 약간의 추가 사항을 추가하고 싶습니다.

포괄 제공 업체

일부 메일 공급자는 포괄 정책을 구현 *@mydomain.com하여 RCTP TO:명령에 긍정적 인 결과를 반환합니다 . 그러나 이것이 "사람에게 속한다"에서처럼 사서함이 "존재한다"는 의미는 아닙니다. 여기서 할 수있는 일은 많지 않습니다.

IP 그레이 리스팅 / 블랙 리스팅

그레이 리스팅 : 알 수없는 IP의 첫 번째 연결이 차단되었습니다. 해결 방법 : 2 회 이상 재 시도하십시오.

블랙리스트 : 동일한 IP에서 너무 많은 요청을 보내면이 IP가 차단됩니다. 솔루션 : IP 순환을 사용하십시오. Reacher 는 Tor를 사용합니다.

가입 양식에 대한 HTTP 요청

이것은 매우 공급자별로 다르지만 때로는 잘 만들어진 HTTP 요청을 사용하고 이러한 요청의 응답을 구문 분석하여 사용자 이름이 이미이 공급자에 등록되었는지 여부를 확인할 수 있습니다.

다음은 *@yahoo.comHTTP 요청을 사용하여 주소 를 확인하기 위해 작성한 오픈 소스 라이브러리의 관련 함수입니다 . 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 %를 확인합니다.


-8
<?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";

?>

사용자가 php가 아닌 .Net 솔루션을 요구하고 있습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.