web-dev-qa-db-ja.com

Rubyでメールアドレスを検証するための最良/簡単な方法は何ですか?

Ruby(サーバー側))でメールアドレスを検証するための最良/簡単な方法は何ですか?

47
Ran

このRailsバリデータで使用されているような正規表現と一致するかどうかを確認できます。

validates_format_of :email,:with => /\A[^@\s]+@([^@\s]+\.)+[^@\s]+\z/

ただし、Deviseを使用する場合は、次のようにします。

validates_format_of :email,:with => Devise::email_regexp

ソース: http://lindsaar.net/2008/4/14/tip-4-detecting-a-valid-email-address

編集1:

テストに役立つWebサイト: http://www.rubular.com/

61
apneadiving

Rubyで?どの言語でも同じです。

メールアドレスが完全に検証されたと見なされる前に受信者がクリックする必要があるリンクを含むアドレスに確認メールを送信します。

完全にformattedのアドレスがまだ無効である理由はいくつもあります(そのアドレスに実際のユーザーがいない、スパムフィルターによってブロックされているなど)。確実に知る唯一の方法は、正常に完了した何らかの記述のエンドツーエンドトランザクションです。

8
paxdiablo
validates :email, presence: true, format: /\w+@\w+\.{1}[a-zA-Z]{2,}/

電子メールフィールドが空白ではなく、1つ以上の文字が両方とも「@」の前と後ろにあることを確認します

@の前の1つ以上のWord文字と、具体的には1 .とその後の少なくとも2文字の前後の1つ以上のWord文字の特殊性を追加しました。

6
partydog

これは古い質問であることは知っていますが、これを行う簡単な方法を探していました。 email_validator gem に遭遇しました。これは設定と使用が本当に簡単です。

バリデーターとして

_validates :my_email_attribute, :email => true_

モデル外の検証

EmailValidator.valid?('[email protected]') # boolean

これが皆さんのお役に立てば幸いです。

ハッピーコディング

5
MZaragoza

使用できます

<%=email_field_tag 'to[]','' ,:placeholder=>"Type an email address",:pattern=>"^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,4},*[\W]*)+$",:multiple => true%>
4
akshay

https://apidock.com/Rails/ActiveModel/Validations/HelperMethods/validates_format_of から参照を取得できます。

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

3
Kanmaniselvan

メインの回答のブログサイトがダウンしたため、ここに Nice cacher または Gist を介したそのサイトからのコードスニペットを示します。

# http://my.Rails-royce.org/2010/07/21/email-validation-in-Ruby-on-Rails-without-regexp/
class EmailValidator < ActiveModel::EachValidator
  # Domain must be present and have two or more parts.
  def validate_each(record, attribute, value)
    address = Mail::Address.new value
    record.errors[attribute] << (options[:message] || 'is invalid') unless (address.address == value && address.domain && address.__send__(:tree).domain.dot_atom_text.elements.size > 1 rescue false)
  end
end
3
toobulkeh

ショートカットフォーム:

 validates :email, :format => /@/

通常形式(正規表現):

validates :email, :format => { :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/ }

ソース: バリデータクラス

3
Omer Aslam

確認メールを送信し、私は通常このバリデータを使用します... D.R.Y.

# lib/email_validator.rb
class EmailValidator < ActiveModel::EachValidator

  EmailAddress = begin
    qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'
    dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'
    atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-' +
      '\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'
    quoted_pair = '\\x5c[\\x00-\\x7f]'
    domain_literal = "\\x5b(?:#{dtext}|#{quoted_pair})*\\x5d"
    quoted_string = "\\x22(?:#{qtext}|#{quoted_pair})*\\x22"
    domain_ref = atom
    sub_domain = "(?:#{domain_ref}|#{domain_literal})"
    Word = "(?:#{atom}|#{quoted_string})"
    domain = "#{sub_domain}(?:\\x2e#{sub_domain})*"
    local_part = "#{Word}(?:\\x2e#{Word})*"
    addr_spec = "#{local_part}\\x40#{domain}"
    pattern = /\A#{addr_spec}\z/
  end

  def validate_each(record, attribute, value)
    unless value =~ EmailAddress
      record.errors[attribute] << (options[:message] || "is not valid") 
    end
  end

end

あなたのモデルで

validates :email , :email => true

または

 validates :email, :presence => true, 
                :length => {:minimum => 3, :maximum => 254},
                :uniqueness => true,
                :email => true
2
andrea

Rails/Deviseを使用している場合-@apneadivingの回答に追加-

validates_format_of :email,:with => Devise::email_regexp

Devise :: email_regexpはconfig/initializers/devise.rbから取得されます

config.email_regexp = /\A[^@\s]+@([^@\s]+\.)+[^@\s]+\z/
2