检查电子邮件域名是否有效

5

我在表单中有一个用于输入电子邮件的输入字段。
当用户输入电子邮件并提交表单时,我需要验证电子邮件的域名。

(注意:我不需要验证电子邮件地址。我只需要验证域名)

在Ruby on Rails中检查电子邮件域名是否有效的最佳方法是什么?


2
创建一个自定义验证器方法,该方法将检查正确的域名。创建一个可接受域名的数组,并使用输入的 email_id 进行拆分,如.split("@")然后使用.include? 方法检查它与数组匹配。 - Navin
有没有广泛使用的宝石或类似工具? - Chetan Datta
“Validate” 的确切含义是什么?是检查邮件服务器是否存在?还是检查给定的文本是否具有域的有效格式(例如 /([a-z0-9]+\.)+[a-z]{2,}/i)? - Max N.
1
这是一项最简单的功能,您可以自己添加。不要通过添加任何 gem 来使您的应用程序变得臃肿。 - Navin
@razr,我的需求是-检查邮件服务器是否存在? - Chetan Datta
4个回答

2

有一个叫做valid_email2的宝石,它具有自定义验证功能。它检查MX记录和A记录。它还允许您在ymls配置文件中简单地添加黑名单或白名单地址。您可以根据要求自定义验证并进行验证。请查看其README获取更多信息。


2
您可以检查DNS服务器是否存在该域名的MX记录。
mx = Resolv::DNS.open { |dns| dns.getresources('domain.com',  Resolv::DNS::Resource::IN::MX) }
ok = mx.size > 0

我会添加类似于这个垃圾邮件地址列表以进行阻止。 - Max N.
这并不完全正确,仅当不存在MX记录时,您才需要对右侧主机名进行A或AAAA查找。(根据rfc 5321 - https://tools.ietf.org/html/rfc5321) - Doon

1

kamilc/email_verifier可以验证电子邮件地址的真实性,通过模拟发送实际电子邮件到邮件服务器。但这只验证了地址而不仅限于其域名。

如果您只想检查邮件服务器,您需要打开到端口25的域的TCP连接,如@diciu所描述here

编辑:正如@Doon在评论中所述,这不是一个好主意。您最好向用户发送实际的验证电子邮件。


1
在打开与随机电子邮件服务器的连接并伪装发送电子邮件时要小心,特别是来自Web主机。这是一个让Web主机被阻止的好方法。此外,这也不是验证地址的好方法,因为现在垃圾邮件发送者很多,很多Web主机都被列入了黑名单,所以邮件服务器会因为黑名单而5XX该地址,导致您的验证失败。 - Doon
好的,我不知道。那么,这样的检查应该有一个合理的实现方式吗?因为检查域名是否存在并不是验证电子邮件地址的好方法。 - Max N.
1
很遗憾,没有一个好的方法(戴上我的postmaster@帽子)。如果您需要一个有效的电子邮件地址,请发送一封电子邮件,并提供有关为什么生成它、谁请求它等信息,并要求用户确认其地址。在将电子邮件地址添加到任何类型的邮件列表、系统之前,您应该这样做,并确认他们想要被添加。因为即使你把恶意排除在外,也有很多人不知道自己的电子邮件地址或无法输入。 - Doon
哦,是的,当然。我经常在我的应用程序中这样做,但我没有在这里想到它...谢谢 :) - Max N.
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Doon

1
require ‘resolv’ #”gem install resolv-ipv6favor“

email = “foo@example.com” #test with valid email
split_email = email.split(“@”) #split string with “@”
domain = split_email[1].to_s #get domain name
if email =~ (/\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i)
#checking domain name
Resolv::DNS.open do |dns|
@staus = dns.getresources(domain, Resolv::DNS::Resource::IN::MX)
end
else
errors_add(:email, ‘domain name can not be found.’)
end

1
正如我之前所述,这并不是100%准确的。根据RFC 5321规定,如果没有MX记录存在,则应将主机名的A / AAAA用作隐式MX,并将其优先级设置为0。 - Doon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接