# http://www.faqs.org/rfcs/rfc2822.html module DataMapper module Validations module Helpers module Email module RFC2822 EmailAddress = begin alpha = "a-zA-Z" digit = "0-9" atext = "[#{alpha}#{digit}\!\#\$\%\&\'\*+\/\=\?\^\_\`\{\|\}\~\-]" dot_atom_text = "#{atext}+([.]#{atext}*)*" dot_atom = "#{dot_atom_text}" qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]' text = "[\\x01-\\x09\\x11\\x12\\x14-\\x7f]" quoted_pair = "(\\x5c#{text})" qcontent = "(?:#{qtext}|#{quoted_pair})" quoted_string = "[\"]#{qcontent}+[\"]" atom = "#{atext}+" word = "(?:#{atom}|#{quoted_string})" obs_local_part = "#{word}([.]#{word})*" local_part = "(?:#{dot_atom}|#{quoted_string}|#{obs_local_part})" no_ws_ctl = "\\x01-\\x08\\x11\\x12\\x14-\\x1f\\x7f" dtext = "[#{no_ws_ctl}\\x21-\\x5a\\x5e-\\x7e]" dcontent = "(?:#{dtext}|#{quoted_pair})" domain_literal = "\\[#{dcontent}+\\]" obs_domain = "#{atom}([.]#{atom})*" domain = "(?:#{dot_atom}|#{domain_literal}|#{obs_domain})" addr_spec = "#{local_part}\@#{domain}" pattern = /^#{addr_spec}$/ end end end end end end =begin addresses = [ '-- dave --@example.com', # (spaces are invalid unless enclosed in quotation marks) '[dave]@example.com', # (square brackets are invalid, unless contained within quotation marks) '.dave@example.com', # (the local part of a domain name cannot start with a period) 'Max@Job 3:14', 'Job@Book of Job', 'J. P. \'s-Gravezande, a.k.a. The Hacker!@example.com', ] addresses.each do |address| if address =~ RFC2822::EmailAddress puts "#{address} deveria ter sido rejeitado, ERRO" else puts "#{address} rejeitado, OK" end end addresses = [ '+1~1+@example.com', '{_dave_}@example.com', '"[[ dave ]]"@example.com', 'dave."dave"@example.com', 'test@localhost', 'test@example.com', 'test@example.co.uk', 'test@example.com.br', '"J. P. \'s-Gravezande, a.k.a. The Hacker!"@example.com', 'me@[187.223.45.119]', 'someone@123.com', 'simon&garfunkel@songs.com' ] addresses.each do |address| if address =~ RFC2822::EmailAddress puts "#{address} aceito, OK" else puts "#{address} deveria ser aceito, ERRO" end end =end