Pretty Reliable Email
=====================
Why?
Regexes are not enough sometimes. We should go all the way and fully parse the email and knock on the server's door to see if they really have a mailbox.
How?
Basics
require 'pre'
validator = Pre::Validator.new
validator.valid? "[email protected]"
With basic config
Pre by default has built in validators for RFC2822 and DNS MX record verification. Validators can be passed through the :validators
option.
require 'pre'
# validate with no domain validation
validator = Pre::Validator.new :validators => :format
validator.valid? "[email protected]" # => true
Advanced config
Pre can take blocks for custom validators
require 'pre'
no_gmail = lambda do |address|
address !~ /gmail.com$/
end
validator = Pre::Validator.new :validators => [:format, no_gmail]
validator.valid? "[email protected]" # => false
Pre can take any object that implements the valid? method
require 'pre'
class ComplexValidator
def valid? address
return true unless address =~ /gmail.com$/
# do not allow [email protected]
address !~ /\+.+@/
end
end
validator = Pre::Validator.new :validators => [:domain, ComplexValidator.new]
validator.valid? "[email protected]" # => false
Pre can also take alternate configuration for a single address
require 'pre'
validator = Pre::Validator.new :validators => :format
validator.valid? "[email protected]", :validators => lambda { |address|
address =~ /example.co.nz$/
} # => false
Caching
Certain strategies may be more "intense" than others. MX Record lookup and other expensive operations can benefit from providing Pre with a cache store. A cache store must respond to :write(key, val)
and :read(key)
methods. The cache abstraction layer provided by Rails' ActiveSupport::Cache::Store fits this interface.
require 'pre'
memcache = ActiveSupport::Cache::MemCacheStore.new("localhost", "server-downstairs.localnetwork:8229")
validator = Pre::Validator.new :cache_store => memcache
validator.valid? "[email protected]" # => true
Contributing
- Fork
- Make tests
- Make changes to lib
- Ensure tests pass on 1.8/1.9
- Submit request
- Smile
Roadmap
- ActiveModel, Mongoid::Document, etc.. integration
- DSL for configuring Pre validation configuration sets
Ack
The RFC treetop grammars are pulled from the fantastic mail gem.