メールアドレスのバリデーション by Ruby  [ruby]  [tips]  [sample_code]

javascriptによる簡易regexでは対応できないケースがでてしまったので、いろいろ参考にしつつruby版を作った。

require 'resolv'
require 'pp'

class MailAddressValidator
  def self.validate(address)
    return validate_by_regex(address) && validate_by_MX(address)
  end
  def self.validate_by_regex(address)
    addr_spec = %r{^(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:"(?:\\[^\r\n]|[^\\"])*")))\@(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+)(?:\.(?:[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+))*)|(?:\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\])))$}
    address =~addr_spec
  end
  def self.validate_by_MX(address)
      mxdomain = address[/[^@]+$/]
      Resolv::DNS.new.getresource(mxdomain,Resolv::DNS::Resource::IN::MX) rescue nil
  end
  private_class_method :validate_by_regex, :validate_by_MX
end

使うときはこんな感じ

require File.dirname(__FILE__) + '/mail_address_validator'
print (MailAddressValidator.validate('hogefuga@hogefugadennnenn.naiyo')) 'ok':'ng' #=> ng

これをつかって、同期Ajaxでチェックしてる。

日本語が変だな。。。要は javascriptでxmlhttprequest.open('GET',"xxxxxx", false)という形で同期的にチェックしてる。

参考:

http://blog.livedoor.jp/dankogai/archives/51189905.html

http://www.ruby-lang.org/ja/man/html/resolv.html

追記 2009-04-13:

spellミスを直しました。id:Uchimataさんありがとうございます。

はてなブックマークがはじめてコメント欄として機能した記念すべき日です。