valid_email 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.rvmrc +1 -1
- data/README.md +23 -0
- data/Rakefile +1 -1
- data/config/locales/fi.yml +5 -0
- data/lib/valid_email/all.rb +1 -0
- data/lib/valid_email/all_with_extensions.rb +16 -0
- data/lib/valid_email/ban_disposable_email_validator.rb +11 -6
- data/lib/valid_email/email_validator.rb +2 -11
- data/lib/valid_email/mx_validator.rb +3 -15
- data/lib/valid_email/mx_with_fallback_validator.rb +7 -8
- data/lib/valid_email/validate_email.rb +67 -0
- data/lib/valid_email/version.rb +1 -1
- data/spec/extensions_validator_spec.rb +24 -0
- metadata +32 -17
- checksums.yaml +0 -7
data/.rvmrc
CHANGED
@@ -1 +1 @@
|
|
1
|
-
rvm use --create ruby-1.9.
|
1
|
+
rvm use --create ruby-1.9.3@email_validator
|
data/README.md
CHANGED
@@ -55,6 +55,29 @@ Or in your Gemfile
|
|
55
55
|
gem 'valid_email', :require => 'valid_email/email_validator'
|
56
56
|
|
57
57
|
|
58
|
+
### Usage outside of model validation
|
59
|
+
There is a chance that you want to use e-mail validator outside of model validation.
|
60
|
+
If that's the case, you can use the following methods:
|
61
|
+
|
62
|
+
```ruby
|
63
|
+
ValidateEmail.valid?('email@randommail.com') # You can optionally pass a hash of options, same as validator
|
64
|
+
ValidateEmail.mx_valid?('email@randommail.com')
|
65
|
+
ValidateEmail.mx_valid_with_fallback?('email@randommail.com')
|
66
|
+
ValidateEmail.valid?('email@randommail.com')
|
67
|
+
```
|
68
|
+
|
69
|
+
There is also a String and Nil class extension, if you require the gem in this way in Gemfile:
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
gem 'valid_email', require: ['valid_email/all_with_extensions']
|
73
|
+
```
|
74
|
+
|
75
|
+
You will be able to use the following methods:
|
76
|
+
```ruby
|
77
|
+
nil.email? # => false
|
78
|
+
"jhon@gmail.com".email? # => May return true if it exists. It accepts a hash of options like ValidateEmail.valid?
|
79
|
+
```
|
80
|
+
|
58
81
|
# Credits
|
59
82
|
|
60
83
|
* Dush dusanek[at]iquest.cz
|
data/Rakefile
CHANGED
data/lib/valid_email/all.rb
CHANGED
@@ -1,19 +1,24 @@
|
|
1
1
|
require 'active_model'
|
2
2
|
require 'active_model/validations'
|
3
3
|
require 'mail'
|
4
|
+
require 'valid_email/validate_email'
|
4
5
|
class BanDisposableEmailValidator < ActiveModel::EachValidator
|
5
6
|
# A list of disposable email domains
|
6
7
|
def self.config=(options)
|
7
8
|
@@config = options
|
8
9
|
end
|
9
10
|
|
11
|
+
# Required to use config outside
|
12
|
+
def self.config
|
13
|
+
@@config = [] unless defined? @@config
|
14
|
+
|
15
|
+
@@config
|
16
|
+
end
|
17
|
+
|
10
18
|
def validate_each(record, attribute, value)
|
11
|
-
|
12
|
-
m = Mail::Address.new(value)
|
13
|
-
r = !@@config.include?(m.domain) if m.domain
|
14
|
-
rescue Exception => e
|
15
|
-
r = false
|
16
|
-
end
|
19
|
+
r = ValidateEmail.ban_disposable_email?(value)
|
17
20
|
record.errors.add attribute, (options[:message] || I18n.t(:invalid, :scope => "valid_email.validations.email")) unless r
|
21
|
+
|
22
|
+
r
|
18
23
|
end
|
19
24
|
end
|
@@ -1,23 +1,14 @@
|
|
1
1
|
require 'active_model'
|
2
2
|
require 'active_model/validations'
|
3
3
|
require 'mail'
|
4
|
+
require 'valid_email/validate_email'
|
4
5
|
class EmailValidator < ActiveModel::EachValidator
|
5
6
|
def validate_each(record,attribute,value)
|
6
7
|
begin
|
7
8
|
return if options[:allow_nil] && value.nil?
|
8
9
|
return if options[:allow_blank] && value.blank?
|
9
10
|
|
10
|
-
|
11
|
-
# We must check that value contains a domain and that value is an email address
|
12
|
-
r = m.domain && m.address == value
|
13
|
-
t = m.__send__(:tree)
|
14
|
-
# We need to dig into treetop
|
15
|
-
# A valid domain must have dot_atom_text elements size > 1
|
16
|
-
# user@localhost is excluded
|
17
|
-
# treetop must respond to domain
|
18
|
-
# We exclude valid email values like <user@localhost.com>
|
19
|
-
# Hence we use m.__send__(tree).domain
|
20
|
-
r &&= (t.domain.dot_atom_text.elements.size > 1)
|
11
|
+
r = ValidateEmail.valid?(value)
|
21
12
|
# Check if domain has DNS MX record
|
22
13
|
if r && options[:mx]
|
23
14
|
require 'valid_email/mx_validator'
|
@@ -2,24 +2,12 @@ require 'active_model'
|
|
2
2
|
require 'active_model/validations'
|
3
3
|
require 'mail'
|
4
4
|
require 'resolv'
|
5
|
+
require 'valid_email/validate_email'
|
5
6
|
class MxValidator < ActiveModel::EachValidator
|
6
7
|
def validate_each(record,attribute,value)
|
7
|
-
|
8
|
-
m = Mail::Address.new(value)
|
9
|
-
if m.domain
|
10
|
-
r = valid_domain?(m.domain)
|
11
|
-
end
|
12
|
-
rescue Mail::Field::ParseError
|
13
|
-
#ignore this
|
14
|
-
end
|
8
|
+
r = ValidateEmail.mx_valid?(value)
|
15
9
|
record.errors.add attribute, (options[:message] || I18n.t(:invalid, :scope => "valid_email.validations.email")) unless r
|
16
|
-
end
|
17
10
|
|
18
|
-
|
19
|
-
mx = []
|
20
|
-
Resolv::DNS.open do |dns|
|
21
|
-
mx.concat dns.getresources(domain, Resolv::DNS::Resource::IN::MX)
|
22
|
-
end
|
23
|
-
mx.size > 0
|
11
|
+
r
|
24
12
|
end
|
25
13
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
require 'valid_email/mx_validator'
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
mx.size > 0
|
2
|
+
require 'valid_email/validate_email'
|
3
|
+
class MxWithFallbackValidator < ActiveModel::EachValidator
|
4
|
+
def validate_each(record,attribute,value)
|
5
|
+
r = ValidateEmail.mx_valid_with_fallback?(value)
|
6
|
+
record.errors.add attribute, (options[:message] || I18n.t(:invalid, :scope => "valid_email.validations.email")) unless r
|
7
|
+
|
8
|
+
r
|
10
9
|
end
|
11
10
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
class ValidateEmail
|
2
|
+
|
3
|
+
class << self
|
4
|
+
|
5
|
+
def valid?(value, user_options={})
|
6
|
+
options = { :mx => false, :message => nil }.merge!(user_options)
|
7
|
+
r = false
|
8
|
+
begin
|
9
|
+
m = Mail::Address.new(value)
|
10
|
+
# We must check that value contains a domain and that value is an email address
|
11
|
+
r = m.domain && m.address == value
|
12
|
+
t = m.__send__(:tree)
|
13
|
+
# We need to dig into treetop
|
14
|
+
# A valid domain must have dot_atom_text elements size > 1
|
15
|
+
# user@localhost is excluded
|
16
|
+
# treetop must respond to domain
|
17
|
+
# We exclude valid email values like <user@localhost.com>
|
18
|
+
# Hence we use m.__send__(tree).domain
|
19
|
+
r &&= (t.domain.dot_atom_text.elements.size > 1)
|
20
|
+
# Check if domain has DNS MX record
|
21
|
+
if r && options[:mx]
|
22
|
+
require 'valid_email/mx_validator'
|
23
|
+
r &&= mx_valid?(email)
|
24
|
+
end
|
25
|
+
rescue Exception => e
|
26
|
+
r = false
|
27
|
+
end
|
28
|
+
r
|
29
|
+
end
|
30
|
+
|
31
|
+
def mx_valid?(value, fallback=false)
|
32
|
+
r = false
|
33
|
+
begin
|
34
|
+
m = Mail::Address.new(value)
|
35
|
+
if m.domain
|
36
|
+
mx = []
|
37
|
+
Resolv::DNS.open do |dns|
|
38
|
+
mx.concat dns.getresources(m.domain, Resolv::DNS::Resource::IN::MX)
|
39
|
+
mx.concat dns.getresources(m.domain, Resolv::DNS::Resource::IN::A) if fallback
|
40
|
+
end
|
41
|
+
r = mx.size > 0
|
42
|
+
end
|
43
|
+
rescue Exception =>e
|
44
|
+
r = false
|
45
|
+
end
|
46
|
+
r
|
47
|
+
end
|
48
|
+
|
49
|
+
def mx_valid_with_fallback?(value)
|
50
|
+
mx_valid?(value, true)
|
51
|
+
end
|
52
|
+
|
53
|
+
def ban_disposable_email?(value)
|
54
|
+
r = false
|
55
|
+
begin
|
56
|
+
m = Mail::Address.new(value)
|
57
|
+
r = !BanDisposableEmailValidator.config.include?(m.domain) if m.domain
|
58
|
+
rescue Exception => e
|
59
|
+
r = false
|
60
|
+
end
|
61
|
+
|
62
|
+
r
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
data/lib/valid_email/version.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ValidEmailVersion = "0.0.
|
1
|
+
ValidEmailVersion = "0.0.6"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'valid_email/all_with_extensions'
|
3
|
+
|
4
|
+
describe String do
|
5
|
+
|
6
|
+
it { "mymail@gmail".should respond_to(:email?) }
|
7
|
+
|
8
|
+
it "is a valid e-mail" do
|
9
|
+
"mymail@gmail.com".email?.should be_true
|
10
|
+
end
|
11
|
+
|
12
|
+
it "is not valid when text is not a real e-mail" do
|
13
|
+
"invalidMail".email?.should be_false
|
14
|
+
end
|
15
|
+
|
16
|
+
context "when nil" do
|
17
|
+
|
18
|
+
it "is invalid e-mail" do
|
19
|
+
nil.email?.should be_false
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
metadata
CHANGED
@@ -1,69 +1,78 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: valid_email
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Ramihajamalala Hery
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2014-
|
12
|
+
date: 2014-08-02 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: rspec
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
|
-
- -
|
19
|
+
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: '0'
|
20
22
|
type: :development
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
|
-
- -
|
27
|
+
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '0'
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: rake
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
|
-
- -
|
35
|
+
- - ! '>='
|
32
36
|
- !ruby/object:Gem::Version
|
33
37
|
version: '0'
|
34
38
|
type: :development
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
|
-
- -
|
43
|
+
- - ! '>='
|
39
44
|
- !ruby/object:Gem::Version
|
40
45
|
version: '0'
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: mail
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
|
-
- -
|
51
|
+
- - ! '>='
|
46
52
|
- !ruby/object:Gem::Version
|
47
53
|
version: '0'
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
|
-
- -
|
59
|
+
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
54
61
|
version: '0'
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: activemodel
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
|
-
- -
|
67
|
+
- - ! '>='
|
60
68
|
- !ruby/object:Gem::Version
|
61
69
|
version: '0'
|
62
70
|
type: :runtime
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
|
-
- -
|
75
|
+
- - ! '>='
|
67
76
|
- !ruby/object:Gem::Version
|
68
77
|
version: '0'
|
69
78
|
description: ActiveModel Validation for email
|
@@ -73,49 +82,55 @@ executables: []
|
|
73
82
|
extensions: []
|
74
83
|
extra_rdoc_files: []
|
75
84
|
files:
|
76
|
-
-
|
77
|
-
-
|
85
|
+
- .gitignore
|
86
|
+
- .rvmrc
|
78
87
|
- Gemfile
|
79
88
|
- LICENSE
|
80
89
|
- README.md
|
81
90
|
- Rakefile
|
82
91
|
- config/locales/de.yml
|
83
92
|
- config/locales/en.yml
|
93
|
+
- config/locales/fi.yml
|
84
94
|
- config/locales/fr.yml
|
85
95
|
- config/valid_email.yml
|
86
96
|
- lib/valid_email.rb
|
87
97
|
- lib/valid_email/all.rb
|
98
|
+
- lib/valid_email/all_with_extensions.rb
|
88
99
|
- lib/valid_email/ban_disposable_email_validator.rb
|
89
100
|
- lib/valid_email/email_validator.rb
|
90
101
|
- lib/valid_email/mx_validator.rb
|
91
102
|
- lib/valid_email/mx_with_fallback_validator.rb
|
103
|
+
- lib/valid_email/validate_email.rb
|
92
104
|
- lib/valid_email/version.rb
|
93
105
|
- spec/email_validator_spec.rb
|
106
|
+
- spec/extensions_validator_spec.rb
|
94
107
|
- spec/spec_helper.rb
|
95
108
|
- valid_email.gemspec
|
96
109
|
homepage: http://my.rails-royce.org/2010/07/21/email-validation-in-ruby-on-rails-without-regexp
|
97
110
|
licenses: []
|
98
|
-
metadata: {}
|
99
111
|
post_install_message:
|
100
112
|
rdoc_options: []
|
101
113
|
require_paths:
|
102
114
|
- lib
|
103
115
|
required_ruby_version: !ruby/object:Gem::Requirement
|
116
|
+
none: false
|
104
117
|
requirements:
|
105
|
-
- -
|
118
|
+
- - ! '>='
|
106
119
|
- !ruby/object:Gem::Version
|
107
120
|
version: '0'
|
108
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
122
|
+
none: false
|
109
123
|
requirements:
|
110
|
-
- -
|
124
|
+
- - ! '>='
|
111
125
|
- !ruby/object:Gem::Version
|
112
126
|
version: '0'
|
113
127
|
requirements: []
|
114
128
|
rubyforge_project: valid_email
|
115
|
-
rubygems_version:
|
129
|
+
rubygems_version: 1.8.23.2
|
116
130
|
signing_key:
|
117
|
-
specification_version:
|
131
|
+
specification_version: 3
|
118
132
|
summary: ActiveModel Validation for email
|
119
133
|
test_files:
|
120
134
|
- spec/email_validator_spec.rb
|
135
|
+
- spec/extensions_validator_spec.rb
|
121
136
|
- spec/spec_helper.rb
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: 0837471ae7d6496eb96b6270bda8a0244dca52c1
|
4
|
-
data.tar.gz: 75c8181d2ec9d649306ea8c1a4d914192fab196b
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: bd6495a472174bdc871f7a42d867693a8c55e5986f8d65d3669fa4df8f6f2ad78bbcea6549dfb47e753461114eb215482e33c5fed29e2c3a5d974aea26169ac9
|
7
|
-
data.tar.gz: bf8813115c60c09de4c7fbd2d0d6bfacdce156ee564f3d6aaa16c50afd48f718a90a2739b5459a37aaf03762e3dea9a2253d596eaa6b19c586f134e47bb830d8
|