mailshield 1.1 → 1.3
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/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:
|