Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在不发送电子邮件的情况下检查电子邮件地址是否存在?_Php_Email_Smtp_Telnet_Email Validation - Fatal编程技术网

Php 如何在不发送电子邮件的情况下检查电子邮件地址是否存在?

Php 如何在不发送电子邮件的情况下检查电子邮件地址是否存在?,php,email,smtp,telnet,email-validation,Php,Email,Smtp,Telnet,Email Validation,我遇到过这个问题 有没有人尝试过类似的方法,或者对你有效?您能告诉客户/用户输入的电子邮件是否正确和存在吗?不太正确…..某些服务器可能不会检查“rcpt to:” 这样做会带来安全风险 如果服务器这样做,您可以编写一个bot来发现服务器上的每个地址。…一般的答案是,如果您向其发送电子邮件,您无法检查电子邮件地址是否存在:它可能会进入黑洞 尽管如此,这里描述的方法还是相当有效的。除了使用RSET而不是QUIT之外,它在中的生产代码中使用 在用户与邮箱的交互不太频繁的情况下,许多站点实际上通过发

我遇到过这个问题


有没有人尝试过类似的方法,或者对你有效?您能告诉客户/用户输入的电子邮件是否正确和存在吗?

不太正确…..某些服务器可能不会检查“rcpt to:”

这样做会带来安全风险


如果服务器这样做,您可以编写一个bot来发现服务器上的每个地址。…

一般的答案是,如果您向其发送电子邮件,您无法检查电子邮件地址是否存在:它可能会进入黑洞

尽管如此,这里描述的方法还是相当有效的。除了使用RSET而不是QUIT之外,它在中的生产代码中使用

在用户与邮箱的交互不太频繁的情况下,许多站点实际上通过发送一个必须发送回发送者的秘密号码(通过转到一个秘密URL或通过电子邮件发送回该秘密号码)来测试邮件是否到达某个地方。大多数邮件列表都是这样工作的。

有些问题:

  • 我相信,如果您提供的地址不存在,某些SMTP服务器会立即通知您,但作为隐私措施,有些服务器不会。他们只会接受你给他们的任何地址,然后默默地忽略那些不存在的地址
  • 正如文章所说,如果你在某些服务器上经常这样做,他们会将你列入黑名单
  • 对于某些SMTP服务器(如gmail),您需要使用SSL来执行任何操作。只有在使用gmail的SMTP服务器发送电子邮件时才是如此
  • “您能否判断客户/用户输入的电子邮件是否正确和存在?”

    事实上,这是两件不同的事情。它可能存在,但可能不正确


    有时,您必须按面值接受用户输入。否则,有许多方法可以破坏系统。

    假设是用户的地址,某些邮件服务器确实允许SMTP VRFY命令根据其邮箱实际验证电子邮件地址。大多数主要网站不会给你太多的信息;gmail的回复是“如果你想发邮件,我们会发邮件”或类似的聪明话。

    我想你不能,有很多情况下,即使发送电子邮件也可能失败。例如,用户端的邮件服务器暂时关闭,邮箱存在但已满,因此无法传递邮件,等等


    这可能就是为什么这么多网站在用户确认收到确认电子邮件后验证注册。

    您所能做的就是搜索DNS并确保电子邮件地址中的域具有MX记录,除了没有可靠的处理方法之外

    某些服务器可能使用rcpt to方法与SMTP服务器进行通信,但这完全取决于服务器的配置。另一个问题可能是过载的服务器可能返回550代码,表示用户未知,但这是一个临时错误,可以返回一个永久性错误(我想是451?)。这完全取决于服务器的配置


    我个人会检查DNS MX记录,然后发送电子邮件验证MX记录是否存在。

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

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

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

    MAIL FROM:<>
    RCPT TO:<user@domain>
    
    邮件来源:
    RCPT至:
    
  • 如果用户不存在,您将获得5.1.1 DSN。然而,仅仅因为电子邮件没有被拒绝,并不意味着用户存在。有些服务器会自动放弃这样的请求,以防止枚举其用户。其他服务器无法验证用户,因此必须接受该消息

    还有一种称为greylisting的反垃圾邮件技术,它会导致服务器最初拒绝该地址,期望真正的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 当目标邮件服务器使用greylisting时,这将失败(除其他情况外)

    Greylisting:SMTP服务器在以前未知的客户端第一次连接时拒绝传递,允许下次发送;这样可以在允许合法使用的同时阻止一定比例的垃圾邮件,因为合法邮件发送者会重试,这是正常邮件传输代理所做的

    但是,如果您的代码只在服务器上检查一次,则具有greylisting的服务器将拒绝传递(因为您的客户端是第一次连接);除非稍后再次检查,否则您可能会错误地拒绝有效的电子邮件地址。

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

    虽然这个问题有点老了,但此服务提示可能会帮助用户搜索类似的解决方案,在发送之前检查语法验证之外的电子邮件地址

    我一直在使用它对一些项目的电子邮件进行更深入的验证(检查电子邮件地址域上的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
        }
    }
    
    <?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";
    
    ?>