regular expressions -电子邮件地址验证应该走多远?

Translate

我想知道人们应该花多长时间验证电子邮件地址。我的领域主要是网络开发,但这适用于任何地方。

我看过几种方法:

  • 只需检查是否存在“ @”,这很简单,但当然不是那么可靠。
  • 用于标准电子邮件格式的更复杂的正则表达式测试
  • a 全正则表达式反对RFC 2822-这样的问题是,通常一个电子邮件地址可能是有效的,但它可能不是用户的意思
  • DNS验证
  • SMTP验证

正如许多人可能知道(但许多人却不知道)一样,电子邮件地址可能具有许多大多数人通常不考虑的奇怪变化(请参阅RFC 2822 3.4.1),但您必须考虑验证的目标:您是否只是在尝试确保可以将电子邮件发送到某个地址,或者该电子邮件可能是用户可能要输入的地址(在很多其他不明显的“有效”地址案例)。

我考虑过的一个选项只是用一个更加深奥的地址发出警告,但仍然允许请求通过,但这确实增加了表单的复杂性,并且大多数用户可能会感到困惑。

虽然DNS验证/ SMTP验证似乎很容易,但我可以预见到DNS服务器/ SMTP服务器暂时关闭且用户无法在某处注册,或者用户的SMTP服务器不支持所需功能的问题。

一些经验丰富的开发人员将如何处理此问题?除了我列出的方法以外,还有其他方法吗?

编辑:我完全忘记了最显而易见的一切,发送确认电子邮件!感谢答复者指出这一点。是的,这很简单,但是涉及的每个人都确实需要额外的麻烦。用户必须获取一些电子邮件,开发人员需要在甚至确认用户数据有效之前记住用户数据。

This question and all comments follow the "Attribution Required."

所有的回答

Parker Lee
Translate

像大多数论坛一样,除了向用户发送电子邮件并等待响应外,没有100%可靠的方法来确认有效的电子邮件地址。

我将使用简单的“ @”验证规则,然后向用户发送电子邮件以确认其电子邮件地址。

虽然,这是我个人的看法...我正在等待其他建议。

来源
Hiram Lee
Translate

一个建议:不要拒绝地址中带有+的地址。拒绝它们是很烦人的事,但这是一个有效的字符,Gmail用户可以使用[email protected]来更轻松地标记和分类传入的邮件。

来源
Newman Lee
Translate

在您的帖子中,似乎当您说“ SMTP验证”时,是指连接到服务器并尝试RCPT TO以查看它是否被接受。由于您将其与实际发送确认电子邮件区分开来,因此我假设您要根据用户操作内联处理。除了网络问题,DNS故障等问题之外,此方法还会对灰色列表造成严重破坏。方法各不相同,但从本质上讲,灰色列表始终会阻止按连接IP向收件人发送邮件的首次尝试。就像我说的那样,这可能会有所不同,有些主机可能会在初次尝试时拒绝无效地址,而只会推迟有效地址,但是没有可靠的方法可以通过编程方式来解决不同的实现。

您唯一可以确定地址有效且真正由其所有者确实希望其用于您的应用程序的所有者提交的方法是发送验证电子邮件。好吧,只要它不会被垃圾邮件过滤掉,我猜=)。

来源
Edith Lee
Translate

使用正则表达式进行电子邮件验证的另一个缺点是,几乎不可能捕获所有有效的顶级域名同时拒绝所有无效的。

例如,Jeff Atwood的回复中的基本电子邮件正则表达式:

\ b [A-Z0-9 ._%+-] + @ [A-Z0-9 .-] +。[AZ] {2,4} \ b

将接受任何2到4个字符的TLD。因此,例如,.spam将被接受,但.museum和.travel(均为有效TLD)将被拒绝。

还有一个原因是,最好只查找@,然后发送确认电子邮件。

来源
Translate

具有国际域名几乎一切皆有可能:

如果要进行任何测试,则应首先将其转换为punycode。

没有punycode,您要做的就是在此进行测试:

  • 至少是一个@
  • 在本地至少是一个字符
  • 在域部分至少是一个点
  • 是域中的至少四个字符(假设没有人在tld上有地址,并且tld至少为2个字符)
function isEmail(address) {
    var pos = address.lastIndexOf("@");
    return pos > 0 && (address.lastIndexOf(".") > pos) && (address.length - pos > 4);
}
来源
Blithe Lee
Translate

最好只检查诸如@和的简单内容。使用JavaScript,然后将验证发送给他们的电子邮件。如果他们验证了他们的帐户,则您将拥有一个有效的电子邮件地址。这样,您就可以确定自己有一个工作地址,而不必过于专横。

来源
Translate

使用不会给出假阴性的开源验证器。您的零工作和对应用程序的强大验证。

我现在整理了Cal Henderson,Dave Child,Phil Haack,Doug Lovell和RFC 3696的测试用例。总共有158个测试地址。

我对所有可以找到的验证器进行了所有这些测试。比较在这里:http://www.dominicsayers.com/isemail

随着人们增强其验证器,我将尝试使此页面保持最新。感谢Cal,Dave和Phil在编写这些测试和对结构性批评时所提供的帮助和合作我自己的验证器.

人们应该意识到针对RFC 3696的勘误表特别是。实际上,其中三个规范示例是无效地址。地址的最大长度为254或256个字符,320。

来源
Jesse Lee
Translate

考虑到答案(因为我完全忘记了确认电子邮件),在我看来,低摩擦解决方案的合适折衷办法是:

  1. 使用正则表达式检查电子邮件地址看起来是否有效,如果它比较晦涩,则发出警告,但请避免直接拒绝。
  2. 使用SMTP验证来确保电子邮件地址有效。
  3. 如果SMTP验证失败了然后-和只有那时-使用确认电子邮件作为最后的选择。确认电子邮件似乎需要在您的应用程序之外进行过多的交互,才能将其视为低摩擦,但它们是一个完美的后备。
来源
Sara Lee
Translate

正则表达式从其库中提供以下与电子邮件相关的正则表达式:

电子邮件地址(基本)

\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b

电子邮件地址(RFC 2822,简化)

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?

但是我倾向于同意Peter和SuperJoe的回答。唯一真正的“测试”实际上是发送验证电子邮件。

来源
Drew Lee
Translate

我曾在4家不同的公司工作过,那里的服务台有人叫O'Malley或O'Brien或其他带有撇号的电子邮件地址大喊大叫。如前所述,并非所有的正则表达式都能抓住一切,但可以为自己节省一些麻烦并接受撇号,而不会产生警告。

--
mb

来源
Fay Lee
Translate

您可以进一步进行电子邮件验证,以实际测试邮箱是否存在。此技术有其缺点(开发时间长,还有可能因滥用而被列入黑名单)。http://www.webdigi.co.uk/blog/2009/how-to-check-if-an-email-address-exists-without-sending-an-email/

来源
Eden Lee
Translate

如果你想校验如果是电子邮件(即确保用户拥有电子邮件地址),则确认电子邮件是您唯一可以做的。然后又有许多人拥有专用的垃圾邮件地址或使用诸如OneWay邮件如果他们不想给您实际的电子邮件地址,他们也不会。因此,基本上,您正在制造用户障碍。

到那个时刻验证,以确保用户不会无意间输入错误的电子邮件地址,这绝对是正确的动机。但是,至少对于HTML表单(这是迄今为止最常用的收集电子邮件地址的方式),它并不是正确的工具。

首先,您将无法在电子邮件地址的实际“单词”中识别拼写错误。您无法发现[email protected]是错误的,仅基于格式。
但更重要的是,从用户的角度来看,您可能只想输入一个(或满手)电子邮件地址。您可能已经输入了。
因此,您应该着重确保所有浏览器都可以识别电子邮件字段,而不是尝试验证地址,从而无需首先输入电子邮件地址。当然,如果您要构建的网站可能会被以前从未在浏览器中输入过电子邮件地址的用户访问,那么这将不适用。但是我想我们当中至少有一个这样的职位。

来源
Christian Lee
Translate

我认为这取决于您使用电子邮件的上下文。更严肃的项目需要更严格的验证,但是我认为对于大多数情况,使用构型链接将电子邮件发送到提供的地址将确保电子邮件地址有效。

来源
Translate

@麦克风-我认为发送确认电子邮件的部分原因不仅在于确保电子邮件地址有效,还在于提交电子邮件的用户可以访问该电子邮件地址。一个人可以轻松地在电子邮件地址中输入一个字母的拼写错误,这将导致产生一个不同的有效电子邮件地址,但这仍然是一个错误,因为这将是错误地址。

来源
Spring Lee
Translate

我在电子邮件验证中遇到的最完整,最准确的正则表达式是有记载的这里。这不是为了胆小;它非常复杂,因此将其分解成多个部分,以使人类更容易解析(示例代码在Java中)。但是,如果必须进行验证,我认为它不会变得更好。

无论如何,我建议您使用单元测试来确认您的表达涵盖了您认为重要的情况。这样,当您仔细研究它时,可以确保您没有破坏过以前可行的情况。

来源
Jacob Lee
Translate

无论您选择哪种方式,我都认为您应该误以为用户在99%的时间确实实际上知道他们的电子邮件地址是什么。作为来自澳大利亚的某人,我仍然偶尔会发现一个非常聪明的电子邮件验证,该验证告诉我我不可能拥有.com.au域。在互联网初期,这种情况在您看来早已发生了很多。

这些天发送确认电子邮件对于用户来说是可接受的,并且对于选择加入以及验证其提供的地址也很有用。

来源
Anastasia Lee
Translate

在我工作过的地方开发的一些网站上,我们一直使用确认电子邮件。但是,对于用户来说,以无法正常工作的方式错误地键入他们的电子邮件地址,然后继续等待不会出现的确认电子邮件,这是令人惊讶的普遍现象。在这些情况下,添加临时代码(或对于域名部分,则是DNS验证)来警告用户可能是一个好主意。

我见过的常见情况:

  • 在域名中间放置一个字母,或其他几个简单的拼写错误。
  • TLD混乱(例如,添加一个.br到一个.com域,或删除.br从一个.com.br域)。
  • 添加一个www.在电子邮件地址本地部分的开头(我没有填写;我看到了一些表格的电子邮件地址[email protected]).

甚至还有更多奇怪的案例。像一个完整的东西域名作为本地部分,地址有两个@(就像是[email protected]@example.com), 等等。

当然,其中大多数仍然是有效的RFC-822地址,因此技术上您可以让MTA处理它们。但是,警告用户输入的电子邮件地址很可能是虚假的,这可能会有所帮助,特别是如果您的目标受众不是很懂计算机的人。

来源
Joanna Lee
Translate

世界上所有的正则表达式验证都不会阻止某人输入不正确或伪造的电子邮件地址。真的很烦。

来源
Translate

取决于目标。如果您是ISP,并且需要验证用户是否正在创建有效的电子邮件地址,请使用可对所有可能的内容进行验证的Regex。如果您只想捕获用户错误,请遵循以下模式:

[所有字符,无空格] @ [字母和数字](。[字母和数字]),最后一组至少出现一次。

正则表达式如下所示:

[\S][email protected][\w]+(.[\w-]+)+

然后发送确认电子邮件以确保。

来源
Translate

@亚科夫(可以在此处通过某种“答复”来答复)

我认为发送确认电子邮件的部分原因不仅在于确保电子邮件地址有效,还在于提交电子邮件的用户可以访问该电子邮件地址。一个人可以很容易地在电子邮件地址中输入一个字母的错字,这会导致一个不同的有效电子邮件地址,但这仍然是一个错误,因为它是错误的地址。

我同意,但是我不确定是否值得。我们也有用于此目的的确认字段(再次重复您的电子邮件地址)。网站类型可能需要采用不同方法的另一种情况。

此外,发送确认电子邮件本身无法向原始用户表明他们输入的地址错误。在未收到确认电子邮件后,他们可能会认为您的应用程序/网站有问题;至少允许用户立即开始使用其帐户,他们可以更正其电子邮件地址,特别是如果该电子邮件地址显示在适当明显的位置。

来源
Liz Lee
Translate

马匹的课程。

所有这些本身就是有效的,完整的电子邮件验证系统,对于一个给定的网站,一个将比其他网站更合适(或完全保证)。在许多情况下,验证的几个步骤可能会有用。

如果您要为银行开发网站,那么除了这些之外,还需要蜗牛邮件或电话验证。

如果您要为竞赛开发网站,则可能不需要任何一个-验证电子邮件是否在后期处理中,如果电子邮件失败,对于进入该网站的人来说太糟糕了-考虑到大量的人,您可能会评价服务器的性能(例如电视大赛),以确保每个人都正确地通过在线验证。

一个人应该多远进行一次电子邮件验证?

在必要和有保证的情况下。

再也没有了(KISS)

来源
Archer Lee
Translate

我见过一些网站也可以防止使用临时丢弃垃圾桶的用户,例如邮递员要么我的垃圾邮件,它绕开了确认电子邮件的内容。我并不是说您应该将这些过滤掉,而是说。

来源
Dorothy Lee
Translate

您想在电子邮件验证中抓住什么?

电子邮件地址的正则表达式验证最多可以验证该地址在语法上正确且相对合理。如果正则表达式不太正确,也有可能拒绝实际的,可交付的地址(已经多次提到)。

SMTP验证可以确定该地址是否可交付,这取决于灰名单或服务器的配置限制,服务器被配置为尽可能少地提供有关其用户的信息。您无法知道MTA是否只是声称接受伪造地址的邮件,然后将其作为反垃圾邮件策略的一部分放到地板上。

不过,发送确认消息是只要验证地址是否属于输入用户的方法。如果我填写您的表格,我可以很容易地告诉您我的电子邮件地址是[email protected]。正则表达式会告诉您它在语法上是有效的,SMTP RCPT TO会告诉您这是一个可交付的地址,但是它肯定不是my地址。

来源
Sally Lee
Translate

随着HTML5的到来,至少增加了一种新方法:使用类型为'电子邮件' 这使得验证在客户端。当前版本的Firefox,Chrome,Safari和Opera确实支持此功能(其他浏览器只是将其视为type = text,因此可以毫无问题地使用它,当然您也无需进行验证。)

它永远无法保证(如几次指出的那样)地址可用,但是在您只需要捕获可能的用户错误的地方,它可能会非常有益(最终取代服务器端检查)。

来源
Translate

电子邮件验证的三个主要级别:

1)正则表达式检查格式正确的电子邮件地址[email protected]

2)通过MX记录检查电子邮件域,以查看域名是否具有电子邮件服务

3)发送带有确认链接或代码的确认电子邮件

1级:

在Visual Studio中,您可以使用“正则表达式验证器”。在“ ValidationExpression”属性中,您可以单击“ ...”按钮,该按钮具有一个向导,可以为电子邮件地址添加正则表达式格式。

2级:

这是我下面的C#代码,用于使用nslookup验证电子邮件域是否具有有效的MX记录。在Win 2008 R2和Win 7上运行正常。

using System.Net.Mail;
using System.Diagnostics;

public static bool checkMXRecords(string email) 
    {
        MailAddress addr = new MailAddress(email);
        string domain = addr.Host;

        string command = "nslookup -querytype=mx " + domain;
        ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + command);

        procStartInfo.RedirectStandardOutput = true;
        procStartInfo.UseShellExecute = false;

        procStartInfo.CreateNoWindow = true;

        Process proc = new Process();
        proc.StartInfo = procStartInfo;
        proc.Start();
        string result = proc.StandardOutput.ReadToEnd();

        if (result.ToLower().Contains("mail exchanger"))
        {
            return true;
        }
        else return false;

     } // checkMXRecords

另一个选择是使用Arsofttools nuget程序包,但据我所知,它在Windows Server 2008 R2上可能运行缓慢,但在Win 7上运行速度很快。

3级:

对于电子邮件确认,您可以生成特定于电子邮件的十六进制网址(使用加密功能)等http://domain.com/validateEmail?code=abcd1234在用户单击时验证电子邮件地址。无需将该URL存储在内存中。

来源