truemail 2.3.2 → 2.4.2
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 +59 -18
- data/.codeclimate.yml +1 -1
- data/.reek.yml +9 -8
- data/.rubocop.yml +6 -0
- data/CHANGELOG.md +69 -4
- data/Gemfile.lock +33 -33
- data/README.md +106 -21
- data/lib/truemail/configuration.rb +19 -24
- data/lib/truemail/core.rb +5 -2
- data/lib/truemail/log/serializer/base.rb +17 -8
- data/lib/truemail/log/serializer/validator_text.rb +3 -3
- data/lib/truemail/validate/mx_blacklist.rb +26 -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 +36 -23
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,22 +38,22 @@ 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
|
-
|
36
|
-
return if
|
37
|
-
|
43
|
+
executor_configuration_attr = executor_configuration.public_send(method)
|
44
|
+
return if executor_configuration_attr.empty?
|
45
|
+
executor_configuration_attr
|
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
|
+
executor_configuration_attr = executor_configuration.public_send(method)
|
44
52
|
default_pattern = Truemail::RegexConstant.const_get(
|
45
53
|
(method.eql?(:email_pattern) ? :regex_email_pattern : :regex_smtp_error_body_pattern).upcase
|
46
54
|
)
|
47
|
-
return Truemail::Log::Serializer::Base::DEFAULT_GEM_VALUE if
|
48
|
-
|
55
|
+
return Truemail::Log::Serializer::Base::DEFAULT_GEM_VALUE if executor_configuration_attr.eql?(default_pattern)
|
56
|
+
executor_configuration_attr
|
49
57
|
end
|
50
58
|
end
|
51
59
|
|
@@ -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,26 @@
|
|
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(not_blacklisted_mail_servers?)
|
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
|
+
|
21
|
+
def not_blacklisted_mail_servers?
|
22
|
+
mail_servers.none?(&blacklisted_ip?)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
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'
|
@@ -33,21 +33,21 @@ Gem::Specification.new do |spec|
|
|
33
33
|
|
34
34
|
spec.add_runtime_dependency 'simpleidn', '~> 0.2.1'
|
35
35
|
|
36
|
-
spec.add_development_dependency 'bundler', '~>
|
37
|
-
spec.add_development_dependency 'bundler-audit', '~> 0.
|
38
|
-
spec.add_development_dependency 'dns_mock', '~> 1.2'
|
39
|
-
spec.add_development_dependency 'faker', '~> 2.
|
36
|
+
spec.add_development_dependency 'bundler', '~> 2.2', '>= 2.2.17'
|
37
|
+
spec.add_development_dependency 'bundler-audit', '~> 0.8.0'
|
38
|
+
spec.add_development_dependency 'dns_mock', '~> 1.2', '>= 1.2.3'
|
39
|
+
spec.add_development_dependency 'faker', '~> 2.17'
|
40
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.14'
|
48
|
+
spec.add_development_dependency 'rubocop-performance', '~> 1.11', '>= 1.11.3'
|
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.12', '>= 3.12.
|
51
|
+
spec.add_development_dependency 'truemail-rspec', '~> 0.6'
|
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.2
|
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-05-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: simpleidn
|
@@ -30,28 +30,34 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '2.2'
|
34
|
+
- - ">="
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: 2.2.17
|
34
37
|
type: :development
|
35
38
|
prerelease: false
|
36
39
|
version_requirements: !ruby/object:Gem::Requirement
|
37
40
|
requirements:
|
38
41
|
- - "~>"
|
39
42
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
43
|
+
version: '2.2'
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 2.2.17
|
41
47
|
- !ruby/object:Gem::Dependency
|
42
48
|
name: bundler-audit
|
43
49
|
requirement: !ruby/object:Gem::Requirement
|
44
50
|
requirements:
|
45
51
|
- - "~>"
|
46
52
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
53
|
+
version: 0.8.0
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
51
57
|
requirements:
|
52
58
|
- - "~>"
|
53
59
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
60
|
+
version: 0.8.0
|
55
61
|
- !ruby/object:Gem::Dependency
|
56
62
|
name: dns_mock
|
57
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,6 +65,9 @@ dependencies:
|
|
59
65
|
- - "~>"
|
60
66
|
- !ruby/object:Gem::Version
|
61
67
|
version: '1.2'
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 1.2.3
|
62
71
|
type: :development
|
63
72
|
prerelease: false
|
64
73
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -66,20 +75,23 @@ dependencies:
|
|
66
75
|
- - "~>"
|
67
76
|
- !ruby/object:Gem::Version
|
68
77
|
version: '1.2'
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: 1.2.3
|
69
81
|
- !ruby/object:Gem::Dependency
|
70
82
|
name: faker
|
71
83
|
requirement: !ruby/object:Gem::Requirement
|
72
84
|
requirements:
|
73
85
|
- - "~>"
|
74
86
|
- !ruby/object:Gem::Version
|
75
|
-
version: '2.
|
87
|
+
version: '2.17'
|
76
88
|
type: :development
|
77
89
|
prerelease: false
|
78
90
|
version_requirements: !ruby/object:Gem::Requirement
|
79
91
|
requirements:
|
80
92
|
- - "~>"
|
81
93
|
- !ruby/object:Gem::Version
|
82
|
-
version: '2.
|
94
|
+
version: '2.17'
|
83
95
|
- !ruby/object:Gem::Dependency
|
84
96
|
name: fasterer
|
85
97
|
requirement: !ruby/object:Gem::Requirement
|
@@ -165,7 +177,7 @@ dependencies:
|
|
165
177
|
version: '6.0'
|
166
178
|
- - ">="
|
167
179
|
- !ruby/object:Gem::Version
|
168
|
-
version: 6.0.
|
180
|
+
version: 6.0.4
|
169
181
|
type: :development
|
170
182
|
prerelease: false
|
171
183
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -175,7 +187,7 @@ dependencies:
|
|
175
187
|
version: '6.0'
|
176
188
|
- - ">="
|
177
189
|
- !ruby/object:Gem::Version
|
178
|
-
version: 6.0.
|
190
|
+
version: 6.0.4
|
179
191
|
- !ruby/object:Gem::Dependency
|
180
192
|
name: rspec
|
181
193
|
requirement: !ruby/object:Gem::Requirement
|
@@ -196,48 +208,48 @@ dependencies:
|
|
196
208
|
requirements:
|
197
209
|
- - "~>"
|
198
210
|
- !ruby/object:Gem::Version
|
199
|
-
version: '1.
|
211
|
+
version: '1.14'
|
200
212
|
type: :development
|
201
213
|
prerelease: false
|
202
214
|
version_requirements: !ruby/object:Gem::Requirement
|
203
215
|
requirements:
|
204
216
|
- - "~>"
|
205
217
|
- !ruby/object:Gem::Version
|
206
|
-
version: '1.
|
218
|
+
version: '1.14'
|
207
219
|
- !ruby/object:Gem::Dependency
|
208
220
|
name: rubocop-performance
|
209
221
|
requirement: !ruby/object:Gem::Requirement
|
210
222
|
requirements:
|
211
223
|
- - "~>"
|
212
224
|
- !ruby/object:Gem::Version
|
213
|
-
version: '1.
|
225
|
+
version: '1.11'
|
214
226
|
- - ">="
|
215
227
|
- !ruby/object:Gem::Version
|
216
|
-
version: 1.
|
228
|
+
version: 1.11.3
|
217
229
|
type: :development
|
218
230
|
prerelease: false
|
219
231
|
version_requirements: !ruby/object:Gem::Requirement
|
220
232
|
requirements:
|
221
233
|
- - "~>"
|
222
234
|
- !ruby/object:Gem::Version
|
223
|
-
version: '1.
|
235
|
+
version: '1.11'
|
224
236
|
- - ">="
|
225
237
|
- !ruby/object:Gem::Version
|
226
|
-
version: 1.
|
238
|
+
version: 1.11.3
|
227
239
|
- !ruby/object:Gem::Dependency
|
228
240
|
name: rubocop-rspec
|
229
241
|
requirement: !ruby/object:Gem::Requirement
|
230
242
|
requirements:
|
231
243
|
- - "~>"
|
232
244
|
- !ruby/object:Gem::Version
|
233
|
-
version: '2.
|
245
|
+
version: '2.3'
|
234
246
|
type: :development
|
235
247
|
prerelease: false
|
236
248
|
version_requirements: !ruby/object:Gem::Requirement
|
237
249
|
requirements:
|
238
250
|
- - "~>"
|
239
251
|
- !ruby/object:Gem::Version
|
240
|
-
version: '2.
|
252
|
+
version: '2.3'
|
241
253
|
- !ruby/object:Gem::Dependency
|
242
254
|
name: simplecov
|
243
255
|
requirement: !ruby/object:Gem::Requirement
|
@@ -258,14 +270,14 @@ dependencies:
|
|
258
270
|
requirements:
|
259
271
|
- - "~>"
|
260
272
|
- !ruby/object:Gem::Version
|
261
|
-
version: '0.
|
273
|
+
version: '0.6'
|
262
274
|
type: :development
|
263
275
|
prerelease: false
|
264
276
|
version_requirements: !ruby/object:Gem::Requirement
|
265
277
|
requirements:
|
266
278
|
- - "~>"
|
267
279
|
- !ruby/object:Gem::Version
|
268
|
-
version: '0.
|
280
|
+
version: '0.6'
|
269
281
|
- !ruby/object:Gem::Dependency
|
270
282
|
name: webmock
|
271
283
|
requirement: !ruby/object:Gem::Requirement
|
@@ -275,7 +287,7 @@ dependencies:
|
|
275
287
|
version: '3.12'
|
276
288
|
- - ">="
|
277
289
|
- !ruby/object:Gem::Version
|
278
|
-
version: 3.12.
|
290
|
+
version: 3.12.2
|
279
291
|
type: :development
|
280
292
|
prerelease: false
|
281
293
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -285,9 +297,9 @@ dependencies:
|
|
285
297
|
version: '3.12'
|
286
298
|
- - ">="
|
287
299
|
- !ruby/object:Gem::Version
|
288
|
-
version: 3.12.
|
300
|
+
version: 3.12.2
|
289
301
|
description: Configurable framework agnostic plain Ruby email validator. Verify email
|
290
|
-
via Regex, DNS and
|
302
|
+
via Regex, DNS, SMTP and even more.
|
291
303
|
email:
|
292
304
|
- admin@bestweb.com.ua
|
293
305
|
executables: []
|
@@ -341,6 +353,7 @@ files:
|
|
341
353
|
- lib/truemail/validate/base.rb
|
342
354
|
- lib/truemail/validate/domain_list_match.rb
|
343
355
|
- lib/truemail/validate/mx.rb
|
356
|
+
- lib/truemail/validate/mx_blacklist.rb
|
344
357
|
- lib/truemail/validate/regex.rb
|
345
358
|
- lib/truemail/validate/smtp.rb
|
346
359
|
- lib/truemail/validate/smtp/request.rb
|