mailshield 1.2 → 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 +2 -2
- data/lib/mailshield/version.rb +2 -2
- data/lib/mailshield.rb +18 -19
- metadata +18 -4
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
|
@@ -87,8 +87,8 @@ module MailShield
|
|
87
87
|
|
88
88
|
|
89
89
|
class << self
|
90
|
-
def
|
91
|
-
|
90
|
+
def validate_known_disposal_domain?(domain)
|
91
|
+
raise TemporaryDomainError, 'Temporary / Disposal Email.' if KNOWN_DISPOSABLE_DOMAINS.include?(domain)
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end
|
data/lib/mailshield/version.rb
CHANGED
data/lib/mailshield.rb
CHANGED
@@ -15,7 +15,7 @@ module MailShield
|
|
15
15
|
class SPFError < ValidationError; end
|
16
16
|
class DMARCError < ValidationError; end
|
17
17
|
class SMTPError < ValidationError; end
|
18
|
-
|
18
|
+
class TemporaryDomainError < ValidationError; end
|
19
19
|
class << self
|
20
20
|
attr_accessor :dns_cache, :smtp_cache
|
21
21
|
|
@@ -25,13 +25,15 @@ module MailShield
|
|
25
25
|
domain = extract_domain(email)
|
26
26
|
|
27
27
|
begin
|
28
|
+
validate_known_disposal_domain?(domain)
|
28
29
|
validate_format!(email)
|
29
30
|
validate_domain!(domain)
|
30
31
|
validate_spf!(domain)
|
31
32
|
validate_dmarc!(domain)
|
32
33
|
validate_smtp!(email) if verify_by_send
|
34
|
+
|
33
35
|
rescue ValidationError => e
|
34
|
-
return { valid: false,
|
36
|
+
return { valid: false, reason: e.message }
|
35
37
|
end
|
36
38
|
|
37
39
|
{ valid: true }
|
@@ -57,15 +59,15 @@ module MailShield
|
|
57
59
|
end
|
58
60
|
|
59
61
|
def validate_spf!(domain)
|
60
|
-
raise SPFError, 'Temporary / Disposable Email' unless spf_record?(domain)
|
62
|
+
raise SPFError, 'Temporary / Disposable Email.' unless spf_record?(domain)
|
61
63
|
end
|
62
64
|
|
63
65
|
def validate_dmarc!(domain)
|
64
|
-
raise DMARCError, 'Temporary / Disposable Email' unless dmarc_record?(domain)
|
66
|
+
raise DMARCError, 'Temporary / Disposable Email.' unless dmarc_record?(domain)
|
65
67
|
end
|
66
68
|
|
67
69
|
def validate_smtp!(email)
|
68
|
-
raise SMTPError, 'Email Address Not Found' unless smtp_verify_email(email)
|
70
|
+
raise SMTPError, 'Email Address Not Found.' unless smtp_verify_email(email)
|
69
71
|
end
|
70
72
|
|
71
73
|
def extract_domain(email)
|
@@ -77,13 +79,11 @@ module MailShield
|
|
77
79
|
end
|
78
80
|
|
79
81
|
def fetch_mx_records(domain)
|
80
|
-
|
81
|
-
Resolv::DNS.
|
82
|
-
dns.getresources(domain, Resolv::DNS::Resource::IN::MX).map(&:exchange).map(&:to_s)
|
83
|
-
end
|
84
|
-
rescue Resolv::ResolvError
|
85
|
-
[]
|
82
|
+
Resolv::DNS.open do |dns|
|
83
|
+
dns.getresources(domain, Resolv::DNS::Resource::IN::MX).map(&:exchange).map(&:to_s)
|
86
84
|
end
|
85
|
+
rescue Resolv::ResolvError
|
86
|
+
[]
|
87
87
|
end
|
88
88
|
|
89
89
|
def spf_record?(domain)
|
@@ -97,18 +97,17 @@ module MailShield
|
|
97
97
|
end
|
98
98
|
|
99
99
|
def fetch_txt_records(domain)
|
100
|
-
|
101
|
-
Resolv::DNS
|
102
|
-
|
103
|
-
end
|
104
|
-
rescue Resolv::ResolvError
|
105
|
-
[]
|
100
|
+
Resolv::DNS.open do |dns|
|
101
|
+
records = dns.getresources(domain, Resolv::DNS::Resource::IN::TXT)
|
102
|
+
records.map(&:data)
|
106
103
|
end
|
104
|
+
rescue Resolv::ResolvError
|
105
|
+
[]
|
107
106
|
end
|
108
107
|
|
109
108
|
def smtp_verify_email(email)
|
110
109
|
domain = extract_domain(email)
|
111
|
-
smtp_server =
|
110
|
+
smtp_server = get_smtp_server(domain)
|
112
111
|
|
113
112
|
return false unless smtp_server
|
114
113
|
|
@@ -117,7 +116,7 @@ module MailShield
|
|
117
116
|
smtp.helo('localhost')
|
118
117
|
smtp.mailfrom('test@example.com')
|
119
118
|
response = smtp.rcptto(email)
|
120
|
-
response == '250 OK'
|
119
|
+
response.status == '250' || response.status == '250 OK'
|
121
120
|
end
|
122
121
|
rescue Net::SMTPFatalError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Errno::ECONNREFUSED
|
123
122
|
false
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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
|
@@ -9,9 +9,23 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
date: 2024-09-03 00:00:00.000000000 Z
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
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: []
|