mailshield 1.2 → 1.4
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 +2 -2
- data/lib/mailshield/secure_email_validator.rb +1 -1
- data/lib/mailshield/version.rb +2 -2
- data/lib/mailshield.rb +29 -19
- metadata +19 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a63f4492f21b558750b2e876a02ccdad172bc8e471cacf533e6886d348e0b5a
|
4
|
+
data.tar.gz: d83751d2286c3b034a92cf4e65b55cdebd68fb7d31fb0ac7cc12489258e1544f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3317ff62aa8479a9f678c01024c99da25e230d9ecfc59013ca0579e05d43eec6e1bc55978b73dfee4b2bb91211c6f88aa248c58b0b0e3a24a5aa90f0be4faec
|
7
|
+
data.tar.gz: 71fca0b12c55c64a24d55ea532427b9eb4e68d4cafae91872a423d6f4e38eb6d8c7e2e895911daf2bcc2811eeaa4e7adbf49bbf2c6559c4e7e6f0be506744d97
|
@@ -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
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative 'mailshield/version'
|
4
4
|
require_relative 'mailshield/disposable_domains'
|
5
|
+
require 'mailshield/secure_email_validator'
|
5
6
|
require 'resolv'
|
6
7
|
require 'csv'
|
7
8
|
require 'net/smtp'
|
@@ -15,7 +16,7 @@ module MailShield
|
|
15
16
|
class SPFError < ValidationError; end
|
16
17
|
class DMARCError < ValidationError; end
|
17
18
|
class SMTPError < ValidationError; end
|
18
|
-
|
19
|
+
class TemporaryDomainError < ValidationError; end
|
19
20
|
class << self
|
20
21
|
attr_accessor :dns_cache, :smtp_cache
|
21
22
|
|
@@ -25,13 +26,15 @@ module MailShield
|
|
25
26
|
domain = extract_domain(email)
|
26
27
|
|
27
28
|
begin
|
29
|
+
validate_known_disposal_domain?(domain)
|
28
30
|
validate_format!(email)
|
29
31
|
validate_domain!(domain)
|
30
32
|
validate_spf!(domain)
|
31
33
|
validate_dmarc!(domain)
|
32
34
|
validate_smtp!(email) if verify_by_send
|
35
|
+
|
33
36
|
rescue ValidationError => e
|
34
|
-
return { valid: false,
|
37
|
+
return { valid: false, reason: e.message }
|
35
38
|
end
|
36
39
|
|
37
40
|
{ valid: true }
|
@@ -57,15 +60,15 @@ module MailShield
|
|
57
60
|
end
|
58
61
|
|
59
62
|
def validate_spf!(domain)
|
60
|
-
raise SPFError, 'Temporary / Disposable Email' unless spf_record?(domain)
|
63
|
+
raise SPFError, 'Temporary / Disposable Email.' unless spf_record?(domain)
|
61
64
|
end
|
62
65
|
|
63
66
|
def validate_dmarc!(domain)
|
64
|
-
raise DMARCError, 'Temporary / Disposable Email' unless dmarc_record?(domain)
|
67
|
+
raise DMARCError, 'Temporary / Disposable Email.' unless dmarc_record?(domain)
|
65
68
|
end
|
66
69
|
|
67
70
|
def validate_smtp!(email)
|
68
|
-
raise SMTPError, 'Email Address Not Found' unless smtp_verify_email(email)
|
71
|
+
raise SMTPError, 'Email Address Not Found.' unless smtp_verify_email(email)
|
69
72
|
end
|
70
73
|
|
71
74
|
def extract_domain(email)
|
@@ -77,13 +80,11 @@ module MailShield
|
|
77
80
|
end
|
78
81
|
|
79
82
|
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
|
-
[]
|
83
|
+
Resolv::DNS.open do |dns|
|
84
|
+
dns.getresources(domain, Resolv::DNS::Resource::IN::MX).map(&:exchange).map(&:to_s)
|
86
85
|
end
|
86
|
+
rescue Resolv::ResolvError
|
87
|
+
[]
|
87
88
|
end
|
88
89
|
|
89
90
|
def spf_record?(domain)
|
@@ -97,18 +98,17 @@ module MailShield
|
|
97
98
|
end
|
98
99
|
|
99
100
|
def fetch_txt_records(domain)
|
100
|
-
|
101
|
-
Resolv::DNS
|
102
|
-
|
103
|
-
end
|
104
|
-
rescue Resolv::ResolvError
|
105
|
-
[]
|
101
|
+
Resolv::DNS.open do |dns|
|
102
|
+
records = dns.getresources(domain, Resolv::DNS::Resource::IN::TXT)
|
103
|
+
records.map(&:data)
|
106
104
|
end
|
105
|
+
rescue Resolv::ResolvError
|
106
|
+
[]
|
107
107
|
end
|
108
108
|
|
109
109
|
def smtp_verify_email(email)
|
110
110
|
domain = extract_domain(email)
|
111
|
-
smtp_server =
|
111
|
+
smtp_server = get_smtp_server(domain)
|
112
112
|
|
113
113
|
return false unless smtp_server
|
114
114
|
|
@@ -117,7 +117,7 @@ module MailShield
|
|
117
117
|
smtp.helo('localhost')
|
118
118
|
smtp.mailfrom('test@example.com')
|
119
119
|
response = smtp.rcptto(email)
|
120
|
-
response == '250 OK'
|
120
|
+
response.status == '250' || response.status == '250 OK'
|
121
121
|
end
|
122
122
|
rescue Net::SMTPFatalError, Net::SMTPServerBusy, Net::SMTPSyntaxError, Errno::ECONNREFUSED
|
123
123
|
false
|
@@ -130,3 +130,13 @@ module MailShield
|
|
130
130
|
end
|
131
131
|
end
|
132
132
|
end
|
133
|
+
|
134
|
+
module ActiveModel
|
135
|
+
module Validations
|
136
|
+
class SecureEmailValidator < ::MailShield::SecureEmailValidator
|
137
|
+
def initialize(options = {})
|
138
|
+
super
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
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.4'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jana
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-09-
|
12
|
-
dependencies:
|
13
|
-
|
14
|
-
|
11
|
+
date: 2024-09-04 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: []
|