mailshield 1.1 → 1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mailshield/disposable_domains.rb +94 -0
- data/lib/mailshield/secure_email_validator.rb +5 -3
- data/lib/mailshield/version.rb +2 -2
- data/lib/mailshield.rb +22 -22
- metadata +20 -6
- data/lib/mailshield/temp_domains.yml +0 -3520
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 362dd7a7c8a948582fdffea7fdc081da39461f3711e247a2cd79afa88d6635c8
|
4
|
+
data.tar.gz: 151d0b56d0f2bcbfacab22f427b2bc9712b543b4c6f49c72c9f634b0100f693b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9b29470d6e8d15577c201fa8b2a02220f71c6d96c69e6de7700f72c3fc3f8831a592d2422ee3b7c6bb696b882d465f4cafcf679bbac0f001a6d881fb97b03b06
|
7
|
+
data.tar.gz: 5a341e947ab69d9b202f426a8ed2ee1646350ee945f597a87d72be72e76cd2e5ec42c1db0a7d2248fe88b3ed890796aa046aecfdc2d43bc77ed0ba5ccb928501
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'set'
|
3
|
+
|
4
|
+
module MailShield
|
5
|
+
KNOWN_DISPOSABLE_DOMAINS = Set.new(
|
6
|
+
[
|
7
|
+
'10mail.org', '10minut.com.pl', '10minut.xyz', '10minutemail.nl', '11163.com',
|
8
|
+
'1secmail.com', '1secmail.net', '1secmail.org', '20minutemail.com', '2chmail.net',
|
9
|
+
'30wave.com', '4warding.net', '55hosting.net', '5july.org', '5ymail.com',
|
10
|
+
'672643.net', '6ip.us', '99.com', 'acentri.com', 'afrobacon.com',
|
11
|
+
'ahk.jp', 'aiafhg.com', 'airsi.de', 'akgq701.com', 'aleeas.com',
|
12
|
+
'alienware13.com', 'ama-trans.de', 'amiri.net', 'ano-mail.net', 'anonaddy.com',
|
13
|
+
'anonmails.de', 'apkmd.com', 'armyspy.com', 'asorent.com', 'augmentationtechnology.com',
|
14
|
+
'aver.com', 'averdov.com', 'axsup.net', 'b2cmail.de', 'banit.club',
|
15
|
+
'bearsarefuzzy.com', 'belamail.org', 'bitwhites.top', 'bladesmail.net', 'bobmail.info',
|
16
|
+
'boxformail.in', 'ccmail.uk', 'ceed.se', 'chammy.info', 'cheaphub.net',
|
17
|
+
'choco.la', 'choicemail1.com', 'chong-mail.net', 'cocoro.uk', 'cocovpn.com',
|
18
|
+
'crazymailing.com', 'cream.pink', 'cutradition.com', 'cuvox.de', 'd1yun.com',
|
19
|
+
'd3p.dk', 'dab.ro', 'dandikmail.com', 'datum2.com', 'dayrep.com',
|
20
|
+
'desoz.com', 'devnullmail.com', 'digdig.org', 'digitalsanctuary.com', 'dispo.in',
|
21
|
+
'dispostable.com', 'dndent.com', 'domozmail.com', 'drdrb.com', 'drevo.si',
|
22
|
+
'dropmail.me', 'dukedish.com', 'durandinterstellar.com', 'e4ward.com', 'eay.jp',
|
23
|
+
'ee1.pl', 'efxs.ca', 'einmalmail.de', 'einrot.com', 'eintagsmail.de',
|
24
|
+
'email.com', 'email.it', 'email60.com', 'emailinfive.com', 'emailresort.com',
|
25
|
+
'emailxfer.com', 'emeraldwebmail.com', 'emlhub.com', 'emlpro.com', 'emltmp.com',
|
26
|
+
'envy17.com', 'esemay.com', 'ether123.net', 'ethereum1.top', 'ethersports.org',
|
27
|
+
'evyush.com', 'exdonuts.com', 'express.net.ua', 'eyepaste.com', 'fanclub.pm',
|
28
|
+
'fangoh.com', 'fantasymail.de', 'fastmail.com', 'fatflap.com', 'fightallspam.com',
|
29
|
+
'fiifke.de', 'findu.pl', 'fleckens.hu', 'foobarbot.net', 'fr33mail.info',
|
30
|
+
'freeinbox.email', 'freeml.net', 'fukurou.ch', 'fuwamofu.com', 'fuwari.be',
|
31
|
+
'gafy.net', 'gambling.com', 'gehensiemirnichtaufdensack.de', 'gelitik.in', 'geronra.com',
|
32
|
+
'getmails.eu', 'getover.de', 'givememail.club', 'gmatch.org', 'go2vpn.net',
|
33
|
+
'golemico.com', 'greenhousemail.com', 'guerillamail.biz', 'guerrillamail.com', 'gustr.com',
|
34
|
+
'haltospam.com', 'hamham.uk', 'harakirimail.com', 'haydoo.com', 'headstrong.de',
|
35
|
+
'heisei.be', 'herp.in', 'herpderp.nl', 'hidemyass.com', 'hidzz.com',
|
36
|
+
'hola.org', 'honeys.be', 'honor-8.com', 'hornyalwary.top', 'hostcalls.com',
|
37
|
+
'hotmai.com', 'hotsoup.be', 'ichigo.me', 'icx.ro', 'ieatspam.eu',
|
38
|
+
'ige.es', 'imails.info', 'imstations.com', 'in-ulm.de', 'inboxalias.com',
|
39
|
+
'inkomail.com', 'instaddr.ch', 'interstats.org', 'ip6.li', 'janproz.com',
|
40
|
+
'jobposts.net', 'jourrapide.com', 'kagi.be', 'katztube.com', 'kbox.li',
|
41
|
+
'kkmail.be', 'kksm.be', 'klipschx12.com', 'kmail.li', 'koszmail.pl',
|
42
|
+
'kpay.be', 'kpost.be', 'kulturbetrieb.info', 'labworld.org', 'lee.mx',
|
43
|
+
'lenovog4.com', 'lgxscreen.com', 'lifetotech.com', 'ligsb.com', 'lillemap.net',
|
44
|
+
'locanto1.club', 'locantofuck.top', 'lukop.dk', 'macr2.com', 'macromaid.com',
|
45
|
+
'magim.be', 'mail.darmajaya.ac.id', 'mail.ru', 'mail.tm', 'mail21.cc',
|
46
|
+
'mailcker.com', 'maildrop.cc', 'maildx.com', 'mailfs.com', 'mailguard.me',
|
47
|
+
'mailinater.com', 'mailinator.com', 'mailinator.net', 'mailinator.us', 'mailsac.com',
|
48
|
+
'mailscrap.com', 'mailshell.com', 'mailtechx.com', 'mailtothis.com', 'mama3.org',
|
49
|
+
'manybrain.com', 'mbox.re', 'meantinc.com', 'mepost.pw', 'merry.pink',
|
50
|
+
'metalunits.com', 'midiharmonica.com', 'mirai.re', 'mobilevpn.top', 'mofu.be',
|
51
|
+
'moimoi.re', 'monumentmail.com', 'morsin.com', 'mt2009.com', 'mt2014.com',
|
52
|
+
'mt2015.com', 'mybitti.de', 'mymail-in.net', 'mymailoasis.com', 'mypacks.net',
|
53
|
+
'myspamless.com', 'mystvpn.com', 'mytrashmail.com', 'na-cat.com', 'nada.email',
|
54
|
+
'nagi.be', 'nanonym.ch', 'neko2.net', 'nekochan.fr', 'nervmich.net',
|
55
|
+
'nextstopvalhalla.com', 'nezdiro.org', 'nezumi.be', 'niseko.be', 'nospamfor.us',
|
56
|
+
'notmailinator.com', 'ntlhelp.net', 'nurfuerspam.de', 'nutpa.net', 'nypato.com',
|
57
|
+
'okinawa.li', 'onemail.host', 'onetm.jp', 'online.ms', 'oopi.org',
|
58
|
+
'ovomail.co', 'owleyes.ch', 'oxopoha.com', 'p33.org', 'pancakemail.com',
|
59
|
+
'pavilionx2.com', 'payperex2.com', 'pecinan.net', 'pingir.com', 'placebomail10.com',
|
60
|
+
'plw.me', 'porsh.net', 'pratikmail.com', 'pratikmail.org', 'prin.be',
|
61
|
+
'privy-mail.de', 'pro-tag.org', 'projectcl.com', 'psh.me', 'put2.net',
|
62
|
+
'putthisinyourspamdatabase.com', 'qtum-ico.com', 'quickemail.info', 'quicksend.ch', 'rabin.ca',
|
63
|
+
'rapt.be', 'reallymymail.com', 'recode.me', 'redfeathercrow.com', 'reftoken.net',
|
64
|
+
'rhyta.com', 'rootfest.net', 'royal.net', 'ruru.be', 'safetymail.info',
|
65
|
+
'schrott-email.de', 'sendnow.win', 'sendspamhere.com', 'senseless-entertainment.com', 'sexyalwasmi.top',
|
66
|
+
'shalar.net', 'sharklasers.com', 'shieldedmail.com', 'shieldemail.com', 'shipfromto.com',
|
67
|
+
'shrib.com', 'sika3.com', 'simaenaga.com', 'simplelogin.co', 'sinaite.net',
|
68
|
+
'slaskpost.se', 'sofia.re', 'sogetthis.com', 'spamdecoy.net', 'spamhereplease.com',
|
69
|
+
'spamhole.com', 'stayhome.li', 'storiqax.top', 'storj99.com', 'storj99.top',
|
70
|
+
'stromox.com', 'superrito.com', 'supersave.net', 'suremail.info', 'svk.jp',
|
71
|
+
'tapi.re', 'teleworm.us', 'temp-mail.org', 'tempail.com', 'tempemail.net',
|
72
|
+
'tempmail.dev', 'tempmail2.com', 'tempmailer.com', 'tempmailo.com', 'tensi.org',
|
73
|
+
'testudine.com', 'thankyou2010.com', 'thisisnotmyrealemail.com', 'throwam.com', 'tilien.com',
|
74
|
+
'tmail.ws', 'tokem.co', 'topless-new-world.com', 'topmail.com', 'torba.cc',
|
75
|
+
'trickmail.net', 'trickmail.org', 'trixtrux1.com', 'truckeremail.net', 'tryalert.com',
|
76
|
+
'turual.com', 'twddos.com', 'unmail.ru', 'uploadnolimit.com', 'uw5t6ds54.com',
|
77
|
+
'ventolin.org', 'vintomaper.com', 'vmailcloud.com', 'vubby.com', 'vuiy.pw',
|
78
|
+
'warpmail.net', 'watch-harry-potter.com', 'watchfulli.com', 'wep68.com', 'wh4f.org',
|
79
|
+
'willhackforfood.biz', 'winbroadband.co.uk', 'workshop-liberal.com', 'wronghead.com', 'wwwmail.win',
|
80
|
+
'x24.com', 'xn--9kq967o.com', 'xn--cg7bx4b4x1b.com', 'xsynergy.top', 'xxhamsterxx.com',
|
81
|
+
'yepmail.net', 'yesspam.com', 'yo-site.com', 'yogotemail.com', 'yopmail.fr',
|
82
|
+
'yopmail.gq', 'yopmail.net', 'yopmail.org', 'yourinbox.email', 'yuurok.com',
|
83
|
+
'zainmax.net', 'ze.gy', 'zipmail.com', 'zoemail.net', 'zombie-hive.com',
|
84
|
+
'zsero.com', 'zumrot.com'
|
85
|
+
]
|
86
|
+
)
|
87
|
+
|
88
|
+
|
89
|
+
class << self
|
90
|
+
def validate_known_disposal_domain?(domain)
|
91
|
+
raise TemporaryDomainError, 'Temporary / Disposal Email.' if KNOWN_DISPOSABLE_DOMAINS.include?(domain)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'active_model'
|
2
4
|
|
3
5
|
module MailShield
|
@@ -8,9 +10,9 @@ module MailShield
|
|
8
10
|
|
9
11
|
result = MailShield.validate_email(email)
|
10
12
|
|
11
|
-
|
12
|
-
|
13
|
-
|
13
|
+
return if result[:valid]
|
14
|
+
|
15
|
+
record.errors.add(:email, result[:issue])
|
14
16
|
end
|
15
17
|
end
|
16
18
|
end
|
data/lib/mailshield/version.rb
CHANGED
data/lib/mailshield.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'mailshield/version'
|
4
|
+
require_relative 'mailshield/disposable_domains'
|
4
5
|
require 'resolv'
|
5
6
|
require 'csv'
|
6
7
|
require 'net/smtp'
|
@@ -14,7 +15,7 @@ module MailShield
|
|
14
15
|
class SPFError < ValidationError; end
|
15
16
|
class DMARCError < ValidationError; end
|
16
17
|
class SMTPError < ValidationError; end
|
17
|
-
|
18
|
+
class TemporaryDomainError < ValidationError; end
|
18
19
|
class << self
|
19
20
|
attr_accessor :dns_cache, :smtp_cache
|
20
21
|
|
@@ -24,22 +25,24 @@ module MailShield
|
|
24
25
|
domain = extract_domain(email)
|
25
26
|
|
26
27
|
begin
|
28
|
+
validate_known_disposal_domain?(domain)
|
27
29
|
validate_format!(email)
|
28
30
|
validate_domain!(domain)
|
29
31
|
validate_spf!(domain)
|
30
32
|
validate_dmarc!(domain)
|
31
33
|
validate_smtp!(email) if verify_by_send
|
34
|
+
|
32
35
|
rescue ValidationError => e
|
33
|
-
return { valid: false,
|
36
|
+
return { valid: false, reason: e.message }
|
34
37
|
end
|
35
38
|
|
36
|
-
{ valid: true
|
39
|
+
{ valid: true }
|
37
40
|
end
|
38
41
|
|
39
|
-
|
40
42
|
def verify_address(email)
|
41
43
|
smtp_verify_email(email)
|
42
44
|
end
|
45
|
+
|
43
46
|
private
|
44
47
|
|
45
48
|
def reset_caches
|
@@ -56,15 +59,15 @@ module MailShield
|
|
56
59
|
end
|
57
60
|
|
58
61
|
def validate_spf!(domain)
|
59
|
-
raise SPFError, 'Temporary / Disposable Email' unless spf_record?(domain)
|
62
|
+
raise SPFError, 'Temporary / Disposable Email.' unless spf_record?(domain)
|
60
63
|
end
|
61
64
|
|
62
65
|
def validate_dmarc!(domain)
|
63
|
-
raise DMARCError, 'Temporary / Disposable Email' unless dmarc_record?(domain)
|
66
|
+
raise DMARCError, 'Temporary / Disposable Email.' unless dmarc_record?(domain)
|
64
67
|
end
|
65
68
|
|
66
69
|
def validate_smtp!(email)
|
67
|
-
raise SMTPError, 'Email Address Not Found' unless smtp_verify_email(email)
|
70
|
+
raise SMTPError, 'Email Address Not Found.' unless smtp_verify_email(email)
|
68
71
|
end
|
69
72
|
|
70
73
|
def extract_domain(email)
|
@@ -76,13 +79,11 @@ module MailShield
|
|
76
79
|
end
|
77
80
|
|
78
81
|
def fetch_mx_records(domain)
|
79
|
-
|
80
|
-
Resolv::DNS.
|
81
|
-
dns.getresources(domain, Resolv::DNS::Resource::IN::MX).map(&:exchange).map(&:to_s)
|
82
|
-
end
|
83
|
-
rescue Resolv::ResolvError
|
84
|
-
[]
|
82
|
+
Resolv::DNS.open do |dns|
|
83
|
+
dns.getresources(domain, Resolv::DNS::Resource::IN::MX).map(&:exchange).map(&:to_s)
|
85
84
|
end
|
85
|
+
rescue Resolv::ResolvError
|
86
|
+
[]
|
86
87
|
end
|
87
88
|
|
88
89
|
def spf_record?(domain)
|
@@ -96,18 +97,17 @@ module MailShield
|
|
96
97
|
end
|
97
98
|
|
98
99
|
def fetch_txt_records(domain)
|
99
|
-
|
100
|
-
Resolv::DNS
|
101
|
-
|
102
|
-
end
|
103
|
-
rescue Resolv::ResolvError
|
104
|
-
[]
|
100
|
+
Resolv::DNS.open do |dns|
|
101
|
+
records = dns.getresources(domain, Resolv::DNS::Resource::IN::TXT)
|
102
|
+
records.map(&:data)
|
105
103
|
end
|
104
|
+
rescue Resolv::ResolvError
|
105
|
+
[]
|
106
106
|
end
|
107
107
|
|
108
108
|
def smtp_verify_email(email)
|
109
109
|
domain = extract_domain(email)
|
110
|
-
smtp_server =
|
110
|
+
smtp_server = get_smtp_server(domain)
|
111
111
|
|
112
112
|
return false unless smtp_server
|
113
113
|
|
@@ -116,9 +116,9 @@ module MailShield
|
|
116
116
|
smtp.helo('localhost')
|
117
117
|
smtp.mailfrom('test@example.com')
|
118
118
|
response = smtp.rcptto(email)
|
119
|
-
response == '250 OK'
|
119
|
+
response.status == '250' || response.status == '250 OK'
|
120
120
|
end
|
121
|
-
rescue Net::SMTPFatalError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Errno::ECONNREFUSED
|
121
|
+
rescue Net::SMTPFatalError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Errno::ECONNREFUSED
|
122
122
|
false
|
123
123
|
end
|
124
124
|
end
|
metadata
CHANGED
@@ -1,17 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailshield
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jana
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
11
|
+
date: 2024-09-03 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: net-smtp
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.2.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 0.2.1
|
27
|
+
description: MailShield enhances your app’s security by blocking temporary, spam and
|
28
|
+
disposable email addresses, keeping your user data clean and reducing spam.
|
15
29
|
email:
|
16
30
|
- shanmugamjanarthan24@gmail.com
|
17
31
|
executables: []
|
@@ -19,9 +33,9 @@ extensions: []
|
|
19
33
|
extra_rdoc_files: []
|
20
34
|
files:
|
21
35
|
- lib/mailshield.rb
|
36
|
+
- lib/mailshield/disposable_domains.rb
|
22
37
|
- lib/mailshield/docs/mailshield.png
|
23
38
|
- lib/mailshield/secure_email_validator.rb
|
24
|
-
- lib/mailshield/temp_domains.yml
|
25
39
|
- lib/mailshield/version.rb
|
26
40
|
homepage: https://github.com/janarthanan-shanmugam/mailshield
|
27
41
|
licenses:
|