truemail 1.2.1 → 1.3.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/.reek.yml +3 -0
- data/Gemfile.lock +1 -1
- data/README.md +259 -55
- data/lib/truemail/audit/base.rb +5 -1
- data/lib/truemail/audit/ptr.rb +8 -4
- data/lib/truemail/auditor.rb +4 -6
- data/lib/truemail/configuration.rb +2 -1
- data/lib/truemail/validate/base.rb +1 -1
- data/lib/truemail/validate/mx.rb +1 -1
- data/lib/truemail/validate/smtp/request.rb +15 -7
- data/lib/truemail/validate/smtp.rb +1 -1
- data/lib/truemail/validator.rb +5 -4
- data/lib/truemail/version.rb +1 -1
- data/lib/truemail/wrapper.rb +7 -5
- data/lib/truemail.rb +14 -9
- data/truemail.gemspec +2 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a79768ed850e2481e1a818783ece53c2dcda4dc93e1b69c2c183fa7ba172f1e
|
4
|
+
data.tar.gz: 51f0d6958b0036733feda8b9dea2226a9dcab65536c111e0c2a503fe32d742eb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 76f5d8eb6f238ef14bae1012df322ceafe53c149263be9230cce6e60c5ba729cdc7c66f8d0f7d4f780521aae2e91139b888b49239caceeccb4bc3def7970e9a0
|
7
|
+
data.tar.gz: f472b4a46800af9c56303b99dd27854326a9afb040d33af11e8e0da12a1dd860cbcbe671ef879c1ef9f8c03065d2bbc1383e38954c845a60053d3f8be7075986
|
data/.reek.yml
CHANGED
@@ -17,6 +17,7 @@ detectors:
|
|
17
17
|
TooManyInstanceVariables:
|
18
18
|
exclude:
|
19
19
|
- Truemail::Configuration
|
20
|
+
- Truemail::Validate::Smtp::Request
|
20
21
|
|
21
22
|
Attribute:
|
22
23
|
exclude:
|
@@ -40,11 +41,13 @@ detectors:
|
|
40
41
|
- Truemail::Worker#success
|
41
42
|
- Truemail#raise_unless
|
42
43
|
- Truemail::Configuration#raise_unless
|
44
|
+
- Truemail#determine_configuration
|
43
45
|
|
44
46
|
FeatureEnvy:
|
45
47
|
exclude:
|
46
48
|
- Truemail::Validate::Smtp#not_includes_user_not_found_errors
|
47
49
|
- Truemail::GenerateEmailHelper#prepare_user_name
|
50
|
+
- Truemail::ConfigurationHelper#create_configuration
|
48
51
|
|
49
52
|
NilCheck:
|
50
53
|
exclude:
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[](https://codeclimate.com/github/rubygarage/truemail/maintainability) [](https://codeclimate.com/github/rubygarage/truemail/test_coverage) [](https://circleci.com/gh/rubygarage/truemail/tree/master) [](https://badge.fury.io/rb/truemail) [](https://rubygems.org/gems/truemail) [](CODE_OF_CONDUCT.md)
|
4
4
|
|
5
|
-
The Truemail gem helps you validate emails
|
5
|
+
The Truemail gem helps you validate emails via regex pattern, presence of DNS records, and real existence of email account on a current email server. Also Truemail gem allows performing an audit of the host in which runs.
|
6
6
|
|
7
7
|
## Features
|
8
8
|
|
@@ -34,17 +34,19 @@ Email validation is a tricky thing. There are a number of different ways to vali
|
|
34
34
|
|
35
35
|
**Syntax Checking**: Checks the email addresses via regex pattern.
|
36
36
|
|
37
|
-
**Mail Server Existence Check**: Checks the availability of the email address domain using DNS
|
37
|
+
**Mail Server Existence Check**: Checks the availability of the email address domain using DNS records.
|
38
38
|
|
39
39
|
**Mail Existence Check**: Checks if the email address really exists and can receive email via SMTP connections and email-sending emulation techniques.
|
40
40
|
|
41
41
|
## Usage
|
42
42
|
|
43
|
-
### Configuration features
|
43
|
+
### Configuration features
|
44
44
|
|
45
|
-
|
45
|
+
You can use global gem configuration or custom independent configuration.
|
46
46
|
|
47
|
-
|
47
|
+
#### Setting global configuration
|
48
|
+
|
49
|
+
To have an access for ```Truemail.configuration``` and gem configuration features, you must configure it first as in the example below:
|
48
50
|
|
49
51
|
```ruby
|
50
52
|
require 'truemail'
|
@@ -110,7 +112,7 @@ Truemail.configure do |config|
|
|
110
112
|
end
|
111
113
|
```
|
112
114
|
|
113
|
-
|
115
|
+
##### Read global configuration
|
114
116
|
|
115
117
|
After successful configuration, you can read current Truemail configuration instance anywhere in your application.
|
116
118
|
|
@@ -132,7 +134,7 @@ Truemail.configuration
|
|
132
134
|
@smtp_safe_check=true>
|
133
135
|
```
|
134
136
|
|
135
|
-
|
137
|
+
##### Update global configuration
|
136
138
|
|
137
139
|
```ruby
|
138
140
|
Truemail.configuration.connection_timeout = 3
|
@@ -158,7 +160,7 @@ Truemail.configuration
|
|
158
160
|
@smtp_safe_check=true>
|
159
161
|
```
|
160
162
|
|
161
|
-
|
163
|
+
##### Reset global configuration
|
162
164
|
|
163
165
|
Also you can reset Truemail configuration.
|
164
166
|
|
@@ -169,6 +171,23 @@ Truemail.configuration
|
|
169
171
|
=> nil
|
170
172
|
```
|
171
173
|
|
174
|
+
#### Using custom independent configuration
|
175
|
+
|
176
|
+
Allows to use independent configuration for each validation/audition instance. When using this feature you do not need to have Truemail global configuration.
|
177
|
+
|
178
|
+
```ruby
|
179
|
+
custom_configuration = Truemail::Configuration.new do |config|
|
180
|
+
config.verifier_email = 'verifier@example.com'
|
181
|
+
end
|
182
|
+
|
183
|
+
Truemail.validate('email@example.com', custom_configuration: custom_configuration)
|
184
|
+
Truemail.valid?('email@example.com', custom_configuration: custom_configuration)
|
185
|
+
Truemail.host_audit('email@example.com', custom_configuration: custom_configuration)
|
186
|
+
```
|
187
|
+
|
188
|
+
Please note, you should have global or custom configuration for use Truemail gem.
|
189
|
+
|
190
|
+
|
172
191
|
### Validation features
|
173
192
|
|
174
193
|
#### Whitelist/Blacklist check
|
@@ -210,6 +229,20 @@ Truemail.validate('email@white-domain.com')
|
|
210
229
|
mail_servers=[],
|
211
230
|
errors={},
|
212
231
|
smtp_debug=nil>,
|
232
|
+
configuration=#<Truemail::Configuration:0x00005629f801bd28
|
233
|
+
@blacklisted_domains=["black-domain.com", "somedomain.com"],
|
234
|
+
@connection_attempts=2,
|
235
|
+
@connection_timeout=2,
|
236
|
+
@default_validation_type=:smtp,
|
237
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
238
|
+
@response_timeout=2,
|
239
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
240
|
+
@smtp_safe_check=false,
|
241
|
+
@validation_type_by_domain={"somedomain.com"=>:mx},
|
242
|
+
@verifier_domain="example.com",
|
243
|
+
@verifier_email="verifier@example.com",
|
244
|
+
@whitelist_validation=false,
|
245
|
+
@whitelisted_domains=["white-domain.com", "somedomain.com"]>,
|
213
246
|
@validation_type=:whitelist>
|
214
247
|
```
|
215
248
|
|
@@ -241,6 +274,21 @@ Truemail.validate('email@white-domain.com', with: :regex)
|
|
241
274
|
mail_servers=[],
|
242
275
|
errors={},
|
243
276
|
smtp_debug=nil>,
|
277
|
+
configuration=
|
278
|
+
#<Truemail::Configuration:0x0000563f0d2605c8
|
279
|
+
@blacklisted_domains=[],
|
280
|
+
@connection_attempts=2,
|
281
|
+
@connection_timeout=2,
|
282
|
+
@default_validation_type=:smtp,
|
283
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
284
|
+
@response_timeout=2,
|
285
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
286
|
+
@smtp_safe_check=false,
|
287
|
+
@validation_type_by_domain={},
|
288
|
+
@verifier_domain="example.com",
|
289
|
+
@verifier_email="verifier@example.com",
|
290
|
+
@whitelist_validation=true,
|
291
|
+
@whitelisted_domains=["white-domain.com"]>,
|
244
292
|
@validation_type=:regex>
|
245
293
|
```
|
246
294
|
|
@@ -257,6 +305,21 @@ Truemail.validate('email@domain.com', with: :regex)
|
|
257
305
|
mail_servers=[],
|
258
306
|
errors={},
|
259
307
|
smtp_debug=nil>,
|
308
|
+
configuration=
|
309
|
+
#<Truemail::Configuration:0x0000563f0cd82ab0
|
310
|
+
@blacklisted_domains=[],
|
311
|
+
@connection_attempts=2,
|
312
|
+
@connection_timeout=2,
|
313
|
+
@default_validation_type=:smtp,
|
314
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
315
|
+
@response_timeout=2,
|
316
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
317
|
+
@smtp_safe_check=false,
|
318
|
+
@validation_type_by_domain={},
|
319
|
+
@verifier_domain="example.com",
|
320
|
+
@verifier_email="verifier@example.com",
|
321
|
+
@whitelist_validation=true,
|
322
|
+
@whitelisted_domains=["white-domain.com"]>,
|
260
323
|
@validation_type=:blacklist>
|
261
324
|
```
|
262
325
|
|
@@ -275,6 +338,21 @@ Truemail.validate('email@black-domain.com')
|
|
275
338
|
mail_servers=[],
|
276
339
|
errors={},
|
277
340
|
smtp_debug=nil>,
|
341
|
+
configuration=
|
342
|
+
#<Truemail::Configuration:0x0000563f0d36f4f0
|
343
|
+
@blacklisted_domains=[],
|
344
|
+
@connection_attempts=2,
|
345
|
+
@connection_timeout=2,
|
346
|
+
@default_validation_type=:smtp,
|
347
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
348
|
+
@response_timeout=2,
|
349
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
350
|
+
@smtp_safe_check=false,
|
351
|
+
@validation_type_by_domain={},
|
352
|
+
@verifier_domain="example.com",
|
353
|
+
@verifier_email="verifier@example.com",
|
354
|
+
@whitelist_validation=true,
|
355
|
+
@whitelisted_domains=["white-domain.com"]>,
|
278
356
|
@validation_type=:blacklist>
|
279
357
|
```
|
280
358
|
|
@@ -293,6 +371,21 @@ Truemail.validate('email@somedomain.com')
|
|
293
371
|
mail_servers=[],
|
294
372
|
errors={},
|
295
373
|
smtp_debug=nil>,
|
374
|
+
configuration=
|
375
|
+
#<Truemail::Configuration:0x0000563f0d3f8fc0
|
376
|
+
@blacklisted_domains=[],
|
377
|
+
@connection_attempts=2,
|
378
|
+
@connection_timeout=2,
|
379
|
+
@default_validation_type=:smtp,
|
380
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
381
|
+
@response_timeout=2,
|
382
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
383
|
+
@smtp_safe_check=false,
|
384
|
+
@validation_type_by_domain={},
|
385
|
+
@verifier_domain="example.com",
|
386
|
+
@verifier_email="verifier@example.com",
|
387
|
+
@whitelist_validation=true,
|
388
|
+
@whitelisted_domains=["white-domain.com"]>,
|
296
389
|
@validation_type=:whitelist>
|
297
390
|
```
|
298
391
|
|
@@ -327,6 +420,21 @@ Truemail.validate('email@example.com', with: :regex)
|
|
327
420
|
mail_servers=[],
|
328
421
|
errors={},
|
329
422
|
smtp_debug=nil>,
|
423
|
+
configuration=
|
424
|
+
#<Truemail::Configuration:0x000055aa56a54d48
|
425
|
+
@blacklisted_domains=[],
|
426
|
+
@connection_attempts=2,
|
427
|
+
@connection_timeout=2,
|
428
|
+
@default_validation_type=:smtp,
|
429
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
430
|
+
@response_timeout=2,
|
431
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
432
|
+
@smtp_safe_check=false,
|
433
|
+
@validation_type_by_domain={},
|
434
|
+
@verifier_domain="example.com",
|
435
|
+
@verifier_email="verifier@example.com",
|
436
|
+
@whitelist_validation=false,
|
437
|
+
@whitelisted_domains=[]>,
|
330
438
|
@validation_type=:regex>
|
331
439
|
```
|
332
440
|
|
@@ -351,6 +459,21 @@ Truemail.validate('email@example.com', with: :regex)
|
|
351
459
|
mail_servers=[],
|
352
460
|
errors={},
|
353
461
|
smtp_debug=nil>,
|
462
|
+
configuration=
|
463
|
+
#<Truemail::Configuration:0x0000560e58d80830
|
464
|
+
@blacklisted_domains=[],
|
465
|
+
@connection_attempts=2,
|
466
|
+
@connection_timeout=2,
|
467
|
+
@default_validation_type=:smtp,
|
468
|
+
@email_pattern=/regex_pattern/,
|
469
|
+
@response_timeout=2,
|
470
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
471
|
+
@smtp_safe_check=false,
|
472
|
+
@validation_type_by_domain={},
|
473
|
+
@verifier_domain="example.com",
|
474
|
+
@verifier_email="verifier@example.com",
|
475
|
+
@whitelist_validation=false,
|
476
|
+
@whitelisted_domains=[]>,
|
354
477
|
@validation_type=:regex>
|
355
478
|
```
|
356
479
|
|
@@ -384,6 +507,21 @@ Truemail.validate('email@example.com', with: :mx)
|
|
384
507
|
mail_servers=["127.0.1.1", "127.0.1.2"],
|
385
508
|
errors={},
|
386
509
|
smtp_debug=nil>,
|
510
|
+
configuration=
|
511
|
+
#<Truemail::Configuration:0x0000559b6e44af70
|
512
|
+
@blacklisted_domains=[],
|
513
|
+
@connection_attempts=2,
|
514
|
+
@connection_timeout=2,
|
515
|
+
@default_validation_type=:smtp,
|
516
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
517
|
+
@response_timeout=2,
|
518
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
519
|
+
@smtp_safe_check=false,
|
520
|
+
@validation_type_by_domain={},
|
521
|
+
@verifier_domain="example.com",
|
522
|
+
@verifier_email="verifier@example.com",
|
523
|
+
@whitelist_validation=false,
|
524
|
+
@whitelisted_domains=[]>,
|
387
525
|
@validation_type=:mx>
|
388
526
|
```
|
389
527
|
|
@@ -420,6 +558,21 @@ Truemail.validate('email@example.com')
|
|
420
558
|
mail_servers=["127.0.1.1", "127.0.1.2"],
|
421
559
|
errors={},
|
422
560
|
smtp_debug=nil>,
|
561
|
+
configuration=
|
562
|
+
#<Truemail::Configuration:0x00005615e87b9298
|
563
|
+
@blacklisted_domains=[],
|
564
|
+
@connection_attempts=2,
|
565
|
+
@connection_timeout=2,
|
566
|
+
@default_validation_type=:smtp,
|
567
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
568
|
+
@response_timeout=2,
|
569
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
570
|
+
@smtp_safe_check=false,
|
571
|
+
@validation_type_by_domain={},
|
572
|
+
@verifier_domain="example.com",
|
573
|
+
@verifier_email="verifier@example.com",
|
574
|
+
@whitelist_validation=false,
|
575
|
+
@whitelisted_domains=[]>,
|
423
576
|
@validation_type=:smtp>
|
424
577
|
|
425
578
|
# SMTP validation failed
|
@@ -434,17 +587,9 @@ Truemail.validate('email@example.com')
|
|
434
587
|
smtp_debug=
|
435
588
|
[#<Truemail::Validate::Smtp::Request:0x0000000002d49b10
|
436
589
|
@configuration=
|
437
|
-
#<Truemail::Configuration:
|
590
|
+
#<Truemail::Validate::Smtp::Request::Configuration:0x00005615e8d21848
|
438
591
|
@connection_timeout=2,
|
439
|
-
@email_pattern=/regex_pattern/,
|
440
|
-
@smtp_error_body_pattern=/regex_pattern/,
|
441
592
|
@response_timeout=2,
|
442
|
-
@connection_attempts=2,
|
443
|
-
@smtp_safe_check=false,
|
444
|
-
@validation_type_by_domain={},
|
445
|
-
@whitelisted_domains=[],
|
446
|
-
@whitelist_validation=false,
|
447
|
-
@blacklisted_domains=[],
|
448
593
|
@verifier_domain="example.com",
|
449
594
|
@verifier_email="verifier@example.com">,
|
450
595
|
@email="email@example.com",
|
@@ -464,6 +609,21 @@ Truemail.validate('email@example.com')
|
|
464
609
|
@string="250 OK\n">,
|
465
610
|
rcptto=false,
|
466
611
|
errors={:rcptto=>"550 User not found\n"}>>]>,
|
612
|
+
configuration=
|
613
|
+
#<Truemail::Configuration:0x00005615e87b9298
|
614
|
+
@blacklisted_domains=[],
|
615
|
+
@connection_attempts=2,
|
616
|
+
@connection_timeout=2,
|
617
|
+
@default_validation_type=:smtp,
|
618
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
619
|
+
@response_timeout=2,
|
620
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
621
|
+
@smtp_safe_check=false,
|
622
|
+
@validation_type_by_domain={},
|
623
|
+
@verifier_domain="example.com",
|
624
|
+
@verifier_email="verifier@example.com",
|
625
|
+
@whitelist_validation=false,
|
626
|
+
@whitelisted_domains=[]>,
|
467
627
|
@validation_type=:smtp>
|
468
628
|
```
|
469
629
|
|
@@ -491,33 +651,40 @@ Truemail.validate('email@example.com')
|
|
491
651
|
smtp_debug=
|
492
652
|
[#<Truemail::Validate::Smtp::Request:0x0000000002c95d40
|
493
653
|
@configuration=
|
494
|
-
#<Truemail::Configuration:
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
654
|
+
#<Truemail::Validate::Smtp::Request::Configuration:0x00005615e8d21848
|
655
|
+
@connection_timeout=2,
|
656
|
+
@response_timeout=2,
|
657
|
+
@verifier_domain="example.com",
|
658
|
+
@verifier_email="verifier@example.com">,
|
659
|
+
@email="email@example.com",
|
660
|
+
@host="127.0.1.1",
|
661
|
+
@attempts=nil,
|
662
|
+
@response=
|
663
|
+
#<struct Truemail::Validate::Smtp::Response
|
664
|
+
port_opened=true,
|
665
|
+
connection=false,
|
666
|
+
helo=
|
667
|
+
#<Net::SMTP::Response:0x0000000002c934c8
|
668
|
+
@status="250",
|
669
|
+
@string="250 127.0.1.1\n">,
|
670
|
+
mailfrom=false,
|
671
|
+
rcptto=nil,
|
672
|
+
errors={:mailfrom=>"554 5.7.1 Client host blocked\n", :connection=>"server dropped connection after response"}>>,]>,
|
673
|
+
configuration=
|
674
|
+
#<Truemail::Configuration:0x00005615e87b9298
|
675
|
+
@blacklisted_domains=[],
|
676
|
+
@connection_attempts=2,
|
677
|
+
@connection_timeout=2,
|
678
|
+
@default_validation_type=:smtp,
|
679
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
680
|
+
@response_timeout=2,
|
681
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
682
|
+
@smtp_safe_check=false,
|
683
|
+
@validation_type_by_domain={},
|
684
|
+
@verifier_domain="example.com",
|
685
|
+
@verifier_email="verifier@example.com",
|
686
|
+
@whitelist_validation=false,
|
687
|
+
@whitelisted_domains=[]>,
|
521
688
|
@validation_type=:smtp>
|
522
689
|
|
523
690
|
# SMTP validation failed
|
@@ -532,17 +699,9 @@ Truemail.validate('email@example.com')
|
|
532
699
|
smtp_debug=
|
533
700
|
[#<Truemail::Validate::Smtp::Request:0x0000000002d49b10
|
534
701
|
@configuration=
|
535
|
-
|
702
|
+
#<Truemail::Validate::Smtp::Request::Configuration:0x00005615e8d21848
|
536
703
|
@connection_timeout=2,
|
537
|
-
@email_pattern=/regex_pattern/,
|
538
|
-
@smtp_error_body_pattern=/regex_pattern/,
|
539
704
|
@response_timeout=2,
|
540
|
-
@connection_attempts=2,
|
541
|
-
@smtp_safe_check=true,
|
542
|
-
@validation_type_by_domain={},
|
543
|
-
@whitelisted_domains=[],
|
544
|
-
@whitelist_validation=false,
|
545
|
-
@blacklisted_domains=[],
|
546
705
|
@verifier_domain="example.com",
|
547
706
|
@verifier_email="verifier@example.com">,
|
548
707
|
@email="email@example.com",
|
@@ -559,6 +718,21 @@ Truemail.validate('email@example.com')
|
|
559
718
|
mailfrom=#<Net::SMTP::Response:0x0000000002d5a618 @status="250", @string="250 OK\n">,
|
560
719
|
rcptto=false,
|
561
720
|
errors={:rcptto=>"550 User not found\n"}>>]>,
|
721
|
+
configuration=
|
722
|
+
#<Truemail::Configuration:0x00005615e87b9298
|
723
|
+
@blacklisted_domains=[],
|
724
|
+
@connection_attempts=2,
|
725
|
+
@connection_timeout=2,
|
726
|
+
@default_validation_type=:smtp,
|
727
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
728
|
+
@response_timeout=2,
|
729
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
730
|
+
@smtp_safe_check=false,
|
731
|
+
@validation_type_by_domain={},
|
732
|
+
@verifier_domain="example.com",
|
733
|
+
@verifier_email="verifier@example.com",
|
734
|
+
@whitelist_validation=false,
|
735
|
+
@whitelisted_domains=[]>,
|
562
736
|
@validation_type=:smtp>
|
563
737
|
```
|
564
738
|
|
@@ -576,14 +750,44 @@ Truemail.host_audit
|
|
576
750
|
=> #<Truemail::Auditor:0x00005580df358828
|
577
751
|
@result=
|
578
752
|
#<struct Truemail::Auditor::Result
|
579
|
-
warnings={}
|
753
|
+
warnings={}>,
|
754
|
+
configuration=
|
755
|
+
#<Truemail::Configuration:0x00005615e86327a8
|
756
|
+
@blacklisted_domains=[],
|
757
|
+
@connection_attempts=2,
|
758
|
+
@connection_timeout=2,
|
759
|
+
@default_validation_type=:smtp,
|
760
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
761
|
+
@response_timeout=2,
|
762
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
763
|
+
@smtp_safe_check=false,
|
764
|
+
@validation_type_by_domain={},
|
765
|
+
@verifier_domain="example.com",
|
766
|
+
@verifier_email="verifier@example.com",
|
767
|
+
@whitelist_validation=false,
|
768
|
+
@whitelisted_domains=[]>
|
580
769
|
|
581
770
|
# Has PTR warning
|
582
771
|
=> #<Truemail::Auditor:0x00005580df358828
|
583
772
|
@result=
|
584
773
|
#<struct Truemail::Auditor::Result
|
585
774
|
warnings=
|
586
|
-
{:ptr=>"ptr record does not reference to current verifier domain"}
|
775
|
+
{:ptr=>"ptr record does not reference to current verifier domain"}>,
|
776
|
+
configuration=
|
777
|
+
#<Truemail::Configuration:0x00005615e86327a8
|
778
|
+
@blacklisted_domains=[],
|
779
|
+
@connection_attempts=2,
|
780
|
+
@connection_timeout=2,
|
781
|
+
@default_validation_type=:smtp,
|
782
|
+
@email_pattern=/(?=\A.{6,255}\z)(\A([a-zA-Z0-9]+[\w|\-|\.|\+]*)@((?i-mx:[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,63}))\z)/,
|
783
|
+
@response_timeout=2,
|
784
|
+
@smtp_error_body_pattern=/(?=.*550)(?=.*(user|account|customer|mailbox)).*/i,
|
785
|
+
@smtp_safe_check=false,
|
786
|
+
@validation_type_by_domain={},
|
787
|
+
@verifier_domain="example.com",
|
788
|
+
@verifier_email="verifier@example.com",
|
789
|
+
@whitelist_validation=false,
|
790
|
+
@whitelisted_domains=[]>
|
587
791
|
```
|
588
792
|
|
589
793
|
### Truemail helpers
|
data/lib/truemail/audit/base.rb
CHANGED
@@ -9,8 +9,12 @@ module Truemail
|
|
9
9
|
result.warnings[self.class.name.split('::').last.downcase.to_sym] = message
|
10
10
|
end
|
11
11
|
|
12
|
+
def configuration
|
13
|
+
result.configuration
|
14
|
+
end
|
15
|
+
|
12
16
|
def verifier_domain
|
13
|
-
|
17
|
+
configuration.verifier_domain
|
14
18
|
end
|
15
19
|
end
|
16
20
|
end
|
data/lib/truemail/audit/ptr.rb
CHANGED
@@ -27,7 +27,9 @@ module Truemail
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def current_host_address
|
30
|
-
@current_host_address ||= Truemail::Wrapper.call
|
30
|
+
@current_host_address ||= Truemail::Wrapper.call(configuration: configuration) do
|
31
|
+
IPAddr.new(detect_ip_via_ipify)
|
32
|
+
end
|
31
33
|
end
|
32
34
|
|
33
35
|
def current_host_reverse_lookup
|
@@ -35,7 +37,7 @@ module Truemail
|
|
35
37
|
end
|
36
38
|
|
37
39
|
def ptr_records
|
38
|
-
@ptr_records ||= Truemail::Wrapper.call do
|
40
|
+
@ptr_records ||= Truemail::Wrapper.call(configuration: configuration) do
|
39
41
|
Resolv::DNS.new.getresources(
|
40
42
|
current_host_reverse_lookup, Resolv::DNS::Resource::IN::PTR
|
41
43
|
).map { |ptr_record| ptr_record.name.to_s }
|
@@ -47,11 +49,13 @@ module Truemail
|
|
47
49
|
end
|
48
50
|
|
49
51
|
def a_record
|
50
|
-
Truemail::Wrapper.call
|
52
|
+
Truemail::Wrapper.call(configuration: configuration) do
|
53
|
+
Resolv::DNS.new.getaddress(verifier_domain).to_s
|
54
|
+
end
|
51
55
|
end
|
52
56
|
|
53
57
|
def verifier_domain_refer_to_current_host_address?
|
54
|
-
a_record
|
58
|
+
a_record.eql?(current_host_address.to_s)
|
55
59
|
end
|
56
60
|
end
|
57
61
|
end
|
data/lib/truemail/auditor.rb
CHANGED
@@ -2,18 +2,16 @@
|
|
2
2
|
|
3
3
|
module Truemail
|
4
4
|
class Auditor
|
5
|
-
Result = Struct.new(:warnings, keyword_init: true) do
|
5
|
+
Result = Struct.new(:warnings, :configuration, keyword_init: true) do
|
6
6
|
def initialize(warnings: {}, **args)
|
7
7
|
super
|
8
8
|
end
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
new.run
|
13
|
-
end
|
11
|
+
attr_reader :result
|
14
12
|
|
15
|
-
def
|
16
|
-
@result
|
13
|
+
def initialize(configuration:)
|
14
|
+
@result = Truemail::Auditor::Result.new(configuration: configuration)
|
17
15
|
end
|
18
16
|
|
19
17
|
def run
|
@@ -23,10 +23,11 @@ module Truemail
|
|
23
23
|
|
24
24
|
alias retry_count connection_attempts
|
25
25
|
|
26
|
-
def initialize
|
26
|
+
def initialize(&block)
|
27
27
|
instance_initializer.each do |instace_variable, value|
|
28
28
|
instance_variable_set(:"@#{instace_variable}", value)
|
29
29
|
end
|
30
|
+
tap(&block) if block_given?
|
30
31
|
end
|
31
32
|
|
32
33
|
%i[email_pattern smtp_error_body_pattern].each do |method|
|
data/lib/truemail/validate/mx.rb
CHANGED
@@ -11,12 +11,13 @@ module Truemail
|
|
11
11
|
RESPONSE_TIMEOUT_ERROR = 'server response timeout'
|
12
12
|
CONNECTION_DROPPED = 'server dropped connection after response'
|
13
13
|
|
14
|
-
attr_reader :host, :email, :response
|
14
|
+
attr_reader :configuration, :host, :email, :response
|
15
15
|
|
16
|
-
def initialize(host:, email:, attempts: nil)
|
16
|
+
def initialize(configuration:, host:, email:, attempts: nil)
|
17
|
+
@configuration = Truemail::Validate::Smtp::Request::Configuration.new(configuration)
|
18
|
+
@response = Truemail::Validate::Smtp::Response.new
|
17
19
|
@host = host
|
18
20
|
@email = email
|
19
|
-
@response = Truemail::Validate::Smtp::Response.new
|
20
21
|
@attempts = attempts
|
21
22
|
end
|
22
23
|
|
@@ -41,6 +42,17 @@ module Truemail
|
|
41
42
|
|
42
43
|
private
|
43
44
|
|
45
|
+
class Configuration
|
46
|
+
REQUEST_PARAMS = %i[connection_timeout response_timeout verifier_domain verifier_email].freeze
|
47
|
+
|
48
|
+
def initialize(configuration)
|
49
|
+
REQUEST_PARAMS.each do |attribute|
|
50
|
+
self.class.class_eval { attr_reader attribute }
|
51
|
+
instance_variable_set(:"@#{attribute}", configuration.public_send(attribute))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
44
56
|
attr_reader :attempts
|
45
57
|
|
46
58
|
def attempts_exist?
|
@@ -48,10 +60,6 @@ module Truemail
|
|
48
60
|
(@attempts -= 1).positive?
|
49
61
|
end
|
50
62
|
|
51
|
-
def configuration
|
52
|
-
@configuration ||= Truemail.configuration.dup.freeze
|
53
|
-
end
|
54
|
-
|
55
63
|
def session
|
56
64
|
Net::SMTP.new(host, Truemail::Validate::Smtp::Request::SMTP_PORT).tap do |settings|
|
57
65
|
settings.open_timeout = configuration.connection_timeout
|
@@ -40,7 +40,7 @@ module Truemail
|
|
40
40
|
def establish_smtp_connection
|
41
41
|
mail_servers.each do |mail_server|
|
42
42
|
smtp_results << Truemail::Validate::Smtp::Request.new(
|
43
|
-
host: mail_server, email: result.email, **attempts
|
43
|
+
configuration: configuration, host: mail_server, email: result.email, **attempts
|
44
44
|
)
|
45
45
|
next unless request.check_port
|
46
46
|
request.run || rcptto_error ? break : next
|
data/lib/truemail/validator.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Truemail
|
4
4
|
class Validator
|
5
|
-
RESULT_ATTRS = %i[success email domain mail_servers errors smtp_debug].freeze
|
5
|
+
RESULT_ATTRS = %i[success email domain mail_servers errors smtp_debug configuration].freeze
|
6
6
|
VALIDATION_TYPES = %i[regex mx smtp].freeze
|
7
7
|
|
8
8
|
Result = Struct.new(*RESULT_ATTRS, keyword_init: true) do
|
@@ -14,10 +14,11 @@ module Truemail
|
|
14
14
|
|
15
15
|
attr_reader :validation_type, :result
|
16
16
|
|
17
|
-
def initialize(email, with:
|
17
|
+
def initialize(email, with: nil, configuration:)
|
18
|
+
with ||= configuration.default_validation_type
|
18
19
|
raise Truemail::ArgumentError.new(with, :argument) unless Truemail::Validator::VALIDATION_TYPES.include?(with)
|
20
|
+
@result = Truemail::Validator::Result.new(email: email, configuration: configuration)
|
19
21
|
@validation_type = select_validation_type(email, with)
|
20
|
-
@result = Truemail::Validator::Result.new(email: email)
|
21
22
|
end
|
22
23
|
|
23
24
|
def run
|
@@ -38,7 +39,7 @@ module Truemail
|
|
38
39
|
|
39
40
|
def select_validation_type(email, current_validation_type)
|
40
41
|
domain = email[Truemail::RegexConstant::REGEX_EMAIL_PATTERN, 3]
|
41
|
-
|
42
|
+
result.configuration.validation_type_by_domain[domain] || current_validation_type
|
42
43
|
end
|
43
44
|
end
|
44
45
|
end
|
data/lib/truemail/version.rb
CHANGED
data/lib/truemail/wrapper.rb
CHANGED
@@ -2,18 +2,20 @@
|
|
2
2
|
|
3
3
|
module Truemail
|
4
4
|
class Wrapper
|
5
|
+
attr_reader :timeout
|
5
6
|
attr_accessor :attempts
|
6
7
|
|
7
|
-
def self.call(&block)
|
8
|
-
new.call(&block)
|
8
|
+
def self.call(configuration:, &block)
|
9
|
+
new(configuration).call(&block)
|
9
10
|
end
|
10
11
|
|
11
|
-
def initialize
|
12
|
-
@attempts =
|
12
|
+
def initialize(configuration)
|
13
|
+
@attempts = configuration.connection_attempts
|
14
|
+
@timeout = configuration.connection_timeout
|
13
15
|
end
|
14
16
|
|
15
17
|
def call(&block)
|
16
|
-
Timeout.timeout(
|
18
|
+
Timeout.timeout(timeout, &block)
|
17
19
|
rescue Resolv::ResolvError, IPAddr::InvalidAddressError
|
18
20
|
false
|
19
21
|
rescue Timeout::Error
|
data/lib/truemail.rb
CHANGED
@@ -4,7 +4,7 @@ require 'truemail/core'
|
|
4
4
|
|
5
5
|
module Truemail
|
6
6
|
INCOMPLETE_CONFIG = 'verifier_email is required parameter'
|
7
|
-
NOT_CONFIGURED = 'use Truemail.configure before'
|
7
|
+
NOT_CONFIGURED = 'use Truemail.configure before or pass custom configuration'
|
8
8
|
|
9
9
|
class << self
|
10
10
|
def configuration
|
@@ -12,7 +12,7 @@ module Truemail
|
|
12
12
|
return unless block_given?
|
13
13
|
configuration = Truemail::Configuration.new
|
14
14
|
yield(configuration)
|
15
|
-
raise_unless(configuration.complete?, INCOMPLETE_CONFIG)
|
15
|
+
raise_unless(configuration.complete?, Truemail::INCOMPLETE_CONFIG)
|
16
16
|
configuration
|
17
17
|
end
|
18
18
|
end
|
@@ -25,24 +25,29 @@ module Truemail
|
|
25
25
|
@configuration = nil
|
26
26
|
end
|
27
27
|
|
28
|
-
def validate(email, **options)
|
29
|
-
|
30
|
-
Truemail::Validator.new(email, **options).run
|
28
|
+
def validate(email, custom_configuration: nil, **options)
|
29
|
+
Truemail::Validator.new(email, configuration: determine_configuration(custom_configuration), **options).run
|
31
30
|
end
|
32
31
|
|
33
32
|
def valid?(email, **options)
|
34
33
|
validate(email, **options).result.valid?
|
35
34
|
end
|
36
35
|
|
37
|
-
def host_audit
|
38
|
-
|
39
|
-
Truemail::Auditor.run
|
36
|
+
def host_audit(custom_configuration: nil)
|
37
|
+
Truemail::Auditor.new(configuration: determine_configuration(custom_configuration)).run
|
40
38
|
end
|
41
39
|
|
42
40
|
private
|
43
41
|
|
44
42
|
def raise_unless(condition, message)
|
45
|
-
raise ConfigurationError, message unless condition
|
43
|
+
raise Truemail::ConfigurationError, message unless condition
|
44
|
+
end
|
45
|
+
|
46
|
+
def determine_configuration(custom_configuration)
|
47
|
+
current_configuration = custom_configuration || configuration
|
48
|
+
raise_unless(current_configuration, Truemail::NOT_CONFIGURED)
|
49
|
+
raise_unless(current_configuration.complete?, Truemail::INCOMPLETE_CONFIG)
|
50
|
+
current_configuration.dup.freeze
|
46
51
|
end
|
47
52
|
end
|
48
53
|
end
|
data/truemail.gemspec
CHANGED
@@ -11,7 +11,8 @@ Gem::Specification.new do |spec|
|
|
11
11
|
spec.email = ['admin@bestweb.com.ua']
|
12
12
|
|
13
13
|
spec.summary = %(truemail)
|
14
|
-
spec.description = %(Configurable plain
|
14
|
+
spec.description = %(Configurable plain Ruby email validator. Verify email via Regex, DNS and SMTP. Be sure that email address exists)
|
15
|
+
|
15
16
|
spec.homepage = 'https://github.com/rubygarage/truemail'
|
16
17
|
spec.license = 'MIT'
|
17
18
|
|
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: 1.
|
4
|
+
version: 1.3.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: 2019-
|
11
|
+
date: 2019-09-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -164,8 +164,8 @@ dependencies:
|
|
164
164
|
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
|
-
description: Configurable plain
|
168
|
-
|
167
|
+
description: Configurable plain Ruby email validator. Verify email via Regex, DNS
|
168
|
+
and SMTP. Be sure that email address exists
|
169
169
|
email:
|
170
170
|
- admin@bestweb.com.ua
|
171
171
|
executables: []
|