require 'mail' mail = Mail::Addres.new('antiqe@gmail.com') mail.local #antiqe mail.domain #gmail.com
mail = Mail::Address.new('antiqe@gmail.com') => #<Mail::Address:72490440 Address: |antiqe@gmail.com| > tree = mail.__send__(:tree) => SyntaxNode+Address1+AddrSpec0 offset=0, "antiqe@gmail.com" (dig_comments,comments,local_part,domain): SyntaxNode+LocalDotAtom0 offset=0, "antiqe" (local_dot_atom_text): SyntaxNode+CFWS1 offset=0, "": SyntaxNode offset=0, "" SyntaxNode offset=0, "" SyntaxNode offset=0, "antiqe": SyntaxNode+LocalDotAtomText0 offset=0, "antiqe" (domain_text): SyntaxNode offset=0, "" SyntaxNode offset=0, "antiqe": SyntaxNode offset=0, "a" SyntaxNode offset=1, "n" SyntaxNode offset=2, "t" SyntaxNode offset=3, "i" SyntaxNode offset=4, "q" SyntaxNode offset=5, "e" SyntaxNode+CFWS1 offset=6, "": SyntaxNode offset=6, "" SyntaxNode offset=6, "" SyntaxNode offset=6, "@" SyntaxNode+DotAtom0 offset=7, "gmail.com" (dot_atom_text): SyntaxNode+CFWS1 offset=7, "": SyntaxNode offset=7, "" SyntaxNode offset=7, "" SyntaxNode offset=7, "gmail.com": SyntaxNode+DotAtomText0 offset=7, "gmail." (domain_text): SyntaxNode offset=7, "gmail": SyntaxNode offset=7, "g" SyntaxNode offset=8, "m" SyntaxNode offset=9, "a" SyntaxNode offset=10, "i" SyntaxNode offset=11, "l" SyntaxNode offset=12, "." SyntaxNode+DotAtomText0 offset=13, "com" (domain_text): SyntaxNode offset=13, "com": SyntaxNode offset=13, "c" SyntaxNode offset=14, "o" SyntaxNode offset=15, "m" SyntaxNode offset=16, "" SyntaxNode+CFWS1 offset=16, "": SyntaxNode offset=16, "" SyntaxNode offset=16, ""
require 'mail' class EmailValidator < ActiveModel::EachValidator def validate_each(record,attribute,value) begin address = Mail::Address.new(value) result = address.domain && address.address == value # , Mail email tree = address.__send__(:tree) result &&= (tree.domain.dot_atom_text.elements.size > 1) # , rescue Exception => e # , result = false end record.errors[attribute] << (options[:message] || "is invalid") unless result end end
validates :email, :presence => true, :email => true
Source: https://habr.com/ru/post/175399/