【问题标题】:checkdnsrr does not work for .edu email addresses?checkdnsrr 不适用于 .edu 电子邮件地址?
【发布时间】:2011-12-09 11:05:00
【问题描述】:

当我们将他(或她)添加到我们的系统时,我用来验证用户电子邮件地址的功能:

private function validate_email($email){
    list($userName, $mailDomain) = split("@", $email); 
    if (!checkdnsrr($mailDomain, "MX")) { //.edu does not work?
        return false;
    } 
    return true;
}

由于某种原因,当我输入 我知道有效的 .edu 地址时,此函数总是似乎返回 false。

如何修复该函数,以便它验证并返回所有电子邮件类型的 true?

【问题讨论】:

  • 我的 2 美分:完全摆脱验证。检查它是否符合*@* 并将其他所有内容扔出窗外。无论如何它都没有用 - 如果您需要确定某个特定的电子邮件地址存在,您仍然需要发送一个确认链接。
  • @Pekka -- 我们发送了一个确认链接,但我们不知道他们是否收到了它,如果我们假设地址始终有效,我们无法知道他们是否收到了确认...
  • 获得确认仍然是真正的唯一方法。即使地址是有效,由于过度的垃圾邮件过滤器,电子邮件也可能丢失。我认为:*@* 之外的任何验证基本上都是毫无意义的。看看即将出现的新 .xyz TLD...IDN...最终,IDN TLD...
  • @Pekka 基本上这是一个求职者系统,他们可以登录并获得考试供他们参加。如果我们不知道他们没有收到电子邮件,我们假设他们收到了并且他们没有通过测试——我不希望这种情况发生。
  • checkdnsrr 只使用系统解析器。您可以通过在命令行中执行 nslookup -type=mx mit.edu 或 host -t mx mit.edu 来检查自己的 dns 设置是否正常。

标签: php email validation


【解决方案1】:

也许您的教育提供商不让任何人看到他们的 dns 记录。

【讨论】:

  • 这不太可能,尤其是对于用于电子邮件的域。
【解决方案2】:

如果主机名没有 MX 记录,但有 A(或 AAAA)记录,则符合要求的邮件传输代理将尝试直接投递到 A 记录中给出的地址 (RFC 5321 section 5):

"如果返回一个空的 MX 列表, 该地址被视为与隐式 MX 相关联 RR,首选项为 0,指向该主机。”

因此,没有 MX 记录并不一定表示邮件无法投递到该主机。


附录: 就像 Pekka 在 cmets 中所说的那样,判断电子邮件地址是否有效的唯一可靠方法是向其发送邮件并查看它是否已送达。如果您担心应聘者试图通过声称他们没有收到消息来作弊,您可以这样做:

  1. 询问候选人的电子邮件地址并向其发送确认消息。在消息中包含确认链接(和/或候选人可以在表格中输入的确认代码)。
  2. 一旦候选人通过点击链接确认他们已收到消息,就向他们发送实际测试。

【讨论】:

  • RE:您的附录 - 候选人仍然可以声称他们没有通过考试,然后我们会发送一个新链接,这将如何运作?
  • 如果他们收到确认电子邮件,您就知道他们提供的电子邮件地址正确且有效。这是尽可能多的确认。如果他们仍然声称他们收到了确认消息但不知何故没有通过测试,您想做什么,则由您决定。
【解决方案3】:

MX 记录实际上并不是接收电子邮件所必需的。如果没有 MX 记录,符合标准的 MTA 将退回到 A 记录(如果有)。一些教育机构可能依赖这种行为;这当然不被认为是最佳实践,并且会给他们带来一些邮件传递问题,但它会至少通常可以工作。

【讨论】:

  • 解决方案是隐式的:要么删除现有的checkdnsrr 检查,要么添加对A 记录的检查。
猜你喜欢
  • 2011-01-31
  • 1970-01-01
  • 2011-11-02
  • 2015-04-09
  • 2015-09-10
  • 2012-01-30
  • 2016-04-17
  • 2018-07-07
  • 1970-01-01
相关资源
最近更新 更多