こんにちはHabr!
いくつかの観察。
提案された質問について、羊皮紙は不適切に書かれています。 それでも、Web開発の観点から、電子メールの特性である3つの重要な属性を無視したいと思います。
第一に、電子メールは一意であり、ニックネームとは異なり、半分の場合、私たちの前に誰かが占有しています。 ただし、ニックネームがログインしているサイトはまだあります。そのようなサイトはすべて、忘れることはできません。 ログインにのみメールを使用することをお勧めします。
次に、JSバリデーターがこのフィールドに対して設定されている場合、一部の開発者はtype = 'email'を無視し、タブレットデバイスはレイアウトを切り替えます。これは便利です。
第三に、この記事の目的のために、記事は毎年「なぜ正規表現を検証するのが悪いのか」のように書かれています。 Googleが正しくインデックスを作成することを願っています。
実際、プリアンブル全体は1つの興味深い解決策のためのものであり、Ruby統計を支援するはずです。他の言語でも同様の方法が実装されている可能性があります。
実際、問題が頭の中で問題として最初に定式化されたとき、私はGoogleを使用しました。2、3回クリックするだけで、私は今でも使用しているソリューションに出会いました。 重要:決定はimpしんで盗まれ、あなた自身のものとして提示されます。誰かがソースへのリンクを見つけたら、喜んでそれを記事に挿入します。
有効性の最初の指標
rubyライブラリと同じくらい古いgem 'mail'
require 'mail' mail = Mail::Addres.new('antiqe@gmail.com') mail.local #antiqe mail.domain #gmail.com
これが最初にすることです。
メールアドレスに無効な文字が含まれている場合、ライブラリはキャッチする必要がある例外をスローします。 ただし、ドメインについて何も明確ではなく、ここのドメインは無効である可能性があります。
有効性の2番目のインジケータ
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, ""
ここに構文ツリーがありますが、その性質と特性は、私にとっては完全に理解できないほどではありません。 私は、正規表現とは異なり、構文ツリーが本質的に再帰的ではないことを知っています。
ライブラリの作成者は何かを知っていたが、誰にも伝えなかったと仮定することができます。
このツリーは、1つの重要な質問に答える機会を提供します。ドメインがいくつの要素で構成されているかです。 そして、そのような要素が複数ある場合、ドメインは有効です。
プライベート実装
レールでは、これで十分です。
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
app / validators / email_validator.rbに配置して、任意のモデルで使用します。
validates :email, :presence => true, :email => true
2年以上の偽または偽陽性アドレスは特定されていません。
これ以上言うことはありません。
すべてに良い。