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さんありがとうございます。
はてなブックマークがはじめてコメント欄として機能した記念すべき日です。
ツイート