【问题标题】:Check well formatted email address检查格式正确的电子邮件地址
【发布时间】:2010-11-14 00:18:03
【问题描述】:

我有一个这样的电子邮件文本文件:

10:info@example.com;dev@example.com
12:john@host.com; "George <g.top@host.com>" 
43:jim.p@web.com.;sue-allen@web.com
...

我想检查列表是否包含格式正确的条目。你知道任何工具或网络服务来检查并给我一个无效地址列表吗?

更新 亲爱的,感谢您的意见。我真的在寻找基本的语法检查,所以我将继续使用Rafe's idea(我将使用 Java)。

【问题讨论】:

  • 这在一定程度上取决于您希望接受什么作为有效地址。 很多 看起来很奇怪的电子邮件地址在技术上是有效的,但大多数解决方案不接受它们。
  • 是的,例如,foo@bar 是一个有效的电子邮件地址。想想 admin@localhost
  • 或lol@192.168.1.113或类似

标签: validation email email-validation well-formed


【解决方案1】:

阅读此内容,您将按照符合 RFC 的方式进行操作:

http://www.eph.co.uk/resources/email-address-length-faq/

【讨论】:

  • 满足 RFC 的全部要求是很困难的,所以这取决于业务要求是什么。我记得曾经将电子邮件地址验证算法从 Majordomo listserv 软件移植到另一种语言。这是一种痛苦。
  • 我使用 .name 地址,希望更多人遵循 RFC。我的电子邮件地址被无数网站拒绝。它甚至被 Macys 等企业拒绝。
  • 从技术上讲,电子邮件地址的用户名部分区分大小写,这是很多人忘记电子邮件地址的另一件事。但是,您将很难找到遵循此规则的服务。我知道 gmail 至少没有。
【解决方案2】:

验证电子邮件的最简单方法可能是向其发送消息。正如 Sean 指出的那样,这会使您容易受到 DoS 攻击,但从您的描述来看,您似乎拥有的是文本文件而不是网页,所以这应该不是问题。

正则表达式不是匹配电子邮件的好工具,有很多有效地址天真匹配会失败。详情请查看attempts to validate emails with regex 的比较。

如果您必须离线检查它们,我会将电子邮件分成几部分(即 @ 之前和 @ 之后的部分),然后您可以创建自定义验证器(或正则表达式)来验证这些部分。

【讨论】:

  • 这是一种方法,但您的页面可用于自动对人们的收件箱进行垃圾邮件 DoS 攻击。许多服务器将接受发送给任何人@任何本地域的消息,因此 SMTP rcpt to: 行不足以验证电子邮件地址是否实际存在。如果它来了,你将不得不等待反弹。
  • @Sean 说得好。我主要担心的是人们默认使用正则表达式进行验证,并且倾向于天真地进行并排除大量有效的电子邮件地址
【解决方案3】:

邮件验证不像正则表达式那么简单

首先,我会阅读这篇文章I Knew How To Validate An Email Address Until I Read The RFC

在过去,您可以连接到用户的邮件服务器并使用 VRFY 命令并验证电子邮件地址是否有效,但垃圾邮件发送者滥用了该权限,我们都输了。

现在,我建议采用三部分方法:

  1. 验证句法有效性。您可以使用来自Mail perl module 的怪物正则表达式来检查以确保电子邮件地址格式正确。然后确保将 localhost 域/ips 列入黑名单作为检查的一部分。

  2. 验证域是否处于活动状态。对域进行 DNS 验证检查。您可以更进一步,使用 STMP 检查并确保您可以连接到域的有效邮件服务器。但是,由于虚拟主机方案,可能会出现一些假阴性结果。

  3. 发送一封实际的电子邮件,但包含一个链接到服务器上脚本的单个图像。当电子邮件与图像一起被读取时,您的服务器将收到图像已下载的通知,因此电子邮件是有效的。但是,现在很多邮件客户端因为这个原因默认不加载图片,所以不会100%有效。

资源

  1. Validating Email Addresses in ASP(在线)
  2. Validating Email Addresses in PHP(代码示例)
  3. This commercial product does bulk email verification ← 这可能就是你要找的东西
  4. 所以问题:How to check if an email address exists without sending an-email

【讨论】:

  • 我尝试了那个正则表达式,但它并没有削减它,因为它只验证地址本身,而不是地址加短语,这是输入脚本中的内容。 (此外,它对以 . 结尾的域名也会感到厌恶,这是不正确的。)
  • @Rafe:谢谢。我在当前项目中使用该正则表达式。是以 . 结尾的域吗?仅在 Intranet 上有效?我认为整个互联网上都没有,对吧?
  • 您可以附加 .到任何域名的末尾,以表明该域名是完全限定的。 (例如,这就是您在 DNS 配置文件中指定域的方式。)从技术上讲,尾随点是对根 DNS 服务器的引用。
【解决方案4】:

我编写了一个简单的 Perl 脚本,它使用 Email::Address 模块来验证这些地址:

#!/usr/bin/env perl

use Email::Address;

while (<>) {
    chomp;
    @addresses = split /\;/;

    foreach my $address (@addresses) {
        if (!Email::Address->parse($address)) {
            print $address, "\n";
        }
    }
}

您只需要安装该模块。它的主页是:

http://emailproject.perl.org/wiki/Email::Address

【讨论】:

    【解决方案5】:

    这个问题比看起来更难。面对它时,我从NMH 源中的mf.c 模块中窃取了代码。然后我将地址解析器导入Lua,这样我就可以处理来自脚本的电子邮件地址。

    使用别人的代码让我痛苦万分。

    【讨论】:

      猜你喜欢
      • 2017-06-21
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-28
      相关资源
      最近更新 更多