メールアドレスのバリデーションを行うRailsプラグイン

独自に実装すると割とめんどいメールアドレスのバリデーションを行うプラグイン二種。
validates_format_ofでやってたけどプラグインあるなら使った方が楽だなということで。

validates_email_format_of

Railsify! > Plugins > validates_email_format_of

単純に正規表現によるフォーマットチェックでバリデーションを行うプラグイン。

インストール
ruby script/plugin install http://code.dunae.ca/validates_email_format_of/
サンプルコード
class User < ActiveRecord::Base
  validates_email_format_of :email
end

validates_email_veracity_of

Railsify! > Plugins > validates_email_veracity_of

こちらはフォーマットチェックの他にドメインの存在チェックまで可能なプラグイン。
許可しないドメインも指定できるので、フリーメールのアドレスは不可、といったことも実装できる。

インストール
ruby script/plugin install http://svn.savvica.com/public/plugins/validates_email_veracity_of
サンプルコード
class User < ActiveRecord::Base
  validates_email_veracity_of :email, :mx_only => true,
                                      :invalid_domains => ["example.com", "example.co.jp"]
end

オプションをいろいろと指定できる。

オプション
オプション 内容 デフォルト
:message エラーメッセージ “is invalid.”
:domain_check ドメインの存在チェックを行うかどうか true
:mx_only ドメインの存在に加えてMXレコードまでチェックする false
:timeout ドメインルックアップのタイムアウトまでの時間(秒) 2
:fail_on_timeout タイムアウトした場合にバリデーション失敗とするかどうか false
:timeout_message タイムアウトでバリデーション失敗した場合のエラーメッセージ “domain is currently unreachable, try again later.”
:invalid_domains 許可しないドメインのリストを配列で指定する []
:invalid_domain_message 許可しないドメインのためにバリデーション失敗した場合のエラーメッセージ “provider is not supported, try another email address.”

正規表現比較

自作すると記号入りのアドレスとかへの考慮を忘れがちだったりするメールアドレスの正規表現。
微妙に決定版がないので困る。
二つのプラグインも別々のものを使っている。

validates_email_format_ofのコード。

  Regex = /
    ^(
      ([A-Za-z0-9]+_+)|
      ([A-Za-z0-9]+-+)|
      ([A-Za-z0-9]+.+)|
      ([A-Za-z0-9]+++)
    )*[A-Za-z0-9]+@
    ((w+-+)|(w+.))*w{1,63}.[a-zA-Z]{2,6}$
  /ix

validates_email_veracity_ofのコード。

/A([^@s]+)@((?:[-a-z0-9]+.)+[a-z]{2,})Z/i

ちなみに今まで使ってたコード。

/^[x01-x7F]+@(([-a-zA-Z0-9]+.)*[a-zA-Z]+|[d{1,3}.d{1,3}.d{1,3}.d{1,3}])$|^$/

メールアドレスに一致する正規表現より拝借。

Google先生に聞くと他にもいろいろ見つかるけど、どんな正規表現が一番使われているんだろうな。

メールアドレスのバリデーションを行うRailsプラグイン” に対して2件のコメントがあります。

  1. たけうちひとし より:

    上のサンプルコードはvalidates_email_format_of :email のtypoですね。

  2. akahige より:

    おお、ご指摘ありがとうございます。
    修正しておきました。

コメントは受け付けていません。