ses-proxy 0.2.1 → 0.3.0
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.
- data/lib/ses_proxy/smtp_server.rb +70 -30
- data/template/ses-proxy.yml +11 -0
- metadata +3 -2
@@ -2,6 +2,19 @@ require 'eventmachine'
|
|
2
2
|
require 'mail'
|
3
3
|
require 'aws-sdk'
|
4
4
|
|
5
|
+
if SesProxy::Conf.get[:aws][:ses] and SesProxy::Conf.get[:aws][:ses][:username] and SesProxy::Conf.get[:aws][:ses][:password]
|
6
|
+
Mail.defaults do
|
7
|
+
delivery_method :smtp, {
|
8
|
+
:address => 'email-smtp.us-east-1.amazonaws.com',
|
9
|
+
:port => '587',
|
10
|
+
:user_name => SesProxy::Conf.get[:aws][:ses][:username],
|
11
|
+
:password => SesProxy::Conf.get[:aws][:ses][:password],
|
12
|
+
:authentication => :plain,
|
13
|
+
:enable_starttls_auto => true
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
5
18
|
module SesProxy
|
6
19
|
class SmtpServer < EM::P::SmtpServer
|
7
20
|
|
@@ -64,12 +77,31 @@ module SesProxy
|
|
64
77
|
def receive_message
|
65
78
|
return false unless verified
|
66
79
|
mail = Mail.read_from_string(message)
|
67
|
-
bounced = Bounce.where({:email=>{"$in"=>recipients
|
80
|
+
bounced = Bounce.where({:email=>{"$in"=>recipients}}).map(&:email)
|
68
81
|
#TODO: Define policy for retry when bounce is not permanent
|
69
|
-
|
82
|
+
|
83
|
+
#Remove bounced addresses
|
84
|
+
actual_recipients = mail.to_addrs - bounced
|
70
85
|
actual_cc_addrs = mail.cc_addrs - bounced
|
71
|
-
actual_bcc_addrs = mail.
|
72
|
-
|
86
|
+
actual_bcc_addrs = recipients - (mail.to_addrs + mail.cc_addrs) - bounced
|
87
|
+
|
88
|
+
#Remove blacklisted domains
|
89
|
+
if SesProxy::Conf.get[:blacklisted_domains] and SesProxy::Conf.get[:blacklisted_domains].any?
|
90
|
+
bld = SesProxy::Conf.get[:blacklisted_domains]
|
91
|
+
actual_recipients.collect!{|address| address unless bld.include?(address.split('@').last)}.compact!
|
92
|
+
actual_cc_addrs.collect!{|address| address unless bld.include?(address.split('@').last)}.compact!
|
93
|
+
actual_bcc_addrs.collect!{|address| address unless bld.include?(address.split('@').last)}.compact!
|
94
|
+
end
|
95
|
+
|
96
|
+
#Remove blacklisted regexp
|
97
|
+
if SesProxy::Conf.get[:blacklisted_regexp] and SesProxy::Conf.get[:blacklisted_regexp].any?
|
98
|
+
blr = SesProxy::Conf.get[:blacklisted_regexp]
|
99
|
+
actual_recipients.collect!{|address| address unless blr.map{|regexp| Regexp.new(regexp).match(address)}.compact.any? }.compact!
|
100
|
+
actual_cc_addrs.collect!{|address| address unless blr.map{|regexp| Regexp.new(regexp).match(address)}.compact.any? }.compact!
|
101
|
+
actual_bcc_addrs.collect!{|address| address unless blr.map{|regexp| Regexp.new(regexp).match(address)}.compact.any? }.compact!
|
102
|
+
end
|
103
|
+
|
104
|
+
original_number = recipients.size
|
73
105
|
filtered_number = actual_recipients.size+actual_cc_addrs.size+actual_bcc_addrs.size
|
74
106
|
record = RecipientsNumber.new({
|
75
107
|
:original=>original_number,
|
@@ -82,40 +114,48 @@ module SesProxy
|
|
82
114
|
mail.to = actual_recipients.uniq.join(",")
|
83
115
|
mail.cc = actual_cc_addrs.uniq.join(",")
|
84
116
|
mail.bcc = actual_bcc_addrs.uniq.join(",")
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
117
|
+
unless SesProxy::Conf.get[:collect_sent_mails].eql? false
|
118
|
+
record = Email.new({
|
119
|
+
:sender => sender,
|
120
|
+
:recipients => actual_recipients.uniq.join(","),
|
121
|
+
:subject => mail.subject,
|
122
|
+
:body => mail.body.decoded,
|
123
|
+
:system => mail['X-Sender-System']||"Unknown",
|
124
|
+
:created_at => Time.now,
|
125
|
+
:updated_at => Time.now
|
126
|
+
})
|
127
|
+
record.save!
|
128
|
+
end
|
95
129
|
begin
|
96
|
-
ses.
|
130
|
+
if SesProxy::Conf.get[:aws][:ses] and SesProxy::Conf.get[:aws][:ses][:username] and SesProxy::Conf.get[:aws][:ses][:password]
|
131
|
+
mail.deliver!
|
132
|
+
else
|
133
|
+
ses.send_raw_email(mail.to_s)
|
134
|
+
end
|
97
135
|
rescue Exception => e
|
98
136
|
print "Error! "
|
99
137
|
puts e.message
|
100
138
|
return false
|
101
139
|
end
|
102
140
|
else
|
103
|
-
puts "No valid recipients!"
|
141
|
+
puts "No valid recipients! #{mail.to_addrs}"
|
104
142
|
end
|
105
143
|
if not original_number.eql? filtered_number
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
144
|
+
unless SesProxy::Conf.get[:collect_bounced_mails].eql? false
|
145
|
+
mail.to = (recipients&bounced).uniq.join(",")
|
146
|
+
mail.cc = (mail.cc_addrs&bounced).uniq.join(",")
|
147
|
+
mail.bcc = (mail.bcc_addrs&bounced).uniq.join(",")
|
148
|
+
record = BouncedEmail.new({
|
149
|
+
:sender => sender,
|
150
|
+
:recipients => (recipients&bounced).uniq.join(","),
|
151
|
+
:subject => mail.subject,
|
152
|
+
:body => mail.body.decoded,
|
153
|
+
:system => mail['X-Sender-System']||"Unknown",
|
154
|
+
:created_at => Time.now,
|
155
|
+
:updated_at => Time.now
|
156
|
+
})
|
157
|
+
record.save!
|
158
|
+
end
|
119
159
|
end
|
120
160
|
end
|
121
161
|
|
@@ -141,4 +181,4 @@ module SesProxy
|
|
141
181
|
!!@server
|
142
182
|
end
|
143
183
|
end
|
144
|
-
end
|
184
|
+
end
|
data/template/ses-proxy.yml
CHANGED
@@ -1,8 +1,19 @@
|
|
1
|
+
:collect_sent_mails: true
|
2
|
+
:collect_bounced_mails: true
|
3
|
+
:blacklisted_domains:
|
4
|
+
- domain1.ltd
|
5
|
+
- domain2.ltd
|
6
|
+
:blacklisted_regexp:
|
7
|
+
- regexp1_pattern_without_delimiters
|
8
|
+
- regexp2_pattern_without_delimiters
|
1
9
|
:aws:
|
2
10
|
:access_key_id: your_access_key_id
|
3
11
|
:secret_access_key: your_secret_access_key
|
4
12
|
:account_id: 000000000000
|
5
13
|
:allowed_topic_arns: ["arn:aws:sns:us-east-1:123456789012:MyTopic"]
|
14
|
+
:ses:
|
15
|
+
:username: your_ses_smtp_username
|
16
|
+
:password: your_ses_smtp_password
|
6
17
|
:smtp_auth:
|
7
18
|
:user: smtp_user
|
8
19
|
:password: smtp_pass
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ses-proxy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -289,8 +289,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
289
289
|
version: '0'
|
290
290
|
requirements: []
|
291
291
|
rubyforge_project:
|
292
|
-
rubygems_version: 1.8.
|
292
|
+
rubygems_version: 1.8.25
|
293
293
|
signing_key:
|
294
294
|
specification_version: 3
|
295
295
|
summary: SMTP Proxy for Amazon Simple Email Service with bounce and complaints support
|
296
296
|
test_files: []
|
297
|
+
has_rdoc: false
|