如何检查电子邮件地址是否存在,而不发送电子邮件?

我遇到了这个PHP代码,使用SMTP检查电子邮件地址而不发送电子邮件。

有没有人试过类似的东西,或者它为你工作? 你可以告诉一个电子邮件客户/用户输入是否正确和存在?


有时可以使用两种方法来确定收件人是否确实存在:

  • 您可以连接到服务器,并发出VRFY命令。 很少有服务器支持这个命令,但它是专门用于此目的的。 如果服务器以2.0.0 DSN响应,则该用户存在。

    VRFY用户

  • 您可以发出RCPT,并查看邮件是否被拒绝。

    邮件来自:<>

    RCPT TO:<user @ domain>

  • 如果用户不存在,您将获得5.1.1 DSN。 但是,仅仅因为电子邮件没有被拒绝,并不意味着用户存在。 某些服务器会默默放弃这样的请求,以防止其用户的枚举。 其他服务器无法验证用户,并且无论如何都必须接受该消息。

    还有一种称为灰名单的反垃圾邮件技术,它会导致服务器最初拒绝地址,期待真正的SMTP服务器在一段时间后尝试重新投递。 这将弄乱尝试验证地址。

    老实说,如果你试图验证一个地址,最好的办法是使用一个简单的正则表达式来阻止显然无效的地址,然后发送一封带有链接的实际邮件回你的系统,验证收到的邮件。 这也确保了用户输入了他们真实的电子邮件,而不是属于别人的轻微错字。


    其他答案在这里讨论试图做到这一点的各种问题。 我想我会表明,如果你想亲自学习,你会怎样尝试。

    您可以通过telnet连接到邮件服务器,询问是否存在电子邮件地址。 以下是测试stackoverflow.com的电子邮件地址的示例:

    C:>nslookup -q=mx stackoverflow.com
    Non-authoritative answer:
    stackoverflow.com       MX preference = 40, mail exchanger = STACKOVERFLOW.COM.S9B2.PSMTP.com
    stackoverflow.com       MX preference = 10, mail exchanger = STACKOVERFLOW.COM.S9A1.PSMTP.com
    stackoverflow.com       MX preference = 20, mail exchanger = STACKOVERFLOW.COM.S9A2.PSMTP.com
    stackoverflow.com       MX preference = 30, mail exchanger = STACKOVERFLOW.COM.S9B1.PSMTP.com
    
    C:>telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
    220 Postini ESMTP 213 y6_35_0c4 ready.  CA Business and Professions Code Section 17538.45 forbids use of this system for unsolicited electronic mail advertisements.
    
    helo hi
    250 Postini says hello back
    
    mail from: <me@myhost.com>
    250 Ok
    
    rcpt to: <fake@stackoverflow.com>
    550-5.1.1 The email account that you tried to reach does not exist. Please try
    550-5.1.1 double-checking the recipient's email address for typos or
    550-5.1.1 unnecessary spaces. Learn more at
    550 5.1.1 http://mail.google.com/support/bin/answer.py?answer=6596 w41si3198459wfd.71
    

    以数字代码为前缀的行是来自SMTP服务器的响应。 我添加了一些空行以使其更具可读性。

    许多邮件服务器不会返回这些信息作为阻止垃圾邮件发送者收集邮件地址的手段,所以你不能依赖这种技术。 但是,通过检测无效的邮件服务器,或者如上所述拒绝收件人地址,可能会在清除某些明显不良的电子邮件地址方面取得一些成效

    还要注意,如果你的请求过多,邮件服务器可能会将你列入黑名单。


    在PHP中,我相信你可以使用fsockopenfwritefread以编程方式执行上述步骤:

    $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中的生产代码,不同之处在于它使用RSET代替QUIT。

    在用户与他的邮箱进行交互不是过度成本的情况下,许多站点通过发送必须发回给发射器的秘密号码(通过转到秘密URL或通过电子邮件发回该秘密号码)来实际测试邮件到达某处。 大多数邮件列表都是这样工作的

    链接地址: http://www.djcxy.com/p/92679.html

    上一篇: How to check if an email address exists without sending an email?

    下一篇: Is this considered "web scraping"? Is it "legal"?