valid_email2 3.3.0 → 3.6.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -5
- data/CHANGELOG.md +19 -0
- data/README.md +16 -4
- data/config/disposable_email_domains.txt +55 -2
- data/lib/valid_email2.rb +28 -16
- data/lib/valid_email2/address.rb +24 -16
- data/lib/valid_email2/email_validator.rb +9 -1
- data/lib/valid_email2/version.rb +1 -1
- data/pull_mailchecker_emails.rb +1 -1
- data/spec/benchmark_spec.rb +18 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/valid_email2_spec.rb +63 -5
- data/valid_email2.gemspec +1 -0
- metadata +19 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e84cd1fd63d5212b95f59a0a5f690a741a359cc9b15e21ff1b2e531f13dc5df
|
4
|
+
data.tar.gz: d1625475d747e36ab893733330b5c5d359f059290d0c153ec6f4d3c5ad2c77f8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c5ba5da24f452053b31658e666f31e6b6ddf1607a59a2ed98b4e13f4f681838573ca8b3b02a29ecb2b8571d460cc1b7c08f96b1b59d91cdec5c02746a0774fbd
|
7
|
+
data.tar.gz: 1f446cae5d6ab54ad37ac56351f67519e48bf65468ebd2edc412afa8dce45d128ab2b5d0673f345eed84be61bc62300567c55b33089fc10f5d9a1c78012715b6
|
data/.travis.yml
CHANGED
@@ -3,21 +3,19 @@ language: ruby
|
|
3
3
|
sudo: false
|
4
4
|
|
5
5
|
rvm:
|
6
|
+
- 3.0
|
6
7
|
- 2.7
|
7
8
|
- 2.6
|
8
9
|
- 2.5
|
9
|
-
- 2.4
|
10
10
|
|
11
11
|
gemfile:
|
12
|
-
- gemfiles/activemodel3.gemfile
|
13
|
-
- gemfiles/activemodel4.gemfile
|
14
12
|
- gemfiles/activemodel5.gemfile
|
15
13
|
- gemfiles/activemodel6.gemfile
|
16
14
|
|
17
15
|
jobs:
|
18
16
|
exclude:
|
19
|
-
- rvm:
|
20
|
-
gemfile: gemfiles/
|
17
|
+
- rvm: 3.0
|
18
|
+
gemfile: gemfiles/activemodel5.gemfile
|
21
19
|
|
22
20
|
before_install:
|
23
21
|
- gem install bundler
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
## Version 3.6.1
|
2
|
+
* Add new domain https://github.com/micke/valid_email2/pull/175
|
3
|
+
* Pull new domains
|
4
|
+
|
5
|
+
## Version 3.6.0
|
6
|
+
* Add strict_mx validation https://github.com/micke/valid_email2/pull/173
|
7
|
+
|
8
|
+
## Version 3.5.0
|
9
|
+
* Disallow emails starting with a dot https://github.com/micke/valid_email2/pull/170
|
10
|
+
* Add option to whitelist domains from MX check https://github.com/micke/valid_email2/pull/167
|
11
|
+
* Remove false positives
|
12
|
+
|
13
|
+
## Version 3.4.0
|
14
|
+
* Disallow consecutive dots https://github.com/micke/valid_email2/pull/163
|
15
|
+
* Add andyes.net https://github.com/micke/valid_email2/pull/162
|
16
|
+
|
17
|
+
## Version 3.3.1
|
18
|
+
* Fix some performance regressions (https://github.com/micke/valid_email2/pull/150)
|
19
|
+
|
1
20
|
## Version 3.3.0
|
2
21
|
* Allow multiple addresses separated by comma (https://github.com/micke/valid_email2/pull/156)
|
3
22
|
* Make prohibited_domain_characters_regex changeable (https://github.com/micke/valid_email2/pull/157)
|
data/README.md
CHANGED
@@ -43,10 +43,14 @@ class User < ActiveRecord::Base
|
|
43
43
|
end
|
44
44
|
```
|
45
45
|
|
46
|
-
To validate that the domain has
|
46
|
+
To validate that the domain has an MX record or A record:
|
47
47
|
```ruby
|
48
48
|
validates :email, 'valid_email_2/email': { mx: true }
|
49
49
|
```
|
50
|
+
To validate strictly that the domain has an MX record:
|
51
|
+
```ruby
|
52
|
+
validates :email, 'valid_email_2/email': { strict_mx: true }
|
53
|
+
```
|
50
54
|
|
51
55
|
To validate that the domain is not a disposable email (checks domain and MX server):
|
52
56
|
```ruby
|
@@ -58,11 +62,17 @@ To validate that the domain is not a disposable email (checks domain only, does
|
|
58
62
|
validates :email, 'valid_email_2/email': { disposable_domain: true }
|
59
63
|
```
|
60
64
|
|
61
|
-
To validate that the domain is not a disposable email or a disposable email but whitelisted (under config/whitelisted_email_domains.yml):
|
65
|
+
To validate that the domain is not a disposable email or a disposable email (checks domain and MX server) but whitelisted (under config/whitelisted_email_domains.yml):
|
62
66
|
```ruby
|
63
67
|
validates :email, 'valid_email_2/email': { disposable_with_whitelist: true }
|
64
68
|
```
|
65
69
|
|
70
|
+
To validate that the domain is not a disposable email or a disposable email (checks domain only, does not check MX server) but whitelisted (under config/whitelisted_email_domains.yml):
|
71
|
+
|
72
|
+
```ruby
|
73
|
+
validates :email, 'valid_email_2/email': { disposable_domain_with_whitelist: true }
|
74
|
+
```
|
75
|
+
|
66
76
|
To validate that the domain is not blacklisted (under config/blacklisted_email_domains.yml):
|
67
77
|
```ruby
|
68
78
|
validates :email, 'valid_email_2/email': { blacklist: true }
|
@@ -103,6 +113,7 @@ address = ValidEmail2::Address.new("lisinge@gmail.com")
|
|
103
113
|
address.valid? => true
|
104
114
|
address.disposable? => false
|
105
115
|
address.valid_mx? => true
|
116
|
+
address.valid_strict_mx? => true
|
106
117
|
address.subaddressed? => false
|
107
118
|
```
|
108
119
|
|
@@ -114,6 +125,7 @@ Do so by adding this in your `spec_helper`:
|
|
114
125
|
```ruby
|
115
126
|
config.before(:each) do
|
116
127
|
allow_any_instance_of(ValidEmail2::Address).to receive(:valid_mx?).and_return(true)
|
128
|
+
allow_any_instance_of(ValidEmail2::Address).to receive(:valid_strict_mx?).and_return(true)
|
117
129
|
end
|
118
130
|
```
|
119
131
|
|
@@ -128,11 +140,11 @@ end
|
|
128
140
|
|
129
141
|
## Requirements
|
130
142
|
|
131
|
-
This gem
|
132
|
-
* Ruby-2.4
|
143
|
+
This gem should work with Rails 3.2 or higher. It is tested against Rails 5 and 6 using:
|
133
144
|
* Ruby-2.5
|
134
145
|
* Ruby-2.6
|
135
146
|
* Ruby-2.7
|
147
|
+
* Ruby-3.0
|
136
148
|
|
137
149
|
## Upgrading to v3.0.0
|
138
150
|
|
@@ -3398,6 +3398,7 @@ androidsapps.co
|
|
3398
3398
|
androidworld.tw
|
3399
3399
|
andthen.us
|
3400
3400
|
andy1mail.host
|
3401
|
+
andyes.net
|
3401
3402
|
andynugraha.net
|
3402
3403
|
andyyxc45.biz
|
3403
3404
|
aneaproducciones.com
|
@@ -4173,6 +4174,7 @@ avuimkgtbgccejft901.ml
|
|
4173
4174
|
avuimkgtbgccejft901.tk
|
4174
4175
|
avumail.com
|
4175
4176
|
avvmail.com
|
4177
|
+
avxrja.com
|
4176
4178
|
aw.kikwet.com
|
4177
4179
|
awahal0vk1o7gbyzf0.cf
|
4178
4180
|
awahal0vk1o7gbyzf0.ga
|
@@ -5175,6 +5177,7 @@ bitwhites.top
|
|
5175
5177
|
bitx.nl
|
5176
5178
|
bitymails.us
|
5177
5179
|
biuro-naprawcze.pl
|
5180
|
+
biyac.com
|
5178
5181
|
biz.st
|
5179
5182
|
bizalem.com
|
5180
5183
|
bizalon.com
|
@@ -8178,6 +8181,7 @@ datauoso.com
|
|
8178
8181
|
datawurld.com
|
8179
8182
|
datazo.ca
|
8180
8183
|
datchka.ru
|
8184
|
+
datenschutz.ru
|
8181
8185
|
datingbio.info
|
8182
8186
|
datingbit.info
|
8183
8187
|
datingcloud.info
|
@@ -8613,6 +8617,7 @@ dietysuplementy.pl
|
|
8613
8617
|
dieukydieuophonggiamso7.com
|
8614
8618
|
diffamr.com
|
8615
8619
|
diflucanrxmeds.com
|
8620
|
+
digdig.org
|
8616
8621
|
digdown.xyz
|
8617
8622
|
diggmail.club
|
8618
8623
|
digibeat.pl
|
@@ -9222,6 +9227,7 @@ dsfgdsgmail.com
|
|
9222
9227
|
dsfgdsgmail.net
|
9223
9228
|
dsfgerqwexx.com
|
9224
9229
|
dsgawerqw.com
|
9230
|
+
dsgvo.ru
|
9225
9231
|
dshqughcoin9nazl.cf
|
9226
9232
|
dshqughcoin9nazl.ga
|
9227
9233
|
dshqughcoin9nazl.gq
|
@@ -10977,6 +10983,7 @@ familylist.ru
|
|
10977
10983
|
familyright.ru
|
10978
10984
|
familytoday.us
|
10979
10985
|
fammix.com
|
10986
|
+
fanclub.pm
|
10980
10987
|
fancycarnavalmasks.com
|
10981
10988
|
fandamtastic.info
|
10982
10989
|
fangoh.com
|
@@ -11327,6 +11334,7 @@ financehowtolearn.com
|
|
11327
11334
|
financeideas.org
|
11328
11335
|
financeland.com
|
11329
11336
|
financetutorial.org
|
11337
|
+
finckl.com
|
11330
11338
|
find-me-watch.com
|
11331
11339
|
find.cy
|
11332
11340
|
findbesthgh.com
|
@@ -11356,6 +11364,7 @@ fireflies.edu
|
|
11356
11364
|
firemail.cc
|
11357
11365
|
firemail.org.ua
|
11358
11366
|
firemail.uz.ua
|
11367
|
+
firemailbox.club
|
11359
11368
|
firematchvn.cf
|
11360
11369
|
firematchvn.ga
|
11361
11370
|
firematchvn.gq
|
@@ -11982,6 +11991,7 @@ fuirio.com
|
|
11982
11991
|
fujitv.cf
|
11983
11992
|
fujitv.ga
|
11984
11993
|
fujitv.gq
|
11994
|
+
fukaru.com
|
11985
11995
|
fukolpza.com.pl
|
11986
11996
|
fuktard.co.in
|
11987
11997
|
fullalts.cf
|
@@ -12049,6 +12059,7 @@ fuw65d.tk
|
|
12049
12059
|
fuwa.be
|
12050
12060
|
fuwa.li
|
12051
12061
|
fuwamofu.com
|
12062
|
+
fuwari.be
|
12052
12063
|
fux0ringduh.com
|
12053
12064
|
fuzmail.info
|
12054
12065
|
fvhnqf7zbixgtgdimpn.cf
|
@@ -12788,6 +12799,7 @@ gmailllll.ga
|
|
12788
12799
|
gmaills.eu
|
12789
12800
|
gmailmail.ga
|
12790
12801
|
gmailmarina.com
|
12802
|
+
gmailnator.com
|
12791
12803
|
gmailner.com
|
12792
12804
|
gmailnew.com
|
12793
12805
|
gmailom.co
|
@@ -12938,6 +12950,7 @@ golivejasmin.com
|
|
12938
12950
|
gomail.in
|
12939
12951
|
gomail.pgojual.com
|
12940
12952
|
gomailbox.info
|
12953
|
+
gomaild.com
|
12941
12954
|
gomaile.com
|
12942
12955
|
gomailstar.xyz
|
12943
12956
|
gomessage.ml
|
@@ -13224,6 +13237,7 @@ grr.la
|
|
13224
13237
|
grruprkfj.pl
|
13225
13238
|
grubybenekrayskiego.pl
|
13226
13239
|
grubymail.com
|
13240
|
+
grugrug.ru
|
13227
13241
|
grupatworczapik.pl
|
13228
13242
|
gruz-m.ru
|
13229
13243
|
gry-logiczne-i-liczbowe.pl
|
@@ -13579,6 +13593,7 @@ halkasor.com
|
|
13579
13593
|
halofarmasi.com
|
13580
13594
|
haltospam.com
|
13581
13595
|
hamakdupajasia.com
|
13596
|
+
hamham.uk
|
13582
13597
|
hammerdin.com
|
13583
13598
|
hamsing.com
|
13584
13599
|
hamtwer.biz
|
@@ -13812,6 +13827,7 @@ hefrent.tk
|
|
13812
13827
|
hehesou.com
|
13813
13828
|
hehmail.pl
|
13814
13829
|
heihamail.com
|
13830
|
+
heisei.be
|
13815
13831
|
helamakbeszesc.com
|
13816
13832
|
hello.nl
|
13817
13833
|
hello123.com
|
@@ -14162,6 +14178,7 @@ homlee.com
|
|
14162
14178
|
homlee.mygbiz.com
|
14163
14179
|
honeydresses.com
|
14164
14180
|
honeydresses.net
|
14181
|
+
honeys.be
|
14165
14182
|
hongfany.com
|
14166
14183
|
hongpress.com
|
14167
14184
|
honkimailc.info
|
@@ -14949,6 +14966,7 @@ ilovemyniggers.club
|
|
14949
14966
|
ilovespam.com
|
14950
14967
|
ilt.ctu.edu.gr
|
14951
14968
|
iltmail.com
|
14969
|
+
iludir.com
|
14952
14970
|
ilumail.com
|
14953
14971
|
im-irsyad.tech
|
14954
14972
|
im4ever.com
|
@@ -16364,6 +16382,7 @@ kadokawa.gq
|
|
16364
16382
|
kadokawa.ml
|
16365
16383
|
kadokawa.tk
|
16366
16384
|
kadokawa.top
|
16385
|
+
kaengu.ru
|
16367
16386
|
kafrem3456ails.com
|
16368
16387
|
kaguya.tk
|
16369
16388
|
kah.pw
|
@@ -16485,6 +16504,7 @@ kbbxowpdcpvkxmalz.tk
|
|
16485
16504
|
kbdjvgznhslz.ga
|
16486
16505
|
kbdjvgznhslz.ml
|
16487
16506
|
kbdjvgznhslz.tk
|
16507
|
+
kbox.li
|
16488
16508
|
kc-kenes.kz
|
16489
16509
|
kc8pnm1p9.pl
|
16490
16510
|
kchkch.com
|
@@ -18053,6 +18073,7 @@ louboutinshoessalejp.com
|
|
18053
18073
|
louboutinshoesstoresjp.com
|
18054
18074
|
louboutinshoesus.com
|
18055
18075
|
louder1.bid
|
18076
|
+
loufad.com
|
18056
18077
|
louis-vuitton-onlinestore.com
|
18057
18078
|
louis-vuitton-outlet.com
|
18058
18079
|
louis-vuitton-outletenter.com
|
@@ -18519,6 +18540,7 @@ magicedhardy.com
|
|
18519
18540
|
magicmail.com
|
18520
18541
|
magiconly.ru
|
18521
18542
|
magicsubmitter.biz
|
18543
|
+
magim.be
|
18522
18544
|
magneticmessagingbobby.com
|
18523
18545
|
magnetik.com.ua
|
18524
18546
|
magnomsolutions.com
|
@@ -19433,6 +19455,7 @@ maxmail.in
|
|
19433
19455
|
maxmail.info
|
19434
19456
|
maxpedia.ro
|
19435
19457
|
maxprice.co
|
19458
|
+
maxresistance.com
|
19436
19459
|
maxrollspins.co
|
19437
19460
|
maxxdrv.ru
|
19438
19461
|
mayaaaa.cf
|
@@ -19890,6 +19913,7 @@ miopaaswod.jino.ru
|
|
19890
19913
|
mior.in
|
19891
19914
|
mipodon.ga
|
19892
19915
|
miraclegarciniareview.com
|
19916
|
+
mirai.re
|
19893
19917
|
miraigames.net
|
19894
19918
|
miranda1121.club
|
19895
19919
|
mirbeauty.ru
|
@@ -20086,6 +20110,7 @@ mohmal.in
|
|
20086
20110
|
mohmal.tech
|
20087
20111
|
mohsenfb.com
|
20088
20112
|
moijkh.com.uk
|
20113
|
+
moimoi.re
|
20089
20114
|
mojastr.pl
|
20090
20115
|
mojblogg.com
|
20091
20116
|
mojewiki.com
|
@@ -20414,6 +20439,10 @@ mucincanon.com
|
|
20414
20439
|
mudbox.ml
|
20415
20440
|
muehlacker.tk
|
20416
20441
|
muell.email
|
20442
|
+
muell.icu
|
20443
|
+
muell.monster
|
20444
|
+
muell.ru
|
20445
|
+
muell.xyz
|
20417
20446
|
muellemail.com
|
20418
20447
|
muellmail.com
|
20419
20448
|
muellpost.de
|
@@ -22154,6 +22183,7 @@ ohmail.com
|
|
22154
22183
|
ohtheprice.com
|
22155
22184
|
ohxmail.com
|
22156
22185
|
ohyesjysuis.fr
|
22186
|
+
oida.icu
|
22157
22187
|
oidzc1zgxrktxdwdkxm.cf
|
22158
22188
|
oidzc1zgxrktxdwdkxm.ga
|
22159
22189
|
oidzc1zgxrktxdwdkxm.gq
|
@@ -22714,6 +22744,7 @@ oweiidfjjif.tk
|
|
22714
22744
|
owemolexi.swiebodzin.pl
|
22715
22745
|
owfcbxqhv.pl
|
22716
22746
|
owh.ooo
|
22747
|
+
owleyes.ch
|
22717
22748
|
owlpic.com
|
22718
22749
|
owlymail.com
|
22719
22750
|
own-tube.com
|
@@ -24591,6 +24622,7 @@ quintalaescondida.com
|
|
24591
24622
|
quintania.top
|
24592
24623
|
quitsmokinghelpfulguide.net
|
24593
24624
|
quitsmokingmanyguides.net
|
24625
|
+
quossum.com
|
24594
24626
|
ququb.com
|
24595
24627
|
quuradminb.com
|
24596
24628
|
quxppnmrn.pl
|
@@ -26124,6 +26156,7 @@ scannerchip.com
|
|
26124
26156
|
scatmail.com
|
26125
26157
|
scay.net
|
26126
26158
|
scbox.one.pl
|
26159
|
+
schabernack.ru
|
26127
26160
|
schachrol.com
|
26128
26161
|
schackmail.com
|
26129
26162
|
schafmail.de
|
@@ -26307,6 +26340,7 @@ segundamanozi.net
|
|
26307
26340
|
seierra.com
|
26308
26341
|
seishel-nedv.ru
|
26309
26342
|
sejaa.lv
|
26343
|
+
sejkt.com
|
26310
26344
|
sekcjajudo.pl
|
26311
26345
|
sekoeuropa.pl
|
26312
26346
|
selectam.ru
|
@@ -26744,6 +26778,7 @@ sify.com
|
|
26744
26778
|
sign-up.website
|
26745
26779
|
signaturefencecompany.com
|
26746
26780
|
signings.ru
|
26781
|
+
sika3.com
|
26747
26782
|
sikdar.site
|
26748
26783
|
sikis18.org
|
26749
26784
|
sikomo.cf
|
@@ -27632,6 +27667,7 @@ statusers.com
|
|
27632
27667
|
statuspage.ga
|
27633
27668
|
statx.ga
|
27634
27669
|
stayfitforever.org
|
27670
|
+
stayhome.li
|
27635
27671
|
stealbest.com
|
27636
27672
|
stealthapps.org
|
27637
27673
|
stealthypost.org
|
@@ -27880,6 +27916,7 @@ sumberkadalnya.com
|
|
27880
27916
|
sumitra.ga
|
27881
27917
|
sumitra.tk
|
27882
27918
|
summerswimwear.info
|
27919
|
+
sumwan.com
|
27883
27920
|
sunbuh.asia
|
27884
27921
|
sunburning.ru
|
27885
27922
|
sundaysuspense.space
|
@@ -28257,6 +28294,7 @@ tapchicuoihoi.com
|
|
28257
28294
|
tapetoland.pl
|
28258
28295
|
tapety-download.pl
|
28259
28296
|
taphear.com
|
28297
|
+
tapi.re
|
28260
28298
|
tapsitoaktl353t.ga
|
28261
28299
|
tar00ih60tpt2h7.cf
|
28262
28300
|
tar00ih60tpt2h7.ga
|
@@ -29162,6 +29200,7 @@ tomsshoesoutlet2u.com
|
|
29162
29200
|
tomthen.org.ua
|
29163
29201
|
tomymailpost.com
|
29164
29202
|
tonermix.ru
|
29203
|
+
tonne.to
|
29165
29204
|
tonngokhong.vn
|
29166
29205
|
tonno.cf
|
29167
29206
|
tonno.gq
|
@@ -29519,6 +29558,7 @@ tridalinbox.info
|
|
29519
29558
|
triedbook.xyz
|
29520
29559
|
trillianpro.com
|
29521
29560
|
trimsj.com
|
29561
|
+
tripaco.com
|
29522
29562
|
triparish.net
|
29523
29563
|
tripolis.com
|
29524
29564
|
tristanabestolaf.com
|
@@ -30315,6 +30355,7 @@ usamail.com
|
|
30315
30355
|
usaonline.biz
|
30316
30356
|
usapurse.com
|
30317
30357
|
usareplicawatch.com
|
30358
|
+
usbc.be
|
30318
30359
|
usbdirect.ca
|
30319
30360
|
usbgadgetsusage.info
|
30320
30361
|
usbmicrophone.org.uk
|
@@ -30738,6 +30779,7 @@ viagrawithoutadoctorprescription777.bid
|
|
30738
30779
|
viajando.net
|
30739
30780
|
viano.com
|
30740
30781
|
viantakte.ru
|
30782
|
+
viatokyo.jp
|
30741
30783
|
vibi4f1pc2xjk.cf
|
30742
30784
|
vibi4f1pc2xjk.ga
|
30743
30785
|
vibi4f1pc2xjk.gq
|
@@ -31026,7 +31068,6 @@ voyagebirmanie.net
|
|
31026
31068
|
voyancegratuite10min.com
|
31027
31069
|
voyeurseite.info
|
31028
31070
|
vozmivtop.ru
|
31029
|
-
vp.com
|
31030
31071
|
vp.ycare.de
|
31031
31072
|
vpanel.ru
|
31032
31073
|
vpc608a0.pl
|
@@ -31064,6 +31105,7 @@ vpstrk.com
|
|
31064
31105
|
vr5gpowerv.com
|
31065
31106
|
vradportal.com
|
31066
31107
|
vraskrutke.biz
|
31108
|
+
vreagles.com
|
31067
31109
|
vreeland.agencja-csk.pl
|
31068
31110
|
vreemail.com
|
31069
31111
|
vremonte24-store.ru
|
@@ -31423,7 +31465,6 @@ webcontact-france.eu
|
|
31423
31465
|
webcool.club
|
31424
31466
|
webdesign-guide.info
|
31425
31467
|
webdesign-romania.net
|
31426
|
-
webdesignspecialist.com.au
|
31427
31468
|
webdesigrsbio.gr
|
31428
31469
|
webdespro.ru
|
31429
31470
|
webdev-pro.ru
|
@@ -31539,6 +31580,7 @@ welleveningdress.net
|
|
31539
31580
|
welleveningdresses.com
|
31540
31581
|
welleveningdresses.net
|
31541
31582
|
wellhungup.dynu.net
|
31583
|
+
wellick.ru
|
31542
31584
|
wellnessintexas.info
|
31543
31585
|
wellpromdresses.com
|
31544
31586
|
wellpromdresses.net
|
@@ -31656,6 +31698,7 @@ wherenever.tk
|
|
31656
31698
|
wheretoget-backlinks.com
|
31657
31699
|
which-code.com
|
31658
31700
|
whiffles.org
|
31701
|
+
whipjoy.com
|
31659
31702
|
whiplashh.com
|
31660
31703
|
whiskey.xray.ezbunko.top
|
31661
31704
|
whiskeyalpha.webmailious.top
|
@@ -32328,6 +32371,7 @@ xdvsagsdg4we.ga
|
|
32328
32371
|
xe2g.com
|
32329
32372
|
xeames.net
|
32330
32373
|
xeb9xwp7.tk
|
32374
|
+
xedmi.com
|
32331
32375
|
xemaps.com
|
32332
32376
|
xemne.com
|
32333
32377
|
xenacareholdings.com
|
@@ -32378,6 +32422,7 @@ xhkss.net
|
|
32378
32422
|
xijjfjoo.turystyka.pl
|
32379
32423
|
xilopro.com
|
32380
32424
|
xilor.com
|
32425
|
+
ximtyl.com
|
32381
32426
|
xinbo.info
|
32382
32427
|
xinbox.info
|
32383
32428
|
xinfi.com.pl
|
@@ -32864,6 +32909,8 @@ yeamail.info
|
|
32864
32909
|
yeastinfectionnomorenow.com
|
32865
32910
|
yedi.org
|
32866
32911
|
yeeeou.org.ua
|
32912
|
+
yeezus.ru
|
32913
|
+
yehudabx.com
|
32867
32914
|
yejdnp45ie1to.cf
|
32868
32915
|
yejdnp45ie1to.ga
|
32869
32916
|
yejdnp45ie1to.gq
|
@@ -33101,6 +33148,7 @@ youtube2vimeo.info
|
|
33101
33148
|
youveo.ch
|
33102
33149
|
youwatchmovie.com
|
33103
33150
|
youzend.net
|
33151
|
+
ype68.com
|
33104
33152
|
ypmail.webarnak.fr.eu.org
|
33105
33153
|
yppm0z5sjif.ga
|
33106
33154
|
yppm0z5sjif.gq
|
@@ -33318,6 +33366,9 @@ zbtxx4iblkgp0qh.ga
|
|
33318
33366
|
zbtxx4iblkgp0qh.gq
|
33319
33367
|
zbtxx4iblkgp0qh.ml
|
33320
33368
|
zbtxx4iblkgp0qh.tk
|
33369
|
+
zcai55.com
|
33370
|
+
zcai66.com
|
33371
|
+
zcai77.com
|
33321
33372
|
zcash-cloud.com
|
33322
33373
|
zchatz.ga
|
33323
33374
|
zcqrgaogm.pl
|
@@ -33340,6 +33391,7 @@ zebra.email
|
|
33340
33391
|
zebua.cf
|
33341
33392
|
zebuaboy.cf
|
33342
33393
|
zebuasadis.ml
|
33394
|
+
zefara.com
|
33343
33395
|
zehnminuten.de
|
33344
33396
|
zehnminutenmail.de
|
33345
33397
|
zeinconsulting.info
|
@@ -33385,6 +33437,7 @@ zetfilmy.pl
|
|
33385
33437
|
zetia.in
|
33386
33438
|
zetmail.com
|
33387
33439
|
zettransport.pl
|
33440
|
+
zevars.com
|
33388
33441
|
zeveyuse.com
|
33389
33442
|
zeveyuse.net
|
33390
33443
|
zexeet9i5l49ocke.cf
|
data/lib/valid_email2.rb
CHANGED
@@ -7,23 +7,35 @@ module ValidEmail2
|
|
7
7
|
WHITELIST_FILE = "config/whitelisted_email_domains.yml"
|
8
8
|
DISPOSABLE_FILE = File.expand_path('../config/disposable_email_domains.txt', __dir__)
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
class << self
|
11
|
+
def disposable_emails
|
12
|
+
@disposable_emails ||= load_file(DISPOSABLE_FILE)
|
13
|
+
end
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
15
|
+
def blacklist
|
16
|
+
@blacklist ||= load_if_exists(BLACKLIST_FILE)
|
17
|
+
end
|
18
|
+
|
19
|
+
def whitelist
|
20
|
+
@whitelist ||= load_if_exists(WHITELIST_FILE)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def load_if_exists(path)
|
26
|
+
File.exist?(path) ? load_file(path) : Set.new
|
27
|
+
end
|
21
28
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
29
|
+
def load_file(path)
|
30
|
+
# This method MUST return a Set, otherwise the
|
31
|
+
# performance will suffer!
|
32
|
+
if path.end_with?(".yml")
|
33
|
+
Set.new(YAML.load_file(path))
|
34
|
+
else
|
35
|
+
File.open(path, "r").each_line.each_with_object(Set.new) do |domain, set|
|
36
|
+
set << domain.tap(&:chomp!)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
28
40
|
end
|
29
41
|
end
|
data/lib/valid_email2/address.rb
CHANGED
@@ -32,25 +32,22 @@ module ValidEmail2
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def valid?
|
35
|
-
@valid
|
36
|
-
|
35
|
+
return @valid unless @valid.nil?
|
36
|
+
return false if @parse_error
|
37
37
|
|
38
|
+
@valid = begin
|
38
39
|
if address.domain && address.address == @raw_address
|
39
40
|
domain = address.domain
|
40
41
|
|
41
42
|
domain !~ self.class.prohibited_domain_characters_regex &&
|
42
|
-
|
43
|
-
domain
|
44
|
-
|
45
|
-
domain
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
# Domain name may not end with a dash
|
51
|
-
domain !~ /-\./ &&
|
52
|
-
# Address may not contain a dot directly before @
|
53
|
-
address.address !~ /\.@/
|
43
|
+
domain.include?('.') &&
|
44
|
+
!domain.include?('..') &&
|
45
|
+
!domain.start_with?('.') &&
|
46
|
+
!domain.start_with?('-') &&
|
47
|
+
!domain.include?('-.') &&
|
48
|
+
!address.local.include?('..') &&
|
49
|
+
!address.local.end_with?('.') &&
|
50
|
+
!address.local.start_with?('.')
|
54
51
|
else
|
55
52
|
false
|
56
53
|
end
|
@@ -70,7 +67,7 @@ module ValidEmail2
|
|
70
67
|
end
|
71
68
|
|
72
69
|
def disposable_domain?
|
73
|
-
|
70
|
+
domain_is_in?(ValidEmail2.disposable_emails)
|
74
71
|
end
|
75
72
|
|
76
73
|
def disposable_mx_server?
|
@@ -88,6 +85,12 @@ module ValidEmail2
|
|
88
85
|
def valid_mx?
|
89
86
|
return false unless valid?
|
90
87
|
|
88
|
+
mx_or_a_servers.any?
|
89
|
+
end
|
90
|
+
|
91
|
+
def valid_strict_mx?
|
92
|
+
return false unless valid?
|
93
|
+
|
91
94
|
mx_servers.any?
|
92
95
|
end
|
93
96
|
|
@@ -122,7 +125,12 @@ module ValidEmail2
|
|
122
125
|
|
123
126
|
def mx_servers
|
124
127
|
@mx_servers ||= Resolv::DNS.open do |dns|
|
125
|
-
|
128
|
+
dns.getresources(address.domain, Resolv::DNS::Resource::IN::MX)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
def mx_or_a_servers
|
133
|
+
@mx_or_a_servers ||= Resolv::DNS.open do |dns|
|
126
134
|
(mx_servers.any? && mx_servers) ||
|
127
135
|
dns.getresources(address.domain, Resolv::DNS::Resource::IN::A)
|
128
136
|
end
|
@@ -5,7 +5,7 @@ require "active_model/validations"
|
|
5
5
|
module ValidEmail2
|
6
6
|
class EmailValidator < ActiveModel::EachValidator
|
7
7
|
def default_options
|
8
|
-
{ regex: true, disposable: false, mx: false, disallow_subaddressing: false, multiple: false }
|
8
|
+
{ regex: true, disposable: false, mx: false, strict_mx: false, disallow_subaddressing: false, multiple: false }
|
9
9
|
end
|
10
10
|
|
11
11
|
def validate_each(record, attribute, value)
|
@@ -37,6 +37,10 @@ module ValidEmail2
|
|
37
37
|
error(record, attribute) && return if addresses.any? { |address| address.disposable? && !address.whitelisted? }
|
38
38
|
end
|
39
39
|
|
40
|
+
if options[:disposable_domain_with_whitelist]
|
41
|
+
error(record, attribute) && return if addresses.any? { |address| address.disposable_domain? && !address.whitelisted? }
|
42
|
+
end
|
43
|
+
|
40
44
|
if options[:blacklist]
|
41
45
|
error(record, attribute) && return if addresses.any?(&:blacklisted?)
|
42
46
|
end
|
@@ -44,6 +48,10 @@ module ValidEmail2
|
|
44
48
|
if options[:mx]
|
45
49
|
error(record, attribute) && return unless addresses.all?(&:valid_mx?)
|
46
50
|
end
|
51
|
+
|
52
|
+
if options[:strict_mx]
|
53
|
+
error(record, attribute) && return unless addresses.all?(&:valid_strict_mx?)
|
54
|
+
end
|
47
55
|
end
|
48
56
|
|
49
57
|
def error(record, attribute)
|
data/lib/valid_email2/version.rb
CHANGED
data/pull_mailchecker_emails.rb
CHANGED
@@ -8,7 +8,7 @@ require "net/http"
|
|
8
8
|
whitelisted_emails = %w(
|
9
9
|
onet.pl poczta.onet.pl fastmail.fm hushmail.com
|
10
10
|
hush.ai hush.com hushmail.me naver.com qq.com example.com
|
11
|
-
yandex.net gmx.com gmx.es
|
11
|
+
yandex.net gmx.com gmx.es webdesignspecialist.com.au vp.com
|
12
12
|
)
|
13
13
|
|
14
14
|
existing_emails = File.open("config/disposable_email_domains.txt") { |f| f.read.split("\n") }
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
|
5
|
+
describe "Performance testing" do
|
6
|
+
let(:disposable_domain) { ValidEmail2.disposable_emails.first }
|
7
|
+
|
8
|
+
it "has acceptable lookup performance" do
|
9
|
+
address = ValidEmail2::Address.new("test@example.com")
|
10
|
+
|
11
|
+
# preload list and check size
|
12
|
+
expect(ValidEmail2.disposable_emails).to be_a(Set)
|
13
|
+
expect(ValidEmail2.disposable_emails.count).to be > 30000
|
14
|
+
|
15
|
+
# check lookup timing
|
16
|
+
expect { address.disposable_domain? }.to perform_under(0.0001).sample(10).times
|
17
|
+
end
|
18
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,15 @@
|
|
1
1
|
$:.unshift File.expand_path("../lib",__FILE__)
|
2
2
|
require "valid_email2"
|
3
3
|
|
4
|
+
# Include and configure benchmark
|
5
|
+
require 'rspec-benchmark'
|
6
|
+
RSpec.configure do |config|
|
7
|
+
config.include RSpec::Benchmark::Matchers
|
8
|
+
end
|
9
|
+
RSpec::Benchmark.configure do |config|
|
10
|
+
config.disable_gc = true
|
11
|
+
end
|
12
|
+
|
4
13
|
class TestModel
|
5
14
|
include ActiveModel::Validations
|
6
15
|
|
data/spec/valid_email2_spec.rb
CHANGED
@@ -19,6 +19,10 @@ class TestUserMX < TestModel
|
|
19
19
|
validates :email, 'valid_email_2/email': { mx: true }
|
20
20
|
end
|
21
21
|
|
22
|
+
class TestUserStrictMX < TestModel
|
23
|
+
validates :email, 'valid_email_2/email': { strict_mx: true }
|
24
|
+
end
|
25
|
+
|
22
26
|
class TestUserDisallowDisposable < TestModel
|
23
27
|
validates :email, 'valid_email_2/email': { disposable: true }
|
24
28
|
end
|
@@ -31,6 +35,10 @@ class TestUserDisallowDisposableWithWhitelist < TestModel
|
|
31
35
|
validates :email, 'valid_email_2/email': { disposable_with_whitelist: true }
|
32
36
|
end
|
33
37
|
|
38
|
+
class TestUserDisallowDisposableDomainWithWhitelist < TestModel
|
39
|
+
validates :email, 'valid_email_2/email': { disposable_domain_with_whitelist: true }
|
40
|
+
end
|
41
|
+
|
34
42
|
class TestUserDisallowBlacklisted < TestModel
|
35
43
|
validates :email, 'valid_email_2/email': { blacklist: true }
|
36
44
|
end
|
@@ -87,13 +95,23 @@ describe ValidEmail2 do
|
|
87
95
|
expect(user.valid?).to be_falsey
|
88
96
|
end
|
89
97
|
|
90
|
-
it "is invalid if the
|
91
|
-
user = TestUser.new(email: "foo
|
92
|
-
expect(user.valid?).to
|
98
|
+
it "is invalid if the address contains consecutive dots" do
|
99
|
+
user = TestUser.new(email: "foo..bar@gmail.com")
|
100
|
+
expect(user.valid?).to be_falsey
|
101
|
+
end
|
102
|
+
|
103
|
+
it "is invalid if the address starts with a dot" do
|
104
|
+
user = TestUser.new(email: ".foo@bar.com")
|
105
|
+
expect(user.valid?).to be_falsey
|
93
106
|
end
|
94
107
|
|
95
|
-
it "is invalid if the
|
96
|
-
user = TestUser.new(email: "foo.@
|
108
|
+
it "is invalid if the local part of the address ends with a dot" do
|
109
|
+
user = TestUser.new(email: "foo.@bar.com")
|
110
|
+
expect(user.valid?).to be_falsey
|
111
|
+
end
|
112
|
+
|
113
|
+
it "is invalid if the email contains emoticons" do
|
114
|
+
user = TestUser.new(email: "foo🙈@gmail.com")
|
97
115
|
expect(user.valid?).to be_falsy
|
98
116
|
end
|
99
117
|
|
@@ -170,8 +188,18 @@ describe ValidEmail2 do
|
|
170
188
|
let(:whitelist_domain) { disposable_domain }
|
171
189
|
let(:whitelist_file_path) { "config/whitelisted_email_domains.yml" }
|
172
190
|
|
191
|
+
# Some of the specs below need to explictly set the whitelist var or it
|
192
|
+
# may be cached to an empty set
|
193
|
+
def set_whitelist
|
194
|
+
ValidEmail2.instance_variable_set(
|
195
|
+
:@whitelist,
|
196
|
+
ValidEmail2.send(:load_if_exists, ValidEmail2::WHITELIST_FILE)
|
197
|
+
)
|
198
|
+
end
|
199
|
+
|
173
200
|
after do
|
174
201
|
FileUtils.rm(whitelist_file_path, force: true)
|
202
|
+
set_whitelist
|
175
203
|
end
|
176
204
|
|
177
205
|
it "is invalid if the domain is disposable and not in the whitelist" do
|
@@ -181,9 +209,22 @@ describe ValidEmail2 do
|
|
181
209
|
|
182
210
|
it "is valid if the domain is disposable but in the whitelist" do
|
183
211
|
File.open(whitelist_file_path, "w") { |f| f.write [whitelist_domain].to_yaml }
|
212
|
+
set_whitelist
|
184
213
|
user = TestUserDisallowDisposableWithWhitelist.new(email: "foo@#{whitelist_domain}")
|
214
|
+
expect(user.valid?).to be_truthy
|
215
|
+
end
|
216
|
+
|
217
|
+
it "is invalid if the domain is a disposable_domain and not in the whitelist" do
|
218
|
+
user = TestUserDisallowDisposableDomainWithWhitelist.new(email: "foo@#{whitelist_domain}")
|
185
219
|
expect(user.valid?).to be_falsey
|
186
220
|
end
|
221
|
+
|
222
|
+
it "is valid if the domain is a disposable_domain but in the whitelist" do
|
223
|
+
File.open(whitelist_file_path, "w") { |f| f.write [whitelist_domain].to_yaml }
|
224
|
+
set_whitelist
|
225
|
+
user = TestUserDisallowDisposableDomainWithWhitelist.new(email: "foo@#{whitelist_domain}")
|
226
|
+
expect(user.valid?).to be_truthy
|
227
|
+
end
|
187
228
|
end
|
188
229
|
end
|
189
230
|
|
@@ -216,6 +257,23 @@ describe ValidEmail2 do
|
|
216
257
|
end
|
217
258
|
end
|
218
259
|
|
260
|
+
describe "with strict mx validation" do
|
261
|
+
it "is valid if mx records are found" do
|
262
|
+
user = TestUserStrictMX.new(email: "foo@gmail.com")
|
263
|
+
expect(user.valid?).to be_truthy
|
264
|
+
end
|
265
|
+
|
266
|
+
it "is invalid if A records are found but no mx records are found" do
|
267
|
+
user = TestUserStrictMX.new(email: "foo@ghs.google.com")
|
268
|
+
expect(user.valid?).to be_falsey
|
269
|
+
end
|
270
|
+
|
271
|
+
it "is invalid if no mx records are found" do
|
272
|
+
user = TestUserStrictMX.new(email: "foo@subdomain.gmail.com")
|
273
|
+
expect(user.valid?).to be_falsey
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
219
277
|
describe "with dotted validation" do
|
220
278
|
it "is valid when address does not contain dots" do
|
221
279
|
user = TestUserDotted.new(email: "johndoe@gmail.com")
|
data/valid_email2.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_development_dependency "bundler", "~> 2.0"
|
24
24
|
spec.add_development_dependency "rake", "~> 12.3.3"
|
25
25
|
spec.add_development_dependency "rspec", "~> 3.5.0"
|
26
|
+
spec.add_development_dependency "rspec-benchmark", "~> 0.6"
|
26
27
|
spec.add_development_dependency "pry"
|
27
28
|
spec.add_runtime_dependency "mail", "~> 2.5"
|
28
29
|
spec.add_runtime_dependency "activemodel", ">= 3.2"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: valid_email2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Micke Lisinge
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-05-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 3.5.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-benchmark
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.6'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.6'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: pry
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -120,6 +134,7 @@ files:
|
|
120
134
|
- lib/valid_email2/email_validator.rb
|
121
135
|
- lib/valid_email2/version.rb
|
122
136
|
- pull_mailchecker_emails.rb
|
137
|
+
- spec/benchmark_spec.rb
|
123
138
|
- spec/spec_helper.rb
|
124
139
|
- spec/valid_email2_spec.rb
|
125
140
|
- valid_email2.gemspec
|
@@ -142,11 +157,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
142
157
|
- !ruby/object:Gem::Version
|
143
158
|
version: '0'
|
144
159
|
requirements: []
|
145
|
-
rubygems_version: 3.
|
160
|
+
rubygems_version: 3.2.3
|
146
161
|
signing_key:
|
147
162
|
specification_version: 4
|
148
163
|
summary: ActiveModel validation for email. Including MX lookup and disposable email
|
149
164
|
blacklist
|
150
165
|
test_files:
|
166
|
+
- spec/benchmark_spec.rb
|
151
167
|
- spec/spec_helper.rb
|
152
168
|
- spec/valid_email2_spec.rb
|