truemail 2.3.2 → 2.4.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  [![GitHub](https://img.shields.io/github/license/truemail-rb/truemail)](LICENSE.txt)
11
11
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-v1.4%20adopted-ff69b4.svg)](CODE_OF_CONDUCT.md)
12
12
 
13
- Configurable framework agnostic plain Ruby email validator. Verify email via Regex, DNS and SMTP. Be sure that email address valid and exists.
13
+ Configurable framework agnostic plain Ruby email validator. Verify email via Regex, DNS, SMTP and even more. Be sure that email address valid and exists.
14
14
 
15
15
  > Actual and maintainable documentation :books: for developers is living [here](https://truemail-rb.org/truemail-gem).
16
16
 
@@ -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)
@@ -80,10 +81,11 @@ Also Truemail gem allows performing an audit of the host in which runs.
80
81
  ## Features
81
82
 
82
83
  - Configurable validator, validate only what you need
83
- - Minimal runtime dependencies
84
+ - Only one runtime dependency
84
85
  - Supporting of internationalized emails ([EAI](https://en.wikipedia.org/wiki/Email_address#Internationalization))
85
86
  - Whitelist/blacklist validation layers
86
87
  - Ability to configure different MX/SMTP validation flows
88
+ - Ability to configure [DEA](https://en.wikipedia.org/wiki/Disposable_email_address) validation flow
87
89
  - Simple SMTP debugger
88
90
  - Event logger
89
91
  - Host auditor tools (helps to detect common host problems interfering to proper email verification)
@@ -132,6 +134,7 @@ You can use global gem configuration or custom independent configuration. Availa
132
134
  - whitelisted domains
133
135
  - whitelist validation
134
136
  - blacklisted domains
137
+ - blacklisted mx ip-addresses
135
138
  - custom DNS gateway(s)
136
139
  - RFC MX lookup flow
137
140
  - SMTP fail fast
@@ -175,11 +178,12 @@ Truemail.configure do |config|
175
178
 
176
179
  # Optional parameter. You can predefine default validation type for
177
180
  # Truemail.validate('email@email.com') call without with-parameter
178
- # Available validation types: :regex, :mx, :smtp
181
+ # Available validation types: :regex, :mx, :mx_blacklist, :smtp
179
182
  config.default_validation_type = :mx
180
183
 
181
184
  # Optional parameter. You can predefine which type of validation will be used for domains.
182
- # Also you can skip validation by domain. Available validation types: :regex, :mx, :smtp
185
+ # Also you can skip validation by domain.
186
+ # Available validation types: :regex, :mx, :mx_blacklist, :smtp
183
187
  # This configuration will be used over current or default validation type parameter
184
188
  # All of validations for 'somedomain.com' will be processed with regex validation only.
185
189
  # And all of validations for 'otherdomain.com' will be processed with mx validation only.
@@ -200,12 +204,17 @@ Truemail.configure do |config|
200
204
  # Optional parameter. Validation of email which contains blacklisted domain always will
201
205
  # return false. Other validations will not processed even if it was defined in validation_type_for
202
206
  # It is equal to empty array by default.
203
- config.blacklisted_domains = ['somedomain1.com', 'somedomain2.com']
207
+ config.blacklisted_domains = ['somedomain3.com', 'somedomain4.com']
208
+
209
+ # Optional parameter. With this option Truemail will filter out unwanted mx servers via
210
+ # predefined list of ip addresses. It can be used as a part of DEA (disposable email
211
+ # address) validations. It is equal to empty array by default.
212
+ config.blacklisted_mx_ip_addresses = ['1.1.1.1', '2.2.2.2']
204
213
 
205
214
  # Optional parameter. This option will provide to use custom DNS gateway when Truemail
206
- # interacts with DNS. If you won't specify nameserver's ports Truemail will use default
207
- # DNS TCP/UDP port 53. By default Truemail uses DNS gateway from system settings
208
- # and this option is equal to empty array.
215
+ # interacts with DNS. Valid port numbers are in the range 1-65535. If you won't specify
216
+ # nameserver's ports Truemail will use default DNS TCP/UDP port 53. By default Truemail
217
+ # uses DNS gateway from system settings and this option is equal to empty array.
209
218
  config.dns = ['10.0.0.1', '10.0.0.2:54']
210
219
 
211
220
  # Optional parameter. This option will provide to use not RFC MX lookup flow.
@@ -214,7 +223,7 @@ Truemail.configure do |config|
214
223
  config.not_rfc_mx_lookup_flow = true
215
224
 
216
225
  # Optional parameter. This option will provide to use smtp fail fast behaviour. When
217
- # smtp_fail_fast = true it means that truemail ends smtp validation session after first
226
+ # smtp_fail_fast = true it means that Truemail ends smtp validation session after first
218
227
  # attempt on the first mx server in any fail cases (network connection/timeout error,
219
228
  # smtp validation error). This feature helps to reduce total time of SMTP validation
220
229
  # session up to 1 second. By default this option is disabled.
@@ -245,11 +254,13 @@ Truemail.configuration
245
254
  @smtp_error_body_pattern=/regex_pattern/,
246
255
  @response_timeout=1,
247
256
  @connection_attempts=3,
248
- @validation_type_by_domain={},
249
- @whitelisted_domains=[],
257
+ @default_validation_type=:mx,
258
+ @validation_type_by_domain={"somedomain.com" => :regex, "otherdomain.com" => :mx},
259
+ @whitelisted_domains=["somedomain1.com", "somedomain2.com"],
250
260
  @whitelist_validation=true,
251
- @blacklisted_domains=[],
252
- @dns=[],
261
+ @blacklisted_domains=["somedomain3.com", "somedomain4.com"],
262
+ @blacklisted_mx_ip_addresses=["1.1.1.1", "2.2.2.2"],
263
+ @dns=["10.0.0.1", "10.0.0.2:54"],
253
264
  @verifier_domain="somedomain.com",
254
265
  @verifier_email="verifier@example.com",
255
266
  @not_rfc_mx_lookup_flow=true,
@@ -276,11 +287,13 @@ Truemail.configuration
276
287
  @smtp_error_body_pattern=/regex_pattern/,
277
288
  @response_timeout=4,
278
289
  @connection_attempts=1,
279
- @validation_type_by_domain={},
280
- @whitelisted_domains=[],
290
+ @default_validation_type=:mx,
291
+ @validation_type_by_domain={"somedomain.com" => :regex, "otherdomain.com" => :mx},
292
+ @whitelisted_domains=["somedomain1.com", "somedomain2.com"],
281
293
  @whitelist_validation=true,
282
- @blacklisted_domains=[],
283
- @dns=[],
294
+ @blacklisted_domains=["somedomain3.com", "somedomain4.com"],
295
+ @blacklisted_mx_ip_addresses=["1.1.1.1", "2.2.2.2"],
296
+ @dns=["10.0.0.1", "10.0.0.2:54"],
284
297
  @verifier_domain="somedomain.com",
285
298
  @verifier_email="verifier@example.com",
286
299
  @not_rfc_mx_lookup_flow=true,
@@ -361,6 +374,7 @@ Truemail.validate('email@white-domain.com')
361
374
  smtp_debug=nil>,
362
375
  configuration=#<Truemail::Configuration:0x00005629f801bd28
363
376
  @blacklisted_domains=["black-domain.com", "somedomain.com"],
377
+ @blacklisted_mx_ip_addresses=[],
364
378
  @dns=[],
365
379
  @connection_attempts=2,
366
380
  @connection_timeout=2,
@@ -409,6 +423,7 @@ Truemail.validate('email@white-domain.com', with: :regex)
409
423
  configuration=
410
424
  #<Truemail::Configuration:0x0000563f0d2605c8
411
425
  @blacklisted_domains=[],
426
+ @blacklisted_mx_ip_addresses=[],
412
427
  @dns=[],
413
428
  @connection_attempts=2,
414
429
  @connection_timeout=2,
@@ -443,6 +458,7 @@ Truemail.validate('email@domain.com', with: :regex)
443
458
  configuration=
444
459
  #<Truemail::Configuration:0x0000563f0cd82ab0
445
460
  @blacklisted_domains=[],
461
+ @blacklisted_mx_ip_addresses=[],
446
462
  @dns=[],
447
463
  @connection_attempts=2,
448
464
  @connection_timeout=2,
@@ -463,7 +479,7 @@ Truemail.validate('email@domain.com', with: :regex)
463
479
 
464
480
  ##### Blacklist case
465
481
 
466
- When email in blacklist, validation type will be redefined too. Validation result returns ```false```
482
+ When email in blacklist, validation type will be redefined too. Validation result returns `false`.
467
483
 
468
484
  ```ruby
469
485
  Truemail.validate('email@black-domain.com')
@@ -479,6 +495,7 @@ Truemail.validate('email@black-domain.com')
479
495
  configuration=
480
496
  #<Truemail::Configuration:0x0000563f0d36f4f0
481
497
  @blacklisted_domains=[],
498
+ @blacklisted_mx_ip_addresses=[],
482
499
  @dns=[],
483
500
  @connection_attempts=2,
484
501
  @connection_timeout=2,
@@ -515,6 +532,7 @@ Truemail.validate('email@somedomain.com')
515
532
  configuration=
516
533
  #<Truemail::Configuration:0x0000563f0d3f8fc0
517
534
  @blacklisted_domains=[],
535
+ @blacklisted_mx_ip_addresses=[],
518
536
  @dns=[],
519
537
  @connection_attempts=2,
520
538
  @connection_timeout=2,
@@ -559,7 +577,8 @@ Truemail.validate('email@example.com', with: :regex)
559
577
  => #<Truemail::Validator:0x000055590cc9bdb8
560
578
  @result=
561
579
  #<struct Truemail::Validator::Result
562
- success=true, email="email@example.com",
580
+ success=true,
581
+ email="email@example.com",
563
582
  domain=nil,
564
583
  mail_servers=[],
565
584
  errors={},
@@ -567,6 +586,7 @@ Truemail.validate('email@example.com', with: :regex)
567
586
  configuration=
568
587
  #<Truemail::Configuration:0x000055aa56a54d48
569
588
  @blacklisted_domains=[],
589
+ @blacklisted_mx_ip_addresses=[],
570
590
  @dns=[],
571
591
  @connection_attempts=2,
572
592
  @connection_timeout=2,
@@ -611,6 +631,7 @@ Truemail.validate('email@example.com', with: :regex)
611
631
  configuration=
612
632
  #<Truemail::Configuration:0x0000560e58d80830
613
633
  @blacklisted_domains=[],
634
+ @blacklisted_mx_ip_addresses=[],
614
635
  @dns=[],
615
636
  @connection_attempts=2,
616
637
  @connection_timeout=2,
@@ -666,6 +687,7 @@ Truemail.validate('email@example.com', with: :mx)
666
687
  configuration=
667
688
  #<Truemail::Configuration:0x0000559b6e44af70
668
689
  @blacklisted_domains=[],
690
+ @blacklisted_mx_ip_addresses=[],
669
691
  @dns=[],
670
692
  @connection_attempts=2,
671
693
  @connection_timeout=2,
@@ -712,6 +734,7 @@ Truemail.validate('email@example.com', with: :mx)
712
734
  configuration=
713
735
  #<Truemail::Configuration:0x0000559b6e44af70
714
736
  @blacklisted_domains=[],
737
+ @blacklisted_mx_ip_addresses=[],
715
738
  @dns=[],
716
739
  @connection_attempts=2,
717
740
  @connection_timeout=2,
@@ -730,12 +753,63 @@ Truemail.validate('email@example.com', with: :mx)
730
753
  @validation_type=:mx>
731
754
  ```
732
755
 
756
+ #### MX blacklist validation
757
+
758
+ 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.
759
+
760
+ ```code
761
+ [Whitelist/Blacklist] -> [Regex validation] -> [MX validation] -> [MX blacklist validation]
762
+ ```
763
+
764
+ Example of usage:
765
+
766
+ ```ruby
767
+ require 'truemail'
768
+
769
+ Truemail.configure do |config|
770
+ config.verifier_email = 'verifier@example.com'
771
+ config.blacklisted_mx_ip_addresses = ['127.0.1.2']
772
+ end
773
+
774
+ Truemail.validate('email@example.com', with: :mx_blacklist)
775
+
776
+ => #<Truemail::Validator:0x00007fca0c8aea70
777
+ @result=
778
+ #<struct Truemail::Validator::Result
779
+ success=false,
780
+ email="email@example.com",
781
+ domain="example.com",
782
+ mail_servers=["127.0.1.1", "127.0.1.2"],
783
+ errors={:mx_blacklist=>"blacklisted mx server ip address"},
784
+ smtp_debug=nil,
785
+ configuration=
786
+ #<Truemail::Configuration:0x00007fca0c8aeb38
787
+ @blacklisted_domains=[],
788
+ @blacklisted_mx_ip_addresses=["127.0.1.2"],
789
+ @connection_attempts=2,
790
+ @connection_timeout=2,
791
+ @default_validation_type=:smtp,
792
+ @dns=[],
793
+ @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)/,
794
+ @not_rfc_mx_lookup_flow=false,
795
+ @response_timeout=2,
796
+ @smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
797
+ @smtp_fail_fast=false,
798
+ @smtp_safe_check=false,
799
+ @validation_type_by_domain={},
800
+ @verifier_domain="example.com",
801
+ @verifier_email="verifier@example.com",
802
+ @whitelist_validation=false,
803
+ @whitelisted_domains=[]>>,
804
+ @validation_type=:mx_blacklist>
805
+ ```
806
+
733
807
  #### SMTP validation
734
808
 
735
- SMTP validation is a final, third 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.
809
+ 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
810
 
737
811
  ```code
738
- [Whitelist/Blacklist] -> [Regex validation] -> [MX validation] -> [SMTP validation]
812
+ [Whitelist/Blacklist] -> [Regex validation] -> [MX validation] -> [MX blacklist validation] -> [SMTP validation]
739
813
  ```
740
814
 
741
815
  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 +861,7 @@ Truemail.validate('email@example.com')
787
861
  configuration=
788
862
  #<Truemail::Configuration:0x00007fdc4504f5c8
789
863
  @blacklisted_domains=[],
864
+ @blacklisted_mx_ip_addresses=[],
790
865
  @dns=[],
791
866
  @connection_attempts=2,
792
867
  @connection_timeout=2,
@@ -831,6 +906,7 @@ Truemail.validate('email@example.com')
831
906
  configuration=
832
907
  #<Truemail::Configuration:0x00005615e87b9298
833
908
  @blacklisted_domains=[],
909
+ @blacklisted_mx_ip_addresses=[],
834
910
  @dns=[],
835
911
  @connection_attempts=2,
836
912
  @connection_timeout=2,
@@ -882,6 +958,7 @@ Truemail.validate('email@example.com')
882
958
  configuration=
883
959
  #<Truemail::Configuration:0x00005615e87b9298
884
960
  @blacklisted_domains=[],
961
+ @blacklisted_mx_ip_addresses=[],
885
962
  @dns=[],
886
963
  @connection_attempts=2,
887
964
  @connection_timeout=2,
@@ -945,6 +1022,7 @@ Truemail.validate('email@example.com')
945
1022
  configuration=
946
1023
  #<Truemail::Configuration:0x00005615e87b9298
947
1024
  @blacklisted_domains=[],
1025
+ @blacklisted_mx_ip_addresses=[],
948
1026
  @dns=[],
949
1027
  @connection_attempts=2,
950
1028
  @connection_timeout=2,
@@ -993,6 +1071,7 @@ Truemail.validate('email@example.com')
993
1071
  configuration=
994
1072
  #<Truemail::Configuration:0x00005615e87b9298
995
1073
  @blacklisted_domains=[],
1074
+ @blacklisted_mx_ip_addresses=[],
996
1075
  @dns=[],
997
1076
  @connection_attempts=2,
998
1077
  @connection_timeout=2,
@@ -1042,6 +1121,7 @@ Truemail.host_audit
1042
1121
  configuration=
1043
1122
  #<Truemail::Configuration:0x00005615e86327a8
1044
1123
  @blacklisted_domains=[],
1124
+ @blacklisted_mx_ip_addresses=[],
1045
1125
  @dns=[],
1046
1126
  @connection_attempts=2,
1047
1127
  @connection_timeout=2,
@@ -1070,6 +1150,7 @@ Truemail.host_audit
1070
1150
  configuration=
1071
1151
  #<Truemail::Configuration:0x00005615e86327a8
1072
1152
  @blacklisted_domains=[],
1153
+ @blacklisted_mx_ip_addresses=[],
1073
1154
  @dns=[],
1074
1155
  @connection_attempts=2,
1075
1156
  @connection_timeout=2,
@@ -1123,6 +1204,7 @@ Truemail::Log::Serializer::AuditorJson.call(Truemail.host_audit)
1123
1204
  },
1124
1205
  "configuration": {
1125
1206
  "blacklisted_domains": null,
1207
+ "blacklisted_mx_ip_addresses": null,
1126
1208
  "dns": null,
1127
1209
  "email_pattern": "default gem value",
1128
1210
  "not_rfc_mx_lookup_flow": false,
@@ -1163,6 +1245,7 @@ Truemail::Log::Serializer::ValidatorJson.call(Truemail.validate('nonexistent_ema
1163
1245
  ],
1164
1246
  "configuration": {
1165
1247
  "blacklisted_domains": null,
1248
+ "blacklisted_mx_ip_addresses": null,
1166
1249
  "dns": null,
1167
1250
  "email_pattern": "default gem value",
1168
1251
  "not_rfc_mx_lookup_flow": false,
@@ -1205,6 +1288,7 @@ Truemail.host_audit.as_json
1205
1288
  },
1206
1289
  "configuration": {
1207
1290
  "blacklisted_domains": null,
1291
+ "blacklisted_mx_ip_addresses": null,
1208
1292
  "dns": null,
1209
1293
  "email_pattern": "default gem value",
1210
1294
  "not_rfc_mx_lookup_flow": false,
@@ -1242,6 +1326,7 @@ Truemail.validate('nonexistent_email@bestweb.com.ua').as_json
1242
1326
  ],
1243
1327
  "configuration": {
1244
1328
  "blacklisted_domains": null,
1329
+ "blacklisted_mx_ip_addresses": null,
1245
1330
  "dns": null,
1246
1331
  "email_pattern": "default gem value",
1247
1332
  "not_rfc_mx_lookup_flow": false,
@@ -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 check_domain_list(argument)
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
- constant = Truemail::RegexConstant.const_get("regex_#{method[/\A.+_(.+)=\z/, 1]}_pattern".upcase)
120
- raise_unless(argument, method, constant.match?(argument.to_s))
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 domain_matcher
128
- ->(domain) { Truemail::RegexConstant::REGEX_DOMAIN_PATTERN.match?(domain.to_s) }
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 check_domain(domain)
132
- raise_unless(domain, 'domain', domain_matcher.call(domain))
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
- check_domain(domain)
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