Ruby,Rails - 如何检查 var 是不是是电子邮件

Posted

技术标签:

【中文标题】Ruby,Rails - 如何检查 var 是不是是电子邮件【英文标题】:Ruby, Rails - how to check if a var is an EmailRuby,Rails - 如何检查 var 是否是电子邮件 【发布时间】:2011-06-03 03:57:08 【问题描述】:

Rails 3 或 Ruby 是否有内置方法来判断 var 是否为 EMAIL ADDRESS?

例子

1 returns false
dadadad@asdasd.net returns true
blah+asdasds@asdasd.net returns true
asdasdasdads returns false

也许像,如果 1.is_a?电子邮件结束

谢谢

【问题讨论】:

尝试验证电子邮件地址的问题在于,允许的地址格式多种多样,无法用简单的正则表达式处理。即使是复杂的正则表达式也无法捕捉到所有极端情况,但是,即使可以确定地址格式是否正确,它仍然无法判断它是否是真实地址。由于问题的复杂性,有两种解决方案:向该地址发送电子邮件并查看收件人是否响应,或者对用户 ID、“@”和域进行简单检查,并称其足够好。第二个很容易被欺骗。 有关此主题的深入讨论,请参阅How to use a regular expression to validate an email addresses? 【参考方案1】:

我最终使用了 Rails gem,EmailVeracity,效果很好

【讨论】:

该库已弃用,最后一次提交是 6 年前。【参考方案2】:

这样的事情应该可以工作:

def isEmail(str)
  return str.match(/[a-zA-Z0-9._%]@(?:[a-zA-Z0-9]\.)[a-zA-Z]2,4/)
end

【讨论】:

您无法使用正则表达式验证电子邮件地址。 ***.com/questions/201323/… @Andrew 如果我可以使用正则表达式,我应该使用什么? 这不适用于大多数域,因为您允许域名只是单个字母,例如 foo@a.com。可能你想写这个:/[a-zA-Z0-9._%]@(?:[a-zA-Z0-9]+\.)[a-zA-Z]2,4/【参考方案3】:

在模型中,您可以使用验证器(在 ActiveModel 中)和

类似这样的:

class User
  include ActiveModel::Validations

  validates :email, :presence => true,
                    :format => :with => /^[^@\s]+)@((?:[-a-z0-9A-Z]+\.[a-zA-Z]2,)$/

end

见http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/ 有关 ActiveModel 的更多信息

【讨论】:

您无法使用正则表达式验证电子邮件地址。 ***.com/questions/201323/… 他只要求提供一部分电子邮件地址,而不是整个 RFC。 按照这个逻辑,def is_email(str) str =~ /asd/ end 会按照他的要求做吗? 正则表达式 ^([^@\s]+)@([-a-z0-9A-Z]+)\.([a-zA-Z]2,)$ 至少匹配某个电子邮件地址时存在语法错误。【参考方案4】:

使用https://github.com/OpenGems/rails_email_checker

ActiveModel 电子邮件验证。检查 MX 记录、子地址、正则表达式、白名单和黑名单检查

【讨论】:

以上是关于Ruby,Rails - 如何检查 var 是不是是电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何检查变量是不是是 Ruby 中的日期或时间或日期时间?

ruby/rails:如何确定是不是包含模块?

ruby 使用Rails ENV VARS加载YAML文件

检查延迟的作业是不是在rails中运行

检查是不是定义了变量?

检查常量是不是已在 Ruby 类中定义的正确方法