为什么常规的电子邮件验证还不够。 使用PHP和Ruby中的示例验证MX记录

他们已经在世界上重复了多少次……关于哪种规律正确以及需要检查用户的电子邮件字段,存在着漫长而无休止的辩论。

是的,您确实需要检查常规季节。 但是我们的产品在线。 那为什么不使用她的真正力量呢?

此外,在某些情况下,用户输入电子邮件地址(包括域中)时确实会犯错。 好吧,或者,在电子邮件字段中,输入任何可能的“ Habrakadabra”,它可以轻松地通过regexp进行飞行,但不能作为邮件,因为即使该域在自然界中也不存在:)

顺便说一句,在这个细微差别上,我们实际上只是飞起来了:最重要的是,在一个颇受欢迎的CMS上建立的网站上,由于某种原因,我们停止了发送电子邮件通知。

事实证明,原因是垃圾邮件发送者的地址。

有以下几个原因:

  1. CMS非常流行,因此,上面有很多注册的垃圾邮件发送者。 更有趣的是-在设置中(可以进行很多设置)-禁用电子邮件验证。 在这种情况下,您可以(大多数机器人也可以这样做)在此处输入任何垃圾
  2. 字母文本未从标准字母重写。

总计:垃圾邮件发送者大量爬升进行注册,向该脚本中发送了一封电子邮件,我们尝试向其发送信件。 垃圾邮件过滤器看到许多电子邮件来自我们的电子邮件,他已经多次从其他电子邮件地址中看到过这些文本,与此同时,相当数量的文本落入了不存在的电子邮件地址中。

通常,邮寄地址会定期被归类为垃圾邮件。

因此,从理论上讲,应该并且应该争论说,检查Internet上某个域的可用性以及其上是否存在邮件服务(该域的MX记录),这是应该在用户注册系统中存在并起作用的内容。

实际上,检查的本质非常简单:在注册过程中,在验证用户数据的阶段,我们将域与电子邮件分开,然后查看MX上的内容。

有困难吗? 不完全是 但这可以大大减少邮政服务的负担。 顺便说一句,进入垃圾邮件列表的可能性要小得多(向不存在的邮件地址发送大量字母是垃圾邮件的标志之一)。

奇怪的是,在PHP中,这很简单:

$email ="11@sdlkfjsdl.co.uk"; $domain = substr(strrchr($email, "@"), 1); $res = getmxrr($domain, $mx_records, $mx_weight); if (false == $res || 0 == count($mx_records) || (1 == count($mx_records) && ($mx_records[0] == null || $mx_records[0] == "0.0.0.0" ) ) ){ //   -  mx-   echo "No MX for domain: $domain"; }else{ // ,  MX-   ,      echo "It seems that we have qualify MX-records for domain: $domain"; } 

如果有的话,我会解释一下。 事实是,在getmxrr函数的文档中, 一些注释提到了它的行为并不完全正确。 虽然我在php7.1上找不到它们-额外的检查不是额外的检查:)

在红宝石上,这是通过类似的方式完成的:

 domain = invite.email.split('@').last.mb_chars.downcase.to_s.force_encoding("UTF-8") # ,   .         UTF-8,     mail_servers = Resolv::DNS.open.getresources(domain, Resolv::DNS::Resource::IN::MX) if mail_servers.empty? # MX-.       false else true end 

同时,我将澄清,对电子邮件字段的这种检查不仅会严重影响您项目数据库中信息的质量(并降低垃圾邮件发送者发送通知的风险),还会导致工作量减少。 毕竟,从脚本发送信件在实践中是一个相当缓慢的过程。

Source: https://habr.com/ru/post/zh-CN434640/


All Articles