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


123

我碰到过此PHP代码,无需发送电子邮件即可使用SMTP检查电子邮件地址

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



2
只是想知道,为什么会有Telnet标记?
Piccolo 2013年

2
还有那不正是一个PHP库:github.com/kickboxio/kickbox-php

Kickbox不是免费的。该API只是连接到其服务的包装器。
Ashit Vora

Answers:


92

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

  1. 您可以连接到服务器,然后发出VRFY命令。很少有服务器支持此命令,但正是为此目的而设计的。如果服务器以2.0.0 DSN响应,则该用户存在。

    VRFY user
  2. 您可以发出RCPT,然后查看邮件是否被拒绝。

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

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

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

老实说,如果您尝试验证地址,最好的方法是使用一个简单的正则表达式阻止明显无效的地址,然后将实际的电子邮件及其链接发送回系统,以验证是否已接收到该电子邮件。这还可以确保他们的用户输入了他们的实际电子邮件,而不是碰巧属于其他人的轻微错字。


10
某些服务器甚至会接受该消息,但随后将错误消息发送回信封发件人,尤其是如果它是一个大型组织,拥有许多内部部门并拥有自己的邮件服务器。边界服务器甚至可能不知道其中的所有帐户。
DavidMårtensson,

3
那么,为什么垃圾邮件发送者不使用此方法来验证电子邮件地址?除了这些事实外,很少有服务器支持这些方法。还是他们?
Shahriyar Imanov

7
@Shehi:实际上,垃圾邮件发送者可能会使用这种方法,这很难说。但是,由于垃圾邮件发送者可能会使用它,因此几乎所有邮件服务器都会禁用VRFY,因此实际上VRFY可能没有用。
sleske

2
您可以举一个如何使用RCPT TO:<user @ domain>的代码示例吗?谢谢
爸爸De Beau

4
gmail向VRFY回复“发送一些邮件,我会尽力而为” ;-)
Armel Larcier15年

46

这里的其他答案讨论了尝试执行此操作时遇到的各种问题。我想我会告诉您如何尝试这样做,以防您想自己学习。

您可以通过telnet连接到邮件服务器,询问是否存在电子邮件地址。这是一个测试电子邮件地址的示例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:\> telnet STACKOVERFLOW.COM.S9A1.PSMTP.com 25
220 Postini ESMTP 213 y6_35_0c4准备就绪。CA Business and Professions Code部分17538.45禁止将此系统用于未经请求的电子邮件广告。

嗨
250 Postini向您问好

邮件来自:<me@myhost.com>
250好

rcpt至:<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中,您可以使用fsockopenfwritefread以编程方式执行上述步骤:

$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 2012年

@DhruvenkumarShah,对不起,我不知道。如果发现,请再次发表评论。
德鲁·诺阿克斯

嗨,我只是想用我自己的大学帐户来查找有关MX记录的所有信息,但它不适用于25 ..但在线verify-email.org这样的网站确实有效..他们是如何做到的..如果我找到了,它将让您知道
Dhruvenkumar Shah 2012年

1
@DhruvenkumarShah它提供了几个邮件交换服务器名称。请参阅邮件交换器的答案。因此,如果一个失败,则列表中的另一个应该起作用。
Janaka R Rajapaksha

真的非常有帮助。.谢谢您,先生。.我在油灰中试了一下,像魅力一样..谢谢..
Mohammed Sufian 2014年

8

普遍的答案是,如果您向它发送电子邮件,则无法检查电子邮件地址是否存在事件:它可能会陷入一个黑洞。

话虽这么说,这里描述的方法非常有效。它在ZoneCheck中的生产代码中使用,除了它使用RSET而不是QUIT。

在用户与其邮箱之间的交互开销不高的情况下,许多站点实际上通过发送必须发送回发送方的秘密号码(通过进入秘密URL或通过电子邮件发送此秘密号码)来测试邮件是否到达某处。大多数邮件列表都是这样工作的。



6

当目标邮件服务器使用灰名单时,这将失败(在其他情况下)。

灰名单:SMTP服务器在先前未知的客户端第一次连接时拒绝传送,允许下次传送;这样一来,您就可以避免垃圾邮件的出现,同时又可以合法使用- 可以预期,合法的邮件发件人将重试,这是普通邮件传输代理所要做的。

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


(个人经验:我不得不与电子邮件提供商来回争论,是的,我知道我在做什么,是的,我需要将其列入灰名单-因为来自第三方服务的这些检查均失败了)
Piskvor在2011年

4

一些问题:

  1. 我敢肯定,如果您提供的地址不存在,某些SMTP服务器会立即通知您,但有些不会作为隐私保护措施。他们只会接受您提供给他们的任何地址,而会默默地忽略不存在的地址。
  2. 如文章所述,如果您经常对某些服务器执行此操作,则它们会将您列入黑名单。
  3. 对于某些SMTP服务器(例如gmail),您需要使用SSL才能执行任何操作。 仅当使用gmail的SMTP服务器发送电子邮件时,才如此。

关于第三点,仅当您想将其用作中继时才会发生这种情况。我不知道任何需要SSL的邮件交换器。如果这样做,他们将停止接收来自许多用户的电子邮件。
kmkaplan,2009年

抱歉,是我的错。如果要使用gmail的SMTP服务器发送电子邮件,则必须使用SSL。
Graeme Perrow

3

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

我一直在使用此开源服务对一些项目进行更深入的电子邮件验证(检查电子邮件地址域上的mx记录等),并取得了良好的效果。它还对检查普通错字女巫很有用。演示在这里


您声称此服务是开源的。您能否提供到源的链接?
amaurymartiny

对不起,@ amaurymartiny,我不能。在撰写本文时,如果我没记错的话,Mailgun项目是开源的,但是在此时间之后,我找不到提供该来源的任何回购的链接。
Henkealg

2

“您能告诉客户/用户输入的电子邮件是否正确并且存在吗?”

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

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


2
+1如果不发送电子邮件并得到人为的答复,例如单击链接,您将永远无法确定它是正确的。
Daniel Daranas 09年

您可以在电子邮件正文中保留一个链接(用于图像等),并计算该链接的每次负载。无需等待点击
Janaka R Rajapaksha 2014年

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
我认为那只是检查域名是否存在,而不是检查电子邮件本身。
愤怒的撒克逊人

这可能更有用:getmxrr
jchook

1

假定这是用户的地址,某些邮件服务器确实允许SMTP VRFY命令根据其邮箱实际验证电子邮件地址。大多数主要站点都不会为您提供太多信息。gmail响应是“如果您尝试邮寄,我们会尝试将其发送”或类似的巧妙提示。


1

我认为您不能,在很多情况下,甚至发送电子邮件都可能失败。例如。用户端的邮件服务器暂时关闭,邮箱存在但已满,因此邮件无法传递,等等。

这可能就是为什么如此多的站点在用户确认他们已收到确认电子邮件后验证注册的原因。


0

我可以确认约瑟夫和德鲁的答案RCTP TO: <address_to_check>。我想在这些答案的上方添加一些小附录。

包罗万象的提供者

某些邮件提供者实施了“包罗万象”策略,这意味着*@mydomain.comRCTP TO:命令将返回肯定值。但这并不一定意味着邮箱“存在”,如“属于人类”。请注意,在这里您无能为力。

IP灰名单/黑名单

灰名单:来自未知IP的第一连接被阻止。解决方案:重试至少2次。

黑名单:如果您从同一IP发送太多请求,则该IP被阻止。解决方案:使用IP轮换;到达者使用Tor。

注册表单上的HTTP请求

这是非常特定于提供程序的,但是您有时可以使用精心设计的HTTP请求,并解析这些请求的响应,以查看用户名是否已为此提供程序注册。

这是我编写的用于*@yahoo.com使用HTTP请求检查地址的开源库中的相关功能: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";

?>

用户要求的是.Net解决方案而不是php。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.