truemail 2.3.0 → 2.4.0
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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +26 -3
- data/.codeclimate.yml +1 -1
- data/.reek.yml +9 -8
- data/.rubocop.yml +18 -0
- data/CHANGELOG.md +68 -6
- data/Gemfile.lock +31 -31
- data/README.md +118 -36
- data/bin/console +3 -10
- data/lib/truemail/configuration.rb +19 -24
- data/lib/truemail/core.rb +5 -2
- data/lib/truemail/log/serializer/base.rb +11 -2
- data/lib/truemail/log/serializer/validator_text.rb +3 -3
- data/lib/truemail/validate/mx_blacklist.rb +22 -0
- data/lib/truemail/validate/smtp.rb +1 -1
- data/lib/truemail/validator.rb +6 -2
- data/lib/truemail/version.rb +1 -1
- data/truemail.gemspec +11 -11
- metadata +30 -41
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 93c31449fbc6da2f25c4ded78c2a976e67f71e2b7112aac70db27bf6e1b75f20
|
|
4
|
+
data.tar.gz: 53599be276e8b72ff3f338c2991c7a10bbdd0c5876e506c40f0965e06941f8c8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fc0e3012563e61ee123486a4aa2b27e2b81da60668eccef8ed5d998ca82884f6365cc25c9cabe1cf6ef444eecc4663435b661b7de6b4100dcc5e83dbe65868cb
|
|
7
|
+
data.tar.gz: 4a27edc3f01d46eb948f172eeb95bcabe5f47a10eb770f8e0f2769454bb94fe8b30f55ec9a19f388592cf70cfd36f224343a879f02ab7b67c13db97b2a3329a2
|
data/.circleci/config.yml
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
version: 2.1
|
|
2
|
+
|
|
1
3
|
defaults: &defaults
|
|
2
4
|
working_directory: ~/truemail
|
|
3
5
|
docker:
|
|
@@ -5,6 +7,9 @@ defaults: &defaults
|
|
|
5
7
|
environment:
|
|
6
8
|
CC_TEST_REPORTER_ID: 693272a1328521f6f7c09d7ffd419b21c00410da26e98e94c687fdd38b26e2cb
|
|
7
9
|
|
|
10
|
+
orbs:
|
|
11
|
+
ruby: circleci/ruby@1.1.2
|
|
12
|
+
|
|
8
13
|
references:
|
|
9
14
|
restore_bundle_cache: &restore_bundle_cache
|
|
10
15
|
restore_cache:
|
|
@@ -29,7 +34,6 @@ references:
|
|
|
29
34
|
curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
|
|
30
35
|
chmod +x ./cc-test-reporter
|
|
31
36
|
|
|
32
|
-
version: 2
|
|
33
37
|
jobs:
|
|
34
38
|
linters:
|
|
35
39
|
<<: *defaults
|
|
@@ -81,9 +85,28 @@ jobs:
|
|
|
81
85
|
command: |
|
|
82
86
|
./cc-test-reporter sum-coverage --output - --parts $CIRCLE_NODE_TOTAL coverage/codeclimate.*.json | ./cc-test-reporter upload-coverage --debug --input -
|
|
83
87
|
|
|
88
|
+
compatibility-with-ruby:
|
|
89
|
+
parameters:
|
|
90
|
+
ruby-version:
|
|
91
|
+
type: string
|
|
92
|
+
docker:
|
|
93
|
+
- image: cimg/ruby:<< parameters.ruby-version >>
|
|
94
|
+
steps:
|
|
95
|
+
- checkout
|
|
96
|
+
- ruby/install-deps:
|
|
97
|
+
bundler-version: '1.16.6'
|
|
98
|
+
with-cache: false
|
|
99
|
+
path: './vendor/custom_bundle'
|
|
100
|
+
- run:
|
|
101
|
+
name: Running compatibility tests
|
|
102
|
+
command: bundle exec rspec
|
|
103
|
+
|
|
84
104
|
workflows:
|
|
85
|
-
|
|
86
|
-
build:
|
|
105
|
+
build_and_test:
|
|
87
106
|
jobs:
|
|
88
107
|
- linters
|
|
89
108
|
- tests
|
|
109
|
+
- compatibility-with-ruby:
|
|
110
|
+
matrix:
|
|
111
|
+
parameters:
|
|
112
|
+
ruby-version: ["2.6", "2.7", "3.0"]
|
data/.codeclimate.yml
CHANGED
data/.reek.yml
CHANGED
|
@@ -34,18 +34,19 @@ detectors:
|
|
|
34
34
|
|
|
35
35
|
UtilityFunction:
|
|
36
36
|
exclude:
|
|
37
|
-
- Truemail::Validate::Smtp::Request#compose_from
|
|
38
|
-
- Truemail::Validator#select_validation_type
|
|
39
|
-
- Truemail::Validate::Base#configuration
|
|
40
|
-
- Truemail::Validate::Mx#null_mx?
|
|
41
|
-
- Truemail::Validate::Mx#a_record
|
|
42
37
|
- Truemail::Audit::Base#verifier_domain
|
|
43
|
-
- Truemail::Configuration#domain_matcher
|
|
44
38
|
- Truemail::Configuration#logger_options
|
|
39
|
+
- Truemail::Configuration#match_regex?
|
|
40
|
+
- Truemail::Configuration#regex_by_method
|
|
41
|
+
- Truemail::Dns::Worker#nameserver_port
|
|
45
42
|
- Truemail::Log::Serializer::Base#errors
|
|
46
43
|
- Truemail::Log::Serializer::ValidatorBase#replace_invalid_chars
|
|
47
|
-
- Truemail::
|
|
48
|
-
- Truemail::
|
|
44
|
+
- Truemail::Validator#select_validation_type
|
|
45
|
+
- Truemail::Validator#constantize
|
|
46
|
+
- Truemail::Validate::Base#configuration
|
|
47
|
+
- Truemail::Validate::Mx#null_mx?
|
|
48
|
+
- Truemail::Validate::Mx#a_record
|
|
49
|
+
- Truemail::Validate::Smtp::Request#compose_from
|
|
49
50
|
|
|
50
51
|
ControlParameter:
|
|
51
52
|
exclude:
|
data/.rubocop.yml
CHANGED
|
@@ -148,6 +148,12 @@ Style/EndlessMethod:
|
|
|
148
148
|
Style/IfWithBooleanLiteralBranches:
|
|
149
149
|
Enabled: true
|
|
150
150
|
|
|
151
|
+
Style/HashConversion:
|
|
152
|
+
Enabled: true
|
|
153
|
+
|
|
154
|
+
Style/StringChars:
|
|
155
|
+
Enabled: true
|
|
156
|
+
|
|
151
157
|
Layout/LineLength:
|
|
152
158
|
Max: 140
|
|
153
159
|
|
|
@@ -302,6 +308,9 @@ Lint/SymbolConversion:
|
|
|
302
308
|
Lint/TripleQuotes:
|
|
303
309
|
Enabled: true
|
|
304
310
|
|
|
311
|
+
Gemspec/DateAssignment:
|
|
312
|
+
Enabled: true
|
|
313
|
+
|
|
305
314
|
Performance/AncestorsInclude:
|
|
306
315
|
Enabled: true
|
|
307
316
|
|
|
@@ -341,6 +350,15 @@ Performance/ConstantRegexp:
|
|
|
341
350
|
Performance/MethodObjectAsBlock:
|
|
342
351
|
Enabled: true
|
|
343
352
|
|
|
353
|
+
Performance/RedundantEqualityComparisonBlock:
|
|
354
|
+
Enabled: true
|
|
355
|
+
|
|
356
|
+
Performance/RedundantSplitRegexpArgument:
|
|
357
|
+
Enabled: true
|
|
358
|
+
|
|
359
|
+
Performance/MapCompact:
|
|
360
|
+
Enabled: true
|
|
361
|
+
|
|
344
362
|
RSpec/ExampleLength:
|
|
345
363
|
Enabled: false
|
|
346
364
|
|
data/CHANGELOG.md
CHANGED
|
@@ -2,7 +2,69 @@
|
|
|
2
2
|
|
|
3
3
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
4
|
|
|
5
|
-
## [2.
|
|
5
|
+
## [2.4.0] - 2021.04.28
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Implemented `MxBlacklist` validation. This layer provides checking mail servers with predefined blacklisted IP addresses list and can be used as a part of DEA ([disposable email address](https://en.wikipedia.org/wiki/Disposable_email_address)) validations.
|
|
10
|
+
|
|
11
|
+
```ruby
|
|
12
|
+
Truemail.configure do |config|
|
|
13
|
+
# Optional parameter. With this option Truemail will filter out unwanted mx servers via
|
|
14
|
+
# predefined list of ip addresses. It can be used as a part of DEA (disposable email
|
|
15
|
+
# address) validations. It is equal to empty array by default.
|
|
16
|
+
config.blacklisted_mx_ip_addresses = ['1.1.1.1', '2.2.2.2']
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
- Added `Truemail::Validate::MxBlacklist`, tests
|
|
22
|
+
|
|
23
|
+
### Changed
|
|
24
|
+
|
|
25
|
+
- Updated `Truemail::Core`, tests
|
|
26
|
+
- Updated `Truemail::Configuration`, tests
|
|
27
|
+
- Updated `Truemail::Validator`
|
|
28
|
+
- Updated `Truemail::Validate::Smtp`, tests
|
|
29
|
+
- Updated `Truemail::Log::Serializer::Base`, dependent tests
|
|
30
|
+
- Updated `Truemail::Log::Serializer::ValidatorText`, tests
|
|
31
|
+
- Updated gem development dependencies
|
|
32
|
+
- Updated gem documentation, changelog, version
|
|
33
|
+
|
|
34
|
+
## [2.3.4] - 2021.04.16
|
|
35
|
+
|
|
36
|
+
### Fixed
|
|
37
|
+
|
|
38
|
+
Fixed bug with impossibility to use valid dns port number. Now validation for dns port for range `1..65535` works as expected.
|
|
39
|
+
|
|
40
|
+
- Updated `Truemail::RegexConstant::REGEX_PORT_NUMBER`, tests
|
|
41
|
+
- Updated gem documentation
|
|
42
|
+
- CircleCI config moved to `.circleci/config.yml`
|
|
43
|
+
|
|
44
|
+
## [2.3.3] - 2021.04.14
|
|
45
|
+
|
|
46
|
+
### Changed
|
|
47
|
+
|
|
48
|
+
- Updated gem development dependencies
|
|
49
|
+
- Updated rubocop/codeclimate config
|
|
50
|
+
- Updated CircleCI config
|
|
51
|
+
|
|
52
|
+
## [2.3.2] - 2021.03.08
|
|
53
|
+
|
|
54
|
+
### Changed
|
|
55
|
+
|
|
56
|
+
- Updated gem development dependencies
|
|
57
|
+
- Updated rubocop/codeclimate config
|
|
58
|
+
|
|
59
|
+
## [2.3.1] - 2021.02.26
|
|
60
|
+
|
|
61
|
+
### Changed
|
|
62
|
+
|
|
63
|
+
- Updated gem development dependencies
|
|
64
|
+
- Updated rubocop/codeclimate config
|
|
65
|
+
- Updated tests
|
|
66
|
+
|
|
67
|
+
## [2.3.0] - 2021.02.05
|
|
6
68
|
|
|
7
69
|
### Added
|
|
8
70
|
|
|
@@ -10,10 +72,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
|
10
72
|
|
|
11
73
|
```ruby
|
|
12
74
|
Truemail.configure do |config|
|
|
13
|
-
# Optional parameter. This option will provide to use custom DNS gateway when Truemail
|
|
14
|
-
# with DNS. If you won't specify nameserver's ports
|
|
15
|
-
# TCP/UDP port 53. By default Truemail uses DNS gateway from system settings
|
|
16
|
-
# is equal to empty array.
|
|
75
|
+
# Optional parameter. This option will provide to use custom DNS gateway when Truemail
|
|
76
|
+
# interacts with DNS. If you won't specify nameserver's ports Truemail will use default
|
|
77
|
+
# DNS TCP/UDP port 53. By default Truemail uses DNS gateway from system settings
|
|
78
|
+
# and this option is equal to empty array.
|
|
17
79
|
config.dns = ['10.0.0.1', '10.0.0.2:5300']
|
|
18
80
|
end
|
|
19
81
|
```
|
|
@@ -35,7 +97,7 @@ end
|
|
|
35
97
|
- Updated gem runtime/development dependencies
|
|
36
98
|
- Updated gem documentation, changelog, version
|
|
37
99
|
|
|
38
|
-
## [2.2.3] -
|
|
100
|
+
## [2.2.3] - 2021.01.12
|
|
39
101
|
|
|
40
102
|
### Fixed
|
|
41
103
|
|
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
truemail (2.
|
|
4
|
+
truemail (2.4.0)
|
|
5
5
|
simpleidn (~> 0.2.1)
|
|
6
6
|
|
|
7
7
|
GEM
|
|
@@ -10,9 +10,9 @@ GEM
|
|
|
10
10
|
addressable (2.7.0)
|
|
11
11
|
public_suffix (>= 2.0.2, < 5.0)
|
|
12
12
|
ast (2.4.2)
|
|
13
|
-
bundler-audit (0.
|
|
13
|
+
bundler-audit (0.8.0)
|
|
14
14
|
bundler (>= 1.2.0, < 3)
|
|
15
|
-
thor (
|
|
15
|
+
thor (~> 1.0)
|
|
16
16
|
byebug (11.1.3)
|
|
17
17
|
childprocess (4.0.0)
|
|
18
18
|
coderay (1.1.3)
|
|
@@ -21,28 +21,28 @@ GEM
|
|
|
21
21
|
crack (0.4.5)
|
|
22
22
|
rexml
|
|
23
23
|
diff-lcs (1.4.4)
|
|
24
|
-
dns_mock (1.2.
|
|
24
|
+
dns_mock (1.2.1)
|
|
25
25
|
docile (1.3.5)
|
|
26
|
-
faker (2.
|
|
26
|
+
faker (2.17.0)
|
|
27
27
|
i18n (>= 1.6, < 2)
|
|
28
|
-
fasterer (0.
|
|
28
|
+
fasterer (0.9.0)
|
|
29
29
|
colorize (~> 0.7)
|
|
30
30
|
ruby_parser (>= 3.14.1)
|
|
31
31
|
hashdiff (1.0.1)
|
|
32
|
-
i18n (1.8.
|
|
32
|
+
i18n (1.8.10)
|
|
33
33
|
concurrent-ruby (~> 1.0)
|
|
34
34
|
iniparse (1.5.0)
|
|
35
35
|
json (2.5.1)
|
|
36
36
|
json_matchers (0.11.1)
|
|
37
37
|
json_schema
|
|
38
|
-
json_schema (0.
|
|
38
|
+
json_schema (0.21.0)
|
|
39
39
|
kwalify (0.7.2)
|
|
40
40
|
method_source (1.0.0)
|
|
41
41
|
overcommit (0.57.0)
|
|
42
42
|
childprocess (>= 0.6.3, < 5)
|
|
43
43
|
iniparse (~> 1.4)
|
|
44
44
|
parallel (1.20.1)
|
|
45
|
-
parser (3.0.
|
|
45
|
+
parser (3.0.1.0)
|
|
46
46
|
ast (~> 2.4.1)
|
|
47
47
|
pry (0.13.1)
|
|
48
48
|
coderay (~> 1.1)
|
|
@@ -50,17 +50,17 @@ GEM
|
|
|
50
50
|
pry-byebug (3.9.0)
|
|
51
51
|
byebug (~> 11.0)
|
|
52
52
|
pry (~> 0.13.0)
|
|
53
|
-
psych (3.3.
|
|
53
|
+
psych (3.3.1)
|
|
54
54
|
public_suffix (4.0.6)
|
|
55
55
|
rainbow (3.0.0)
|
|
56
56
|
rake (13.0.3)
|
|
57
|
-
reek (6.0.
|
|
57
|
+
reek (6.0.4)
|
|
58
58
|
kwalify (~> 0.7.0)
|
|
59
59
|
parser (~> 3.0.0)
|
|
60
60
|
psych (~> 3.1)
|
|
61
61
|
rainbow (>= 2.0, < 4.0)
|
|
62
|
-
regexp_parser (2.
|
|
63
|
-
rexml (3.2.
|
|
62
|
+
regexp_parser (2.1.1)
|
|
63
|
+
rexml (3.2.5)
|
|
64
64
|
rspec (3.10.0)
|
|
65
65
|
rspec-core (~> 3.10.0)
|
|
66
66
|
rspec-expectations (~> 3.10.0)
|
|
@@ -74,7 +74,7 @@ GEM
|
|
|
74
74
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
75
75
|
rspec-support (~> 3.10.0)
|
|
76
76
|
rspec-support (3.10.2)
|
|
77
|
-
rubocop (1.
|
|
77
|
+
rubocop (1.13.0)
|
|
78
78
|
parallel (~> 1.10)
|
|
79
79
|
parser (>= 3.0.0.0)
|
|
80
80
|
rainbow (>= 2.2.2, < 4.0)
|
|
@@ -85,10 +85,10 @@ GEM
|
|
|
85
85
|
unicode-display_width (>= 1.4.0, < 3.0)
|
|
86
86
|
rubocop-ast (1.4.1)
|
|
87
87
|
parser (>= 2.7.1.5)
|
|
88
|
-
rubocop-performance (1.
|
|
89
|
-
rubocop (>=
|
|
88
|
+
rubocop-performance (1.11.0)
|
|
89
|
+
rubocop (>= 1.7.0, < 2.0)
|
|
90
90
|
rubocop-ast (>= 0.4.0)
|
|
91
|
-
rubocop-rspec (2.
|
|
91
|
+
rubocop-rspec (2.3.0)
|
|
92
92
|
rubocop (~> 1.0)
|
|
93
93
|
rubocop-ast (>= 1.1.0)
|
|
94
94
|
ruby-progressbar (1.11.0)
|
|
@@ -103,15 +103,15 @@ GEM
|
|
|
103
103
|
simpleidn (0.2.1)
|
|
104
104
|
unf (~> 0.1.4)
|
|
105
105
|
thor (1.1.0)
|
|
106
|
-
truemail-rspec (0.
|
|
107
|
-
faker (~> 2.
|
|
106
|
+
truemail-rspec (0.4.0)
|
|
107
|
+
faker (~> 2.16)
|
|
108
108
|
rspec (~> 3.10)
|
|
109
|
-
truemail (
|
|
109
|
+
truemail (>= 2.3)
|
|
110
110
|
unf (0.1.4)
|
|
111
111
|
unf_ext
|
|
112
112
|
unf_ext (0.0.7.7)
|
|
113
113
|
unicode-display_width (2.0.0)
|
|
114
|
-
webmock (3.
|
|
114
|
+
webmock (3.12.2)
|
|
115
115
|
addressable (>= 2.3.6)
|
|
116
116
|
crack (>= 0.3.2)
|
|
117
117
|
hashdiff (>= 0.4.0, < 2.0.0)
|
|
@@ -121,23 +121,23 @@ PLATFORMS
|
|
|
121
121
|
|
|
122
122
|
DEPENDENCIES
|
|
123
123
|
bundler (~> 1.16)
|
|
124
|
-
bundler-audit (~> 0.
|
|
125
|
-
dns_mock (~> 1.2)
|
|
126
|
-
faker (~> 2.
|
|
127
|
-
fasterer (~> 0.
|
|
124
|
+
bundler-audit (~> 0.8.0)
|
|
125
|
+
dns_mock (~> 1.2, >= 1.2.1)
|
|
126
|
+
faker (~> 2.17)
|
|
127
|
+
fasterer (~> 0.9.0)
|
|
128
128
|
json_matchers (~> 0.11.1)
|
|
129
129
|
overcommit (~> 0.57.0)
|
|
130
130
|
pry-byebug (~> 3.9)
|
|
131
131
|
rake (~> 13.0, >= 13.0.3)
|
|
132
|
-
reek (~> 6.0, >= 6.0.
|
|
132
|
+
reek (~> 6.0, >= 6.0.4)
|
|
133
133
|
rspec (~> 3.10)
|
|
134
|
-
rubocop (~> 1.
|
|
135
|
-
rubocop-performance (~> 1.
|
|
136
|
-
rubocop-rspec (~> 2.
|
|
134
|
+
rubocop (~> 1.13)
|
|
135
|
+
rubocop-performance (~> 1.11)
|
|
136
|
+
rubocop-rspec (~> 2.3)
|
|
137
137
|
simplecov (~> 0.17.1)
|
|
138
138
|
truemail!
|
|
139
|
-
truemail-rspec (~> 0.
|
|
140
|
-
webmock (~> 3.
|
|
139
|
+
truemail-rspec (~> 0.4)
|
|
140
|
+
webmock (~> 3.12, >= 3.12.2)
|
|
141
141
|
|
|
142
142
|
BUNDLED WITH
|
|
143
143
|
1.16.6
|
data/README.md
CHANGED
|
@@ -39,6 +39,7 @@ Configurable framework agnostic plain Ruby email validator. Verify email via Reg
|
|
|
39
39
|
- [DNS (MX) validation](#mx-validation)
|
|
40
40
|
- [RFC MX lookup flow](#rfc-mx-lookup-flow)
|
|
41
41
|
- [Not RFC MX lookup flow](#not-rfc-mx-lookup-flow)
|
|
42
|
+
- [MX blacklist validation](#mx-blacklist-validation)
|
|
42
43
|
- [SMTP validation](#smtp-validation)
|
|
43
44
|
- [SMTP fail fast enabled](#smtp-fail-fast-enabled)
|
|
44
45
|
- [SMTP safe check disabled](#smtp-safe-check-disabled)
|
|
@@ -132,6 +133,7 @@ You can use global gem configuration or custom independent configuration. Availa
|
|
|
132
133
|
- whitelisted domains
|
|
133
134
|
- whitelist validation
|
|
134
135
|
- blacklisted domains
|
|
136
|
+
- blacklisted mx ip-addresses
|
|
135
137
|
- custom DNS gateway(s)
|
|
136
138
|
- RFC MX lookup flow
|
|
137
139
|
- SMTP fail fast
|
|
@@ -200,12 +202,17 @@ Truemail.configure do |config|
|
|
|
200
202
|
# Optional parameter. Validation of email which contains blacklisted domain always will
|
|
201
203
|
# return false. Other validations will not processed even if it was defined in validation_type_for
|
|
202
204
|
# It is equal to empty array by default.
|
|
203
|
-
config.blacklisted_domains = ['
|
|
205
|
+
config.blacklisted_domains = ['somedomain3.com', 'somedomain4.com']
|
|
204
206
|
|
|
205
|
-
# Optional parameter.
|
|
206
|
-
#
|
|
207
|
-
#
|
|
208
|
-
|
|
207
|
+
# Optional parameter. With this option Truemail will filter out unwanted mx servers via
|
|
208
|
+
# predefined list of ip addresses. It can be used as a part of DEA (disposable email
|
|
209
|
+
# address) validations. It is equal to empty array by default.
|
|
210
|
+
config.blacklisted_mx_ip_addresses = ['1.1.1.1', '2.2.2.2']
|
|
211
|
+
|
|
212
|
+
# Optional parameter. This option will provide to use custom DNS gateway when Truemail
|
|
213
|
+
# interacts with DNS. Valid port numbers are in the range 1-65535. If you won't specify
|
|
214
|
+
# nameserver's ports Truemail will use default DNS TCP/UDP port 53. By default Truemail
|
|
215
|
+
# uses DNS gateway from system settings and this option is equal to empty array.
|
|
209
216
|
config.dns = ['10.0.0.1', '10.0.0.2:54']
|
|
210
217
|
|
|
211
218
|
# Optional parameter. This option will provide to use not RFC MX lookup flow.
|
|
@@ -245,11 +252,13 @@ Truemail.configuration
|
|
|
245
252
|
@smtp_error_body_pattern=/regex_pattern/,
|
|
246
253
|
@response_timeout=1,
|
|
247
254
|
@connection_attempts=3,
|
|
248
|
-
@
|
|
249
|
-
@
|
|
255
|
+
@default_validation_type=:mx,
|
|
256
|
+
@validation_type_by_domain={"somedomain.com" => :regex, "otherdomain.com" => :mx},
|
|
257
|
+
@whitelisted_domains=["somedomain1.com", "somedomain2.com"],
|
|
250
258
|
@whitelist_validation=true,
|
|
251
|
-
@blacklisted_domains=[],
|
|
252
|
-
@
|
|
259
|
+
@blacklisted_domains=["somedomain3.com", "somedomain4.com"],
|
|
260
|
+
@blacklisted_mx_ip_addresses=["1.1.1.1", "2.2.2.2"],
|
|
261
|
+
@dns=["10.0.0.1", "10.0.0.2:54"],
|
|
253
262
|
@verifier_domain="somedomain.com",
|
|
254
263
|
@verifier_email="verifier@example.com",
|
|
255
264
|
@not_rfc_mx_lookup_flow=true,
|
|
@@ -276,11 +285,13 @@ Truemail.configuration
|
|
|
276
285
|
@smtp_error_body_pattern=/regex_pattern/,
|
|
277
286
|
@response_timeout=4,
|
|
278
287
|
@connection_attempts=1,
|
|
279
|
-
@
|
|
280
|
-
@
|
|
288
|
+
@default_validation_type=:mx,
|
|
289
|
+
@validation_type_by_domain={"somedomain.com" => :regex, "otherdomain.com" => :mx},
|
|
290
|
+
@whitelisted_domains=["somedomain1.com", "somedomain2.com"],
|
|
281
291
|
@whitelist_validation=true,
|
|
282
|
-
@blacklisted_domains=[],
|
|
283
|
-
@
|
|
292
|
+
@blacklisted_domains=["somedomain3.com", "somedomain4.com"],
|
|
293
|
+
@blacklisted_mx_ip_addresses=["1.1.1.1", "2.2.2.2"],
|
|
294
|
+
@dns=["10.0.0.1", "10.0.0.2:54"],
|
|
284
295
|
@verifier_domain="somedomain.com",
|
|
285
296
|
@verifier_email="verifier@example.com",
|
|
286
297
|
@not_rfc_mx_lookup_flow=true,
|
|
@@ -361,6 +372,7 @@ Truemail.validate('email@white-domain.com')
|
|
|
361
372
|
smtp_debug=nil>,
|
|
362
373
|
configuration=#<Truemail::Configuration:0x00005629f801bd28
|
|
363
374
|
@blacklisted_domains=["black-domain.com", "somedomain.com"],
|
|
375
|
+
@blacklisted_mx_ip_addresses=[],
|
|
364
376
|
@dns=[],
|
|
365
377
|
@connection_attempts=2,
|
|
366
378
|
@connection_timeout=2,
|
|
@@ -409,6 +421,7 @@ Truemail.validate('email@white-domain.com', with: :regex)
|
|
|
409
421
|
configuration=
|
|
410
422
|
#<Truemail::Configuration:0x0000563f0d2605c8
|
|
411
423
|
@blacklisted_domains=[],
|
|
424
|
+
@blacklisted_mx_ip_addresses=[],
|
|
412
425
|
@dns=[],
|
|
413
426
|
@connection_attempts=2,
|
|
414
427
|
@connection_timeout=2,
|
|
@@ -443,6 +456,7 @@ Truemail.validate('email@domain.com', with: :regex)
|
|
|
443
456
|
configuration=
|
|
444
457
|
#<Truemail::Configuration:0x0000563f0cd82ab0
|
|
445
458
|
@blacklisted_domains=[],
|
|
459
|
+
@blacklisted_mx_ip_addresses=[],
|
|
446
460
|
@dns=[],
|
|
447
461
|
@connection_attempts=2,
|
|
448
462
|
@connection_timeout=2,
|
|
@@ -463,7 +477,7 @@ Truemail.validate('email@domain.com', with: :regex)
|
|
|
463
477
|
|
|
464
478
|
##### Blacklist case
|
|
465
479
|
|
|
466
|
-
When email in blacklist, validation type will be redefined too. Validation result returns
|
|
480
|
+
When email in blacklist, validation type will be redefined too. Validation result returns `false`
|
|
467
481
|
|
|
468
482
|
```ruby
|
|
469
483
|
Truemail.validate('email@black-domain.com')
|
|
@@ -479,6 +493,7 @@ Truemail.validate('email@black-domain.com')
|
|
|
479
493
|
configuration=
|
|
480
494
|
#<Truemail::Configuration:0x0000563f0d36f4f0
|
|
481
495
|
@blacklisted_domains=[],
|
|
496
|
+
@blacklisted_mx_ip_addresses=[],
|
|
482
497
|
@dns=[],
|
|
483
498
|
@connection_attempts=2,
|
|
484
499
|
@connection_timeout=2,
|
|
@@ -515,6 +530,7 @@ Truemail.validate('email@somedomain.com')
|
|
|
515
530
|
configuration=
|
|
516
531
|
#<Truemail::Configuration:0x0000563f0d3f8fc0
|
|
517
532
|
@blacklisted_domains=[],
|
|
533
|
+
@blacklisted_mx_ip_addresses=[],
|
|
518
534
|
@dns=[],
|
|
519
535
|
@connection_attempts=2,
|
|
520
536
|
@connection_timeout=2,
|
|
@@ -567,6 +583,7 @@ Truemail.validate('email@example.com', with: :regex)
|
|
|
567
583
|
configuration=
|
|
568
584
|
#<Truemail::Configuration:0x000055aa56a54d48
|
|
569
585
|
@blacklisted_domains=[],
|
|
586
|
+
@blacklisted_mx_ip_addresses=[],
|
|
570
587
|
@dns=[],
|
|
571
588
|
@connection_attempts=2,
|
|
572
589
|
@connection_timeout=2,
|
|
@@ -611,6 +628,7 @@ Truemail.validate('email@example.com', with: :regex)
|
|
|
611
628
|
configuration=
|
|
612
629
|
#<Truemail::Configuration:0x0000560e58d80830
|
|
613
630
|
@blacklisted_domains=[],
|
|
631
|
+
@blacklisted_mx_ip_addresses=[],
|
|
614
632
|
@dns=[],
|
|
615
633
|
@connection_attempts=2,
|
|
616
634
|
@connection_timeout=2,
|
|
@@ -666,6 +684,7 @@ Truemail.validate('email@example.com', with: :mx)
|
|
|
666
684
|
configuration=
|
|
667
685
|
#<Truemail::Configuration:0x0000559b6e44af70
|
|
668
686
|
@blacklisted_domains=[],
|
|
687
|
+
@blacklisted_mx_ip_addresses=[],
|
|
669
688
|
@dns=[],
|
|
670
689
|
@connection_attempts=2,
|
|
671
690
|
@connection_timeout=2,
|
|
@@ -712,6 +731,7 @@ Truemail.validate('email@example.com', with: :mx)
|
|
|
712
731
|
configuration=
|
|
713
732
|
#<Truemail::Configuration:0x0000559b6e44af70
|
|
714
733
|
@blacklisted_domains=[],
|
|
734
|
+
@blacklisted_mx_ip_addresses=[],
|
|
715
735
|
@dns=[],
|
|
716
736
|
@connection_attempts=2,
|
|
717
737
|
@connection_timeout=2,
|
|
@@ -730,12 +750,63 @@ Truemail.validate('email@example.com', with: :mx)
|
|
|
730
750
|
@validation_type=:mx>
|
|
731
751
|
```
|
|
732
752
|
|
|
753
|
+
#### MX blacklist validation
|
|
754
|
+
|
|
755
|
+
MX blacklist validation is the third validation level. This layer provides checking extracted mail server(s) IP address from MX validation with predefined blacklisted IP addresses list. It can be used as a part of DEA ([disposable email address](https://en.wikipedia.org/wiki/Disposable_email_address)) validations.
|
|
756
|
+
|
|
757
|
+
```code
|
|
758
|
+
[Whitelist/Blacklist] -> [Regex validation] -> [MX validation] -> [MX blacklist validation]
|
|
759
|
+
```
|
|
760
|
+
|
|
761
|
+
Example of usage:
|
|
762
|
+
|
|
763
|
+
```ruby
|
|
764
|
+
require 'truemail'
|
|
765
|
+
|
|
766
|
+
Truemail.configure do |config|
|
|
767
|
+
config.verifier_email = 'verifier@example.com'
|
|
768
|
+
config.blacklisted_mx_ip_addresses = ['127.0.1.2']
|
|
769
|
+
end
|
|
770
|
+
|
|
771
|
+
Truemail.validate('email@example.com', with: :mx_blacklist)
|
|
772
|
+
|
|
773
|
+
=> #<Truemail::Validator:0x00007fca0c8aea70
|
|
774
|
+
@result=
|
|
775
|
+
#<struct Truemail::Validator::Result
|
|
776
|
+
success=false,
|
|
777
|
+
email="email@example.com",
|
|
778
|
+
domain="example.com",
|
|
779
|
+
mail_servers=["127.0.1.1", "127.0.1.2"],
|
|
780
|
+
errors={:mx_blacklist=>"blacklisted mx server ip address"},
|
|
781
|
+
smtp_debug=nil,
|
|
782
|
+
configuration=
|
|
783
|
+
#<Truemail::Configuration:0x00007fca0c8aeb38
|
|
784
|
+
@blacklisted_domains=[],
|
|
785
|
+
@blacklisted_mx_ip_addresses=["127.0.1.2"],
|
|
786
|
+
@connection_attempts=2,
|
|
787
|
+
@connection_timeout=2,
|
|
788
|
+
@default_validation_type=:smtp,
|
|
789
|
+
@dns=[],
|
|
790
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([\p{L}0-9]+[\w|\-.+]*)@((?i-mx:[\p{L}0-9]+([\-.]{1}[\p{L}0-9]+)*\.\p{L}{2,63}))\z)/,
|
|
791
|
+
@not_rfc_mx_lookup_flow=false,
|
|
792
|
+
@response_timeout=2,
|
|
793
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
|
794
|
+
@smtp_fail_fast=false,
|
|
795
|
+
@smtp_safe_check=false,
|
|
796
|
+
@validation_type_by_domain={},
|
|
797
|
+
@verifier_domain="example.com",
|
|
798
|
+
@verifier_email="verifier@example.com",
|
|
799
|
+
@whitelist_validation=false,
|
|
800
|
+
@whitelisted_domains=[]>>,
|
|
801
|
+
@validation_type=:mx_blacklist>
|
|
802
|
+
```
|
|
803
|
+
|
|
733
804
|
#### SMTP validation
|
|
734
805
|
|
|
735
|
-
SMTP validation is a final,
|
|
806
|
+
SMTP validation is a final, fourth validation level. This type of validation tries to check real existence of email account on a current email server. This validation runs a chain of previous validations and if they're complete successfully then runs itself.
|
|
736
807
|
|
|
737
808
|
```code
|
|
738
|
-
[Whitelist/Blacklist] -> [Regex validation] -> [MX validation] -> [SMTP validation]
|
|
809
|
+
[Whitelist/Blacklist] -> [Regex validation] -> [MX validation] -> [MX blacklist validation] -> [SMTP validation]
|
|
739
810
|
```
|
|
740
811
|
|
|
741
812
|
If total count of MX servers is equal to one, `Truemail::Smtp` validator will use value from `Truemail.configuration.connection_attempts` as connection attempts. By default it's equal `2`.
|
|
@@ -787,6 +858,7 @@ Truemail.validate('email@example.com')
|
|
|
787
858
|
configuration=
|
|
788
859
|
#<Truemail::Configuration:0x00007fdc4504f5c8
|
|
789
860
|
@blacklisted_domains=[],
|
|
861
|
+
@blacklisted_mx_ip_addresses=[],
|
|
790
862
|
@dns=[],
|
|
791
863
|
@connection_attempts=2,
|
|
792
864
|
@connection_timeout=2,
|
|
@@ -831,6 +903,7 @@ Truemail.validate('email@example.com')
|
|
|
831
903
|
configuration=
|
|
832
904
|
#<Truemail::Configuration:0x00005615e87b9298
|
|
833
905
|
@blacklisted_domains=[],
|
|
906
|
+
@blacklisted_mx_ip_addresses=[],
|
|
834
907
|
@dns=[],
|
|
835
908
|
@connection_attempts=2,
|
|
836
909
|
@connection_timeout=2,
|
|
@@ -882,6 +955,7 @@ Truemail.validate('email@example.com')
|
|
|
882
955
|
configuration=
|
|
883
956
|
#<Truemail::Configuration:0x00005615e87b9298
|
|
884
957
|
@blacklisted_domains=[],
|
|
958
|
+
@blacklisted_mx_ip_addresses=[],
|
|
885
959
|
@dns=[],
|
|
886
960
|
@connection_attempts=2,
|
|
887
961
|
@connection_timeout=2,
|
|
@@ -945,6 +1019,7 @@ Truemail.validate('email@example.com')
|
|
|
945
1019
|
configuration=
|
|
946
1020
|
#<Truemail::Configuration:0x00005615e87b9298
|
|
947
1021
|
@blacklisted_domains=[],
|
|
1022
|
+
@blacklisted_mx_ip_addresses=[],
|
|
948
1023
|
@dns=[],
|
|
949
1024
|
@connection_attempts=2,
|
|
950
1025
|
@connection_timeout=2,
|
|
@@ -993,6 +1068,7 @@ Truemail.validate('email@example.com')
|
|
|
993
1068
|
configuration=
|
|
994
1069
|
#<Truemail::Configuration:0x00005615e87b9298
|
|
995
1070
|
@blacklisted_domains=[],
|
|
1071
|
+
@blacklisted_mx_ip_addresses=[],
|
|
996
1072
|
@dns=[],
|
|
997
1073
|
@connection_attempts=2,
|
|
998
1074
|
@connection_timeout=2,
|
|
@@ -1042,6 +1118,7 @@ Truemail.host_audit
|
|
|
1042
1118
|
configuration=
|
|
1043
1119
|
#<Truemail::Configuration:0x00005615e86327a8
|
|
1044
1120
|
@blacklisted_domains=[],
|
|
1121
|
+
@blacklisted_mx_ip_addresses=[],
|
|
1045
1122
|
@dns=[],
|
|
1046
1123
|
@connection_attempts=2,
|
|
1047
1124
|
@connection_timeout=2,
|
|
@@ -1070,6 +1147,7 @@ Truemail.host_audit
|
|
|
1070
1147
|
configuration=
|
|
1071
1148
|
#<Truemail::Configuration:0x00005615e86327a8
|
|
1072
1149
|
@blacklisted_domains=[],
|
|
1150
|
+
@blacklisted_mx_ip_addresses=[],
|
|
1073
1151
|
@dns=[],
|
|
1074
1152
|
@connection_attempts=2,
|
|
1075
1153
|
@connection_timeout=2,
|
|
@@ -1122,16 +1200,17 @@ Truemail::Log::Serializer::AuditorJson.call(Truemail.host_audit)
|
|
|
1122
1200
|
"dns": "A-record of verifier domain not refers to current host ip address", "ptr": "PTR-record does not reference to current verifier domain"
|
|
1123
1201
|
},
|
|
1124
1202
|
"configuration": {
|
|
1125
|
-
"validation_type_by_domain": null,
|
|
1126
|
-
"whitelist_validation": false,
|
|
1127
|
-
"whitelisted_domains": null,
|
|
1128
1203
|
"blacklisted_domains": null,
|
|
1204
|
+
"blacklisted_mx_ip_addresses": null,
|
|
1129
1205
|
"dns": null,
|
|
1206
|
+
"email_pattern": "default gem value",
|
|
1130
1207
|
"not_rfc_mx_lookup_flow": false,
|
|
1208
|
+
"smtp_error_body_pattern": "default gem value",
|
|
1131
1209
|
"smtp_fail_fast": false,
|
|
1132
1210
|
"smtp_safe_check": false,
|
|
1133
|
-
"
|
|
1134
|
-
"
|
|
1211
|
+
"validation_type_by_domain": null,
|
|
1212
|
+
"whitelist_validation": false,
|
|
1213
|
+
"whitelisted_domains": null
|
|
1135
1214
|
}
|
|
1136
1215
|
}
|
|
1137
1216
|
```
|
|
@@ -1162,16 +1241,17 @@ Truemail::Log::Serializer::ValidatorJson.call(Truemail.validate('nonexistent_ema
|
|
|
1162
1241
|
}
|
|
1163
1242
|
],
|
|
1164
1243
|
"configuration": {
|
|
1165
|
-
"validation_type_by_domain": null,
|
|
1166
|
-
"whitelist_validation": false,
|
|
1167
|
-
"whitelisted_domains": null,
|
|
1168
1244
|
"blacklisted_domains": null,
|
|
1245
|
+
"blacklisted_mx_ip_addresses": null,
|
|
1169
1246
|
"dns": null,
|
|
1247
|
+
"email_pattern": "default gem value",
|
|
1170
1248
|
"not_rfc_mx_lookup_flow": false,
|
|
1249
|
+
"smtp_error_body_pattern": "default gem value",
|
|
1171
1250
|
"smtp_fail_fast": false,
|
|
1172
1251
|
"smtp_safe_check": false,
|
|
1173
|
-
"
|
|
1174
|
-
"
|
|
1252
|
+
"validation_type_by_domain": null,
|
|
1253
|
+
"whitelist_validation": false,
|
|
1254
|
+
"whitelisted_domains": null
|
|
1175
1255
|
}
|
|
1176
1256
|
}
|
|
1177
1257
|
```
|
|
@@ -1204,16 +1284,17 @@ Truemail.host_audit.as_json
|
|
|
1204
1284
|
"dns": "A-record of verifier domain not refers to current host ip address", "ptr": "PTR-record does not reference to current verifier domain"
|
|
1205
1285
|
},
|
|
1206
1286
|
"configuration": {
|
|
1207
|
-
"validation_type_by_domain": null,
|
|
1208
|
-
"whitelist_validation": false,
|
|
1209
|
-
"whitelisted_domains": null,
|
|
1210
1287
|
"blacklisted_domains": null,
|
|
1288
|
+
"blacklisted_mx_ip_addresses": null,
|
|
1211
1289
|
"dns": null,
|
|
1290
|
+
"email_pattern": "default gem value",
|
|
1212
1291
|
"not_rfc_mx_lookup_flow": false,
|
|
1292
|
+
"smtp_error_body_pattern": "default gem value",
|
|
1213
1293
|
"smtp_fail_fast": false,
|
|
1214
1294
|
"smtp_safe_check": false,
|
|
1215
|
-
"
|
|
1216
|
-
"
|
|
1295
|
+
"validation_type_by_domain": null,
|
|
1296
|
+
"whitelist_validation": false,
|
|
1297
|
+
"whitelisted_domains": null
|
|
1217
1298
|
}
|
|
1218
1299
|
}
|
|
1219
1300
|
|
|
@@ -1241,16 +1322,17 @@ Truemail.validate('nonexistent_email@bestweb.com.ua').as_json
|
|
|
1241
1322
|
}
|
|
1242
1323
|
],
|
|
1243
1324
|
"configuration": {
|
|
1244
|
-
"validation_type_by_domain": null,
|
|
1245
|
-
"whitelist_validation": false,
|
|
1246
|
-
"whitelisted_domains": null,
|
|
1247
1325
|
"blacklisted_domains": null,
|
|
1326
|
+
"blacklisted_mx_ip_addresses": null,
|
|
1248
1327
|
"dns": null,
|
|
1328
|
+
"email_pattern": "default gem value",
|
|
1249
1329
|
"not_rfc_mx_lookup_flow": false,
|
|
1330
|
+
"smtp_error_body_pattern": "default gem value",
|
|
1250
1331
|
"smtp_fail_fast": false,
|
|
1251
1332
|
"smtp_safe_check": false,
|
|
1252
|
-
"
|
|
1253
|
-
"
|
|
1333
|
+
"validation_type_by_domain": null,
|
|
1334
|
+
"whitelist_validation": false,
|
|
1335
|
+
"whitelisted_domains": null
|
|
1254
1336
|
}
|
|
1255
1337
|
}
|
|
1256
1338
|
```
|
data/bin/console
CHANGED
|
@@ -3,14 +3,7 @@
|
|
|
3
3
|
# frozen_string_literal: true
|
|
4
4
|
|
|
5
5
|
require 'bundler/setup'
|
|
6
|
-
require '
|
|
6
|
+
require 'pry'
|
|
7
|
+
require_relative '../lib/truemail'
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
# with your gem easier. You can also use a different console, if you like.
|
|
10
|
-
|
|
11
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
|
12
|
-
# require "pry"
|
|
13
|
-
# Pry.start
|
|
14
|
-
|
|
15
|
-
require 'irb'
|
|
16
|
-
IRB.start(__FILE__)
|
|
9
|
+
Pry.start
|
|
@@ -15,13 +15,14 @@ module Truemail
|
|
|
15
15
|
connection_attempts
|
|
16
16
|
whitelisted_domains
|
|
17
17
|
blacklisted_domains
|
|
18
|
+
blacklisted_mx_ip_addresses
|
|
19
|
+
dns
|
|
18
20
|
].freeze
|
|
19
21
|
|
|
20
22
|
attr_reader :verifier_email,
|
|
21
23
|
:verifier_domain,
|
|
22
24
|
:default_validation_type,
|
|
23
25
|
:validation_type_by_domain,
|
|
24
|
-
:dns,
|
|
25
26
|
:logger,
|
|
26
27
|
*Truemail::Configuration::SETTERS
|
|
27
28
|
|
|
@@ -55,9 +56,9 @@ module Truemail
|
|
|
55
56
|
validation_type_by_domain.merge!(settings)
|
|
56
57
|
end
|
|
57
58
|
|
|
58
|
-
def argument_consistent?(argument)
|
|
59
|
+
def argument_consistent?(method, argument)
|
|
59
60
|
case argument
|
|
60
|
-
when ::Array then
|
|
61
|
+
when ::Array then items_match_regex?(argument, regex_by_method(method))
|
|
61
62
|
when ::Integer then argument.positive?
|
|
62
63
|
when ::Regexp then true
|
|
63
64
|
end
|
|
@@ -65,16 +66,11 @@ module Truemail
|
|
|
65
66
|
|
|
66
67
|
Truemail::Configuration::SETTERS.each do |method|
|
|
67
68
|
define_method("#{method}=") do |argument|
|
|
68
|
-
raise_unless(argument, __method__, argument_consistent?(argument))
|
|
69
|
+
raise_unless(argument, __method__, argument_consistent?(method, argument))
|
|
69
70
|
instance_variable_set(:"@#{method}", argument)
|
|
70
71
|
end
|
|
71
72
|
end
|
|
72
73
|
|
|
73
|
-
def dns=(argument)
|
|
74
|
-
raise_unless(argument, __method__, argument.is_a?(::Array) && check_dns_settings(argument))
|
|
75
|
-
@dns = argument
|
|
76
|
-
end
|
|
77
|
-
|
|
78
74
|
def logger=(options)
|
|
79
75
|
tracking_event, stdout, log_absolute_path = logger_options(options)
|
|
80
76
|
valid_event = Truemail::Log::Event::TRACKING_EVENTS.key?(tracking_event)
|
|
@@ -104,6 +100,7 @@ module Truemail
|
|
|
104
100
|
whitelisted_domains: [],
|
|
105
101
|
whitelist_validation: false,
|
|
106
102
|
blacklisted_domains: [],
|
|
103
|
+
blacklisted_mx_ip_addresses: [],
|
|
107
104
|
dns: [],
|
|
108
105
|
not_rfc_mx_lookup_flow: false,
|
|
109
106
|
smtp_fail_fast: false,
|
|
@@ -115,25 +112,27 @@ module Truemail
|
|
|
115
112
|
raise Truemail::ArgumentError.new(argument_context, argument_name) unless condition
|
|
116
113
|
end
|
|
117
114
|
|
|
115
|
+
def match_regex?(regex_pattern, object)
|
|
116
|
+
regex_pattern.match?(object.to_s)
|
|
117
|
+
end
|
|
118
|
+
|
|
118
119
|
def validate_arguments(argument, method)
|
|
119
|
-
|
|
120
|
-
raise_unless(argument, method,
|
|
120
|
+
regex_pattern = Truemail::RegexConstant.const_get("regex_#{method[/\A.+_(.+)=\z/, 1]}_pattern".upcase)
|
|
121
|
+
raise_unless(argument, method, match_regex?(regex_pattern, argument))
|
|
121
122
|
end
|
|
122
123
|
|
|
123
124
|
def default_verifier_domain
|
|
124
125
|
self.verifier_domain ||= verifier_email[Truemail::RegexConstant::REGEX_EMAIL_PATTERN, 3]
|
|
125
126
|
end
|
|
126
127
|
|
|
127
|
-
def
|
|
128
|
-
|
|
128
|
+
def regex_by_method(method)
|
|
129
|
+
return Truemail::RegexConstant::REGEX_IP_ADDRESS_PATTERN if method.eql?(:blacklisted_mx_ip_addresses)
|
|
130
|
+
return Truemail::RegexConstant::REGEX_DNS_SERVER_ADDRESS_PATTERN if method.eql?(:dns)
|
|
131
|
+
Truemail::RegexConstant::REGEX_DOMAIN_PATTERN
|
|
129
132
|
end
|
|
130
133
|
|
|
131
|
-
def
|
|
132
|
-
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
def check_domain_list(domains)
|
|
136
|
-
domains.all?(&domain_matcher)
|
|
134
|
+
def items_match_regex?(items, regex_pattern)
|
|
135
|
+
items.all? { |item| match_regex?(regex_pattern, item) }
|
|
137
136
|
end
|
|
138
137
|
|
|
139
138
|
def check_validation_type(validation_type)
|
|
@@ -143,15 +142,11 @@ module Truemail
|
|
|
143
142
|
def validate_validation_type(settings)
|
|
144
143
|
raise_unless(settings, 'hash with settings', settings.is_a?(::Hash))
|
|
145
144
|
settings.each do |domain, validation_type|
|
|
146
|
-
|
|
145
|
+
raise_unless(domain, 'domain', match_regex?(Truemail::RegexConstant::REGEX_DOMAIN_PATTERN, domain))
|
|
147
146
|
check_validation_type(validation_type)
|
|
148
147
|
end
|
|
149
148
|
end
|
|
150
149
|
|
|
151
|
-
def check_dns_settings(dns_servers)
|
|
152
|
-
dns_servers.all? { |dns_server| Truemail::RegexConstant::REGEX_DNS_SERVER_ADDRESS_PATTERN.match?(dns_server.to_s) }
|
|
153
|
-
end
|
|
154
|
-
|
|
155
150
|
def logger_options(current_options)
|
|
156
151
|
Truemail::Configuration::DEFAULT_LOGGER_OPTIONS.merge(current_options).values
|
|
157
152
|
end
|
data/lib/truemail/core.rb
CHANGED
|
@@ -24,8 +24,10 @@ module Truemail
|
|
|
24
24
|
REGEX_DOMAIN_PATTERN = /(?=\A.{4,255}\z)(\A#{REGEX_DOMAIN}\z)/.freeze
|
|
25
25
|
REGEX_DOMAIN_FROM_EMAIL = /\A.+@(.+)\z/.freeze
|
|
26
26
|
REGEX_SMTP_ERROR_BODY_PATTERN = /(?=.*550)(?=.*(user|account|customer|mailbox)).*/i.freeze
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
REGEX_IP_ADDRESS = /((1\d|[1-9]|2[0-4])?\d|25[0-5])(\.\g<1>){3}/.freeze
|
|
28
|
+
REGEX_IP_ADDRESS_PATTERN = /\A#{REGEX_IP_ADDRESS}\z/.freeze
|
|
29
|
+
REGEX_PORT_NUMBER = /6553[0-5]|655[0-2]\d|65[0-4](\d){2}|6[0-4](\d){3}|[1-5](\d){4}|[1-9](\d){0,3}/.freeze
|
|
30
|
+
REGEX_DNS_SERVER_ADDRESS_PATTERN = /\A#{REGEX_IP_ADDRESS}(:#{REGEX_PORT_NUMBER})?\z/.freeze
|
|
29
31
|
end
|
|
30
32
|
|
|
31
33
|
module Dns
|
|
@@ -46,6 +48,7 @@ module Truemail
|
|
|
46
48
|
require_relative '../truemail/validate/domain_list_match'
|
|
47
49
|
require_relative '../truemail/validate/regex'
|
|
48
50
|
require_relative '../truemail/validate/mx'
|
|
51
|
+
require_relative '../truemail/validate/mx_blacklist'
|
|
49
52
|
require_relative '../truemail/validate/smtp'
|
|
50
53
|
require_relative '../truemail/validate/smtp/response'
|
|
51
54
|
require_relative '../truemail/validate/smtp/request'
|
|
@@ -6,6 +6,14 @@ module Truemail
|
|
|
6
6
|
class Base
|
|
7
7
|
require 'json'
|
|
8
8
|
|
|
9
|
+
CONFIGURATION_ARRAY_ATTRS = %i[
|
|
10
|
+
validation_type_by_domain
|
|
11
|
+
whitelisted_domains
|
|
12
|
+
blacklisted_domains
|
|
13
|
+
blacklisted_mx_ip_addresses
|
|
14
|
+
dns
|
|
15
|
+
].freeze
|
|
16
|
+
CONFIGURATION_REGEX_ATTRS = %i[email_pattern smtp_error_body_pattern].freeze
|
|
9
17
|
DEFAULT_GEM_VALUE = 'default gem value'
|
|
10
18
|
|
|
11
19
|
def self.call(executor_instance)
|
|
@@ -30,7 +38,7 @@ module Truemail
|
|
|
30
38
|
|
|
31
39
|
alias warnings errors
|
|
32
40
|
|
|
33
|
-
|
|
41
|
+
Truemail::Log::Serializer::Base::CONFIGURATION_ARRAY_ATTRS.each do |method|
|
|
34
42
|
define_method(method) do
|
|
35
43
|
value = executor_configuration.public_send(method)
|
|
36
44
|
return if value.empty?
|
|
@@ -38,7 +46,7 @@ module Truemail
|
|
|
38
46
|
end
|
|
39
47
|
end
|
|
40
48
|
|
|
41
|
-
|
|
49
|
+
Truemail::Log::Serializer::Base::CONFIGURATION_REGEX_ATTRS.each do |method|
|
|
42
50
|
define_method(method) do
|
|
43
51
|
value = executor_configuration.public_send(method)
|
|
44
52
|
default_pattern = Truemail::RegexConstant.const_get(
|
|
@@ -55,6 +63,7 @@ module Truemail
|
|
|
55
63
|
whitelist_validation: executor_configuration.whitelist_validation,
|
|
56
64
|
whitelisted_domains: whitelisted_domains,
|
|
57
65
|
blacklisted_domains: blacklisted_domains,
|
|
66
|
+
blacklisted_mx_ip_addresses: blacklisted_mx_ip_addresses,
|
|
58
67
|
dns: dns,
|
|
59
68
|
not_rfc_mx_lookup_flow: executor_configuration.not_rfc_mx_lookup_flow,
|
|
60
69
|
smtp_fail_fast: executor_configuration.smtp_fail_fast,
|
|
@@ -19,9 +19,9 @@ module Truemail
|
|
|
19
19
|
def data_composer(enumerable_object)
|
|
20
20
|
enumerable_object.inject([]) do |formatted_data, (key, value)|
|
|
21
21
|
data =
|
|
22
|
-
case
|
|
23
|
-
when
|
|
24
|
-
when
|
|
22
|
+
case value
|
|
23
|
+
when ::Hash then "\n#{printer(value)}"
|
|
24
|
+
when ::Array then value.join(', ')
|
|
25
25
|
else value
|
|
26
26
|
end
|
|
27
27
|
formatted_data << "#{key.to_s.tr('_', ' ')}: #{data}".chomp << "\n"
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Truemail
|
|
4
|
+
module Validate
|
|
5
|
+
class MxBlacklist < Truemail::Validate::Base
|
|
6
|
+
ERROR = 'blacklisted mx server ip address'
|
|
7
|
+
|
|
8
|
+
def run
|
|
9
|
+
return false unless Truemail::Validate::Mx.check(result)
|
|
10
|
+
return true if success(mail_servers.none?(&blacklisted_ip?))
|
|
11
|
+
add_error(Truemail::Validate::MxBlacklist::ERROR)
|
|
12
|
+
false
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def blacklisted_ip?
|
|
18
|
+
->(mail_server) { configuration.blacklisted_mx_ip_addresses.include?(mail_server) }
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -13,7 +13,7 @@ module Truemail
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def run
|
|
16
|
-
return false unless Truemail::Validate::
|
|
16
|
+
return false unless Truemail::Validate::MxBlacklist.check(result)
|
|
17
17
|
establish_smtp_connection
|
|
18
18
|
return true if success(success_response?)
|
|
19
19
|
result.smtp_debug = smtp_results
|
data/lib/truemail/validator.rb
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Truemail
|
|
4
4
|
class Validator < Truemail::Executor
|
|
5
5
|
RESULT_ATTRS = %i[success email domain mail_servers errors smtp_debug configuration].freeze
|
|
6
|
-
VALIDATION_TYPES = %i[regex mx smtp].freeze
|
|
6
|
+
VALIDATION_TYPES = %i[regex mx mx_blacklist smtp].freeze
|
|
7
7
|
|
|
8
8
|
Result = ::Struct.new(*RESULT_ATTRS, keyword_init: true) do
|
|
9
9
|
def initialize(mail_servers: [], errors: {}, **args)
|
|
@@ -27,7 +27,7 @@ module Truemail
|
|
|
27
27
|
|
|
28
28
|
def run
|
|
29
29
|
Truemail::Validate::DomainListMatch.check(result)
|
|
30
|
-
result_not_changed? ? Truemail::Validate.const_get(validation_type
|
|
30
|
+
result_not_changed? ? Truemail::Validate.const_get(constantize(validation_type)).check(result) : update_validation_type
|
|
31
31
|
logger&.push(self)
|
|
32
32
|
self
|
|
33
33
|
end
|
|
@@ -43,6 +43,10 @@ module Truemail
|
|
|
43
43
|
result.configuration.validation_type_by_domain[domain] || current_validation_type
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
+
def constantize(symbol)
|
|
47
|
+
symbol.capitalize.to_s.gsub(/_[a-z]/, &:upcase).tr('_', '').to_sym
|
|
48
|
+
end
|
|
49
|
+
|
|
46
50
|
def update_validation_type
|
|
47
51
|
@validation_type = result.success ? :whitelist : :blacklist
|
|
48
52
|
end
|
data/lib/truemail/version.rb
CHANGED
data/truemail.gemspec
CHANGED
|
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
|
11
11
|
spec.email = ['admin@bestweb.com.ua']
|
|
12
12
|
|
|
13
13
|
spec.summary = %(truemail)
|
|
14
|
-
spec.description = %(Configurable framework agnostic plain Ruby email validator. Verify email via Regex, DNS and
|
|
14
|
+
spec.description = %(Configurable framework agnostic plain Ruby email validator. Verify email via Regex, DNS, SMTP and even more.)
|
|
15
15
|
|
|
16
16
|
spec.homepage = 'https://github.com/truemail-rb/truemail'
|
|
17
17
|
spec.license = 'MIT'
|
|
@@ -34,20 +34,20 @@ Gem::Specification.new do |spec|
|
|
|
34
34
|
spec.add_runtime_dependency 'simpleidn', '~> 0.2.1'
|
|
35
35
|
|
|
36
36
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
|
37
|
-
spec.add_development_dependency 'bundler-audit', '~> 0.
|
|
38
|
-
spec.add_development_dependency 'dns_mock', '~> 1.2'
|
|
39
|
-
spec.add_development_dependency 'faker', '~> 2.
|
|
40
|
-
spec.add_development_dependency 'fasterer', '~> 0.
|
|
37
|
+
spec.add_development_dependency 'bundler-audit', '~> 0.8.0'
|
|
38
|
+
spec.add_development_dependency 'dns_mock', '~> 1.2', '>= 1.2.1'
|
|
39
|
+
spec.add_development_dependency 'faker', '~> 2.17'
|
|
40
|
+
spec.add_development_dependency 'fasterer', '~> 0.9.0'
|
|
41
41
|
spec.add_development_dependency 'json_matchers', '~> 0.11.1'
|
|
42
42
|
spec.add_development_dependency 'overcommit', '~> 0.57.0'
|
|
43
43
|
spec.add_development_dependency 'pry-byebug', '~> 3.9'
|
|
44
44
|
spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.3'
|
|
45
|
-
spec.add_development_dependency 'reek', '~> 6.0', '>= 6.0.
|
|
45
|
+
spec.add_development_dependency 'reek', '~> 6.0', '>= 6.0.4'
|
|
46
46
|
spec.add_development_dependency 'rspec', '~> 3.10'
|
|
47
|
-
spec.add_development_dependency 'rubocop', '~> 1.
|
|
48
|
-
spec.add_development_dependency 'rubocop-performance', '~> 1.
|
|
49
|
-
spec.add_development_dependency 'rubocop-rspec', '~> 2.
|
|
47
|
+
spec.add_development_dependency 'rubocop', '~> 1.13'
|
|
48
|
+
spec.add_development_dependency 'rubocop-performance', '~> 1.11'
|
|
49
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 2.3'
|
|
50
50
|
spec.add_development_dependency 'simplecov', '~> 0.17.1'
|
|
51
|
-
spec.add_development_dependency 'truemail-rspec', '~> 0.
|
|
52
|
-
spec.add_development_dependency 'webmock', '~> 3.
|
|
51
|
+
spec.add_development_dependency 'truemail-rspec', '~> 0.4'
|
|
52
|
+
spec.add_development_dependency 'webmock', '~> 3.12', '>= 3.12.2'
|
|
53
53
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: truemail
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Vladislav Trotsenko
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2021-
|
|
11
|
+
date: 2021-04-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: simpleidn
|
|
@@ -44,14 +44,14 @@ dependencies:
|
|
|
44
44
|
requirements:
|
|
45
45
|
- - "~>"
|
|
46
46
|
- !ruby/object:Gem::Version
|
|
47
|
-
version: 0.
|
|
47
|
+
version: 0.8.0
|
|
48
48
|
type: :development
|
|
49
49
|
prerelease: false
|
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
|
51
51
|
requirements:
|
|
52
52
|
- - "~>"
|
|
53
53
|
- !ruby/object:Gem::Version
|
|
54
|
-
version: 0.
|
|
54
|
+
version: 0.8.0
|
|
55
55
|
- !ruby/object:Gem::Dependency
|
|
56
56
|
name: dns_mock
|
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -59,6 +59,9 @@ dependencies:
|
|
|
59
59
|
- - "~>"
|
|
60
60
|
- !ruby/object:Gem::Version
|
|
61
61
|
version: '1.2'
|
|
62
|
+
- - ">="
|
|
63
|
+
- !ruby/object:Gem::Version
|
|
64
|
+
version: 1.2.1
|
|
62
65
|
type: :development
|
|
63
66
|
prerelease: false
|
|
64
67
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -66,40 +69,37 @@ dependencies:
|
|
|
66
69
|
- - "~>"
|
|
67
70
|
- !ruby/object:Gem::Version
|
|
68
71
|
version: '1.2'
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: 1.2.1
|
|
69
75
|
- !ruby/object:Gem::Dependency
|
|
70
76
|
name: faker
|
|
71
77
|
requirement: !ruby/object:Gem::Requirement
|
|
72
78
|
requirements:
|
|
73
79
|
- - "~>"
|
|
74
80
|
- !ruby/object:Gem::Version
|
|
75
|
-
version: '2.
|
|
76
|
-
- - ">="
|
|
77
|
-
- !ruby/object:Gem::Version
|
|
78
|
-
version: 2.15.1
|
|
81
|
+
version: '2.17'
|
|
79
82
|
type: :development
|
|
80
83
|
prerelease: false
|
|
81
84
|
version_requirements: !ruby/object:Gem::Requirement
|
|
82
85
|
requirements:
|
|
83
86
|
- - "~>"
|
|
84
87
|
- !ruby/object:Gem::Version
|
|
85
|
-
version: '2.
|
|
86
|
-
- - ">="
|
|
87
|
-
- !ruby/object:Gem::Version
|
|
88
|
-
version: 2.15.1
|
|
88
|
+
version: '2.17'
|
|
89
89
|
- !ruby/object:Gem::Dependency
|
|
90
90
|
name: fasterer
|
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
|
92
92
|
requirements:
|
|
93
93
|
- - "~>"
|
|
94
94
|
- !ruby/object:Gem::Version
|
|
95
|
-
version: 0.
|
|
95
|
+
version: 0.9.0
|
|
96
96
|
type: :development
|
|
97
97
|
prerelease: false
|
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
|
99
99
|
requirements:
|
|
100
100
|
- - "~>"
|
|
101
101
|
- !ruby/object:Gem::Version
|
|
102
|
-
version: 0.
|
|
102
|
+
version: 0.9.0
|
|
103
103
|
- !ruby/object:Gem::Dependency
|
|
104
104
|
name: json_matchers
|
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -171,7 +171,7 @@ dependencies:
|
|
|
171
171
|
version: '6.0'
|
|
172
172
|
- - ">="
|
|
173
173
|
- !ruby/object:Gem::Version
|
|
174
|
-
version: 6.0.
|
|
174
|
+
version: 6.0.4
|
|
175
175
|
type: :development
|
|
176
176
|
prerelease: false
|
|
177
177
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -181,7 +181,7 @@ dependencies:
|
|
|
181
181
|
version: '6.0'
|
|
182
182
|
- - ">="
|
|
183
183
|
- !ruby/object:Gem::Version
|
|
184
|
-
version: 6.0.
|
|
184
|
+
version: 6.0.4
|
|
185
185
|
- !ruby/object:Gem::Dependency
|
|
186
186
|
name: rspec
|
|
187
187
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -202,54 +202,42 @@ dependencies:
|
|
|
202
202
|
requirements:
|
|
203
203
|
- - "~>"
|
|
204
204
|
- !ruby/object:Gem::Version
|
|
205
|
-
version: '1.
|
|
206
|
-
- - ">="
|
|
207
|
-
- !ruby/object:Gem::Version
|
|
208
|
-
version: 1.9.1
|
|
205
|
+
version: '1.13'
|
|
209
206
|
type: :development
|
|
210
207
|
prerelease: false
|
|
211
208
|
version_requirements: !ruby/object:Gem::Requirement
|
|
212
209
|
requirements:
|
|
213
210
|
- - "~>"
|
|
214
211
|
- !ruby/object:Gem::Version
|
|
215
|
-
version: '1.
|
|
216
|
-
- - ">="
|
|
217
|
-
- !ruby/object:Gem::Version
|
|
218
|
-
version: 1.9.1
|
|
212
|
+
version: '1.13'
|
|
219
213
|
- !ruby/object:Gem::Dependency
|
|
220
214
|
name: rubocop-performance
|
|
221
215
|
requirement: !ruby/object:Gem::Requirement
|
|
222
216
|
requirements:
|
|
223
217
|
- - "~>"
|
|
224
218
|
- !ruby/object:Gem::Version
|
|
225
|
-
version: '1.
|
|
226
|
-
- - ">="
|
|
227
|
-
- !ruby/object:Gem::Version
|
|
228
|
-
version: 1.9.2
|
|
219
|
+
version: '1.11'
|
|
229
220
|
type: :development
|
|
230
221
|
prerelease: false
|
|
231
222
|
version_requirements: !ruby/object:Gem::Requirement
|
|
232
223
|
requirements:
|
|
233
224
|
- - "~>"
|
|
234
225
|
- !ruby/object:Gem::Version
|
|
235
|
-
version: '1.
|
|
236
|
-
- - ">="
|
|
237
|
-
- !ruby/object:Gem::Version
|
|
238
|
-
version: 1.9.2
|
|
226
|
+
version: '1.11'
|
|
239
227
|
- !ruby/object:Gem::Dependency
|
|
240
228
|
name: rubocop-rspec
|
|
241
229
|
requirement: !ruby/object:Gem::Requirement
|
|
242
230
|
requirements:
|
|
243
231
|
- - "~>"
|
|
244
232
|
- !ruby/object:Gem::Version
|
|
245
|
-
version: '2.
|
|
233
|
+
version: '2.3'
|
|
246
234
|
type: :development
|
|
247
235
|
prerelease: false
|
|
248
236
|
version_requirements: !ruby/object:Gem::Requirement
|
|
249
237
|
requirements:
|
|
250
238
|
- - "~>"
|
|
251
239
|
- !ruby/object:Gem::Version
|
|
252
|
-
version: '2.
|
|
240
|
+
version: '2.3'
|
|
253
241
|
- !ruby/object:Gem::Dependency
|
|
254
242
|
name: simplecov
|
|
255
243
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -270,36 +258,36 @@ dependencies:
|
|
|
270
258
|
requirements:
|
|
271
259
|
- - "~>"
|
|
272
260
|
- !ruby/object:Gem::Version
|
|
273
|
-
version: 0.
|
|
261
|
+
version: '0.4'
|
|
274
262
|
type: :development
|
|
275
263
|
prerelease: false
|
|
276
264
|
version_requirements: !ruby/object:Gem::Requirement
|
|
277
265
|
requirements:
|
|
278
266
|
- - "~>"
|
|
279
267
|
- !ruby/object:Gem::Version
|
|
280
|
-
version: 0.
|
|
268
|
+
version: '0.4'
|
|
281
269
|
- !ruby/object:Gem::Dependency
|
|
282
270
|
name: webmock
|
|
283
271
|
requirement: !ruby/object:Gem::Requirement
|
|
284
272
|
requirements:
|
|
285
273
|
- - "~>"
|
|
286
274
|
- !ruby/object:Gem::Version
|
|
287
|
-
version: '3.
|
|
275
|
+
version: '3.12'
|
|
288
276
|
- - ">="
|
|
289
277
|
- !ruby/object:Gem::Version
|
|
290
|
-
version: 3.
|
|
278
|
+
version: 3.12.2
|
|
291
279
|
type: :development
|
|
292
280
|
prerelease: false
|
|
293
281
|
version_requirements: !ruby/object:Gem::Requirement
|
|
294
282
|
requirements:
|
|
295
283
|
- - "~>"
|
|
296
284
|
- !ruby/object:Gem::Version
|
|
297
|
-
version: '3.
|
|
285
|
+
version: '3.12'
|
|
298
286
|
- - ">="
|
|
299
287
|
- !ruby/object:Gem::Version
|
|
300
|
-
version: 3.
|
|
288
|
+
version: 3.12.2
|
|
301
289
|
description: Configurable framework agnostic plain Ruby email validator. Verify email
|
|
302
|
-
via Regex, DNS and
|
|
290
|
+
via Regex, DNS, SMTP and even more.
|
|
303
291
|
email:
|
|
304
292
|
- admin@bestweb.com.ua
|
|
305
293
|
executables: []
|
|
@@ -353,6 +341,7 @@ files:
|
|
|
353
341
|
- lib/truemail/validate/base.rb
|
|
354
342
|
- lib/truemail/validate/domain_list_match.rb
|
|
355
343
|
- lib/truemail/validate/mx.rb
|
|
344
|
+
- lib/truemail/validate/mx_blacklist.rb
|
|
356
345
|
- lib/truemail/validate/regex.rb
|
|
357
346
|
- lib/truemail/validate/smtp.rb
|
|
358
347
|
- lib/truemail/validate/smtp/request.rb
|