mailkick 0.2.1 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +2 -0
- data/.travis.yml +16 -0
- data/CHANGELOG.md +8 -0
- data/Gemfile +1 -1
- data/README.md +10 -23
- data/app/controllers/mailkick/subscriptions_controller.rb +14 -13
- data/app/helpers/mailkick/url_helper.rb +4 -3
- data/config/routes.rb +3 -1
- data/lib/generators/mailkick/templates/install.rb +1 -3
- data/lib/mailkick.rb +12 -9
- data/lib/mailkick/engine.rb +14 -2
- data/lib/mailkick/service.rb +1 -0
- data/lib/mailkick/service/mailgun.rb +1 -1
- data/lib/mailkick/version.rb +1 -1
- data/mailkick.gemspec +8 -7
- data/test/gemfiles/actionmailer42.gemfile +6 -0
- data/test/gemfiles/actionmailer50.gemfile +6 -0
- data/test/gemfiles/actionmailer51.gemfile +6 -0
- data/test/internal/app/mailers/user_mailer.rb +7 -0
- data/test/internal/app/models/user.rb +3 -0
- data/test/internal/app/views/user_mailer/welcome.html.erb +1 -0
- data/test/internal/app/views/user_mailer/welcome.text.erb +1 -0
- data/test/internal/config/database.yml +3 -0
- data/test/internal/db/schema.rb +16 -0
- data/test/mailkick_test.rb +20 -2
- data/test/test_helper.rb +10 -12
- metadata +63 -18
- data/lib/mailkick/mailer.rb +0 -11
- data/lib/mailkick/processor.rb +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7342fb3956753b14f1345a70153ac76cc6cc73290a7b4c1d9e3f9a1b29e6a216
|
4
|
+
data.tar.gz: 06a13e7037c2ab1ffcab78f93f7a99272aa00b59f3388878ad10498d7ed73e70
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2d0a3d927fee65871caf6b37d79e83663e45c382396e941e03651ec36de13e19680107f9582e4e9010f65454361d32e16b77787d8e0657857029ff05b3e2e510
|
7
|
+
data.tar.gz: 72698be727b60185179d2004af23531cf3812fabf6e68a8ad0d4da4b0119804bc3591dd60aa1f7a5c92b1d3d0c896f5329572a6e331985724f00c8778abb6623
|
data/.gitignore
CHANGED
data/.travis.yml
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
language: ruby
|
2
|
+
rvm:
|
3
|
+
- 2.4.2
|
4
|
+
sudo: false
|
5
|
+
script: bundle exec rake test
|
6
|
+
before_script:
|
7
|
+
- gem install bundler
|
8
|
+
notifications:
|
9
|
+
email:
|
10
|
+
on_success: never
|
11
|
+
on_failure: change
|
12
|
+
gemfile:
|
13
|
+
- Gemfile
|
14
|
+
- test/gemfiles/actionmailer51.gemfile
|
15
|
+
- test/gemfiles/actionmailer50.gemfile
|
16
|
+
- test/gemfiles/actionmailer42.gemfile
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
# Mailkick
|
2
2
|
|
3
|
-
|
3
|
+
Email subscriptions made easy
|
4
4
|
|
5
5
|
- Add one-click unsubscribe links to your emails
|
6
6
|
- Fetch bounces and spam reports from your email service
|
7
|
-
|
8
|
-
Gracefully handles email address changes
|
7
|
+
- Gracefully handles email address changes
|
9
8
|
|
10
9
|
:postbox: Check out [Ahoy Email](https://github.com/ankane/ahoy_email) for analytics
|
11
10
|
|
11
|
+
[![Build Status](https://travis-ci.org/ankane/mailkick.svg?branch=master)](https://travis-ci.org/ankane/mailkick)
|
12
|
+
|
12
13
|
## Installation
|
13
14
|
|
14
15
|
Add this line to your application’s Gemfile:
|
@@ -21,7 +22,7 @@ And run the generator. This creates a model to store opt-outs.
|
|
21
22
|
|
22
23
|
```sh
|
23
24
|
rails generate mailkick:install
|
24
|
-
|
25
|
+
rails db:migrate
|
25
26
|
```
|
26
27
|
|
27
28
|
## How It Works
|
@@ -57,7 +58,7 @@ Before sending marketing emails, make sure the user has not opted out.
|
|
57
58
|
Add the following method to models with email addresses.
|
58
59
|
|
59
60
|
```ruby
|
60
|
-
class User <
|
61
|
+
class User < ApplicationRecord
|
61
62
|
mailkick_user
|
62
63
|
end
|
63
64
|
```
|
@@ -137,21 +138,12 @@ Mailkick.services = [
|
|
137
138
|
]
|
138
139
|
```
|
139
140
|
|
140
|
-
## Multiple Lists
|
141
|
+
## Multiple Lists
|
141
142
|
|
142
|
-
You may want to split your emails into multiple categories, like sale emails and order reminders.
|
143
|
-
|
144
|
-
Set the list in the mailer.
|
143
|
+
You may want to split your emails into multiple categories, like sale emails and order reminders. Set the list in the url:
|
145
144
|
|
146
145
|
```ruby
|
147
|
-
|
148
|
-
|
149
|
-
def order_reminder(user)
|
150
|
-
headers[:mailkick_list] = "order_reminders"
|
151
|
-
# ...
|
152
|
-
end
|
153
|
-
|
154
|
-
end
|
146
|
+
mailkick_unsubscribe_url(list: "order_reminders")
|
155
147
|
```
|
156
148
|
|
157
149
|
Pass the `list` option to methods.
|
@@ -185,17 +177,12 @@ More great gems for email
|
|
185
177
|
- [Roadie](https://github.com/Mange/roadie) - inline CSS
|
186
178
|
- [Letter Opener](https://github.com/ryanb/letter_opener) - preview email in development
|
187
179
|
|
188
|
-
## TODO
|
189
|
-
|
190
|
-
- Make it easy to customize controller
|
191
|
-
- Subscribe to events
|
192
|
-
|
193
180
|
## Reference
|
194
181
|
|
195
182
|
Change how the user is determined
|
196
183
|
|
197
184
|
```ruby
|
198
|
-
Mailkick.user_method = ->
|
185
|
+
Mailkick.user_method = ->(email) { User.find_by(email: email) }
|
199
186
|
```
|
200
187
|
|
201
188
|
Use a different email field
|
@@ -20,19 +20,20 @@ module Mailkick
|
|
20
20
|
protected
|
21
21
|
|
22
22
|
def set_email
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
@
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
23
|
+
@email, user_id, user_type, @list = Mailkick.message_verifier.verify(params[:id])
|
24
|
+
if user_type
|
25
|
+
# on the unprobabilistic chance user_type is compromised, not much damage
|
26
|
+
@user = user_type.constantize.find(user_id)
|
27
|
+
end
|
28
|
+
@options = {
|
29
|
+
email: @email,
|
30
|
+
user: @user,
|
31
|
+
list: @list
|
32
|
+
}
|
33
|
+
rescue ActiveSupport::MessageVerifier::InvalidSignature
|
34
|
+
if Rails::VERSION::MAJOR >= 5
|
35
|
+
render plain: "Subscription not found", status: :bad_request
|
36
|
+
else
|
36
37
|
render text: "Subscription not found", status: :bad_request
|
37
38
|
end
|
38
39
|
end
|
@@ -1,11 +1,12 @@
|
|
1
1
|
module Mailkick
|
2
2
|
module UrlHelper
|
3
|
-
def mailkick_unsubscribe_url
|
3
|
+
def mailkick_unsubscribe_url(email: nil, list: nil, **options)
|
4
|
+
email ||= controller.message.to.first
|
4
5
|
Mailkick::Engine.routes.url_helpers.url_for(
|
5
|
-
(ActionMailer::Base.default_url_options || {}).merge(
|
6
|
+
(ActionMailer::Base.default_url_options || {}).merge(options).merge(
|
6
7
|
controller: "mailkick/subscriptions",
|
7
8
|
action: "unsubscribe",
|
8
|
-
id:
|
9
|
+
id: Mailkick.generate_token(email, list: list)
|
9
10
|
)
|
10
11
|
)
|
11
12
|
end
|
data/config/routes.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
Rails.application.routes.draw do
|
2
|
-
|
2
|
+
unless respond_to?(:has_named_route?) && has_named_route?("mailkick")
|
3
|
+
mount Mailkick::Engine => "/mailkick" if Mailkick.mount
|
4
|
+
end
|
3
5
|
end
|
4
6
|
|
5
7
|
Mailkick::Engine.routes.draw do
|
@@ -2,8 +2,7 @@ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version
|
|
2
2
|
def change
|
3
3
|
create_table :mailkick_opt_outs do |t|
|
4
4
|
t.string :email
|
5
|
-
t.
|
6
|
-
t.string :user_type
|
5
|
+
t.references :user, polymorphic: true
|
7
6
|
t.boolean :active, null: false, default: true
|
8
7
|
t.string :reason
|
9
8
|
t.string :list
|
@@ -11,6 +10,5 @@ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version
|
|
11
10
|
end
|
12
11
|
|
13
12
|
add_index :mailkick_opt_outs, :email
|
14
|
-
add_index :mailkick_opt_outs, [:user_id, :user_type]
|
15
13
|
end
|
16
14
|
end
|
data/lib/mailkick.rb
CHANGED
@@ -1,21 +1,19 @@
|
|
1
1
|
require "set"
|
2
|
-
require "safely/core"
|
3
2
|
require "active_support"
|
3
|
+
|
4
4
|
require "mailkick/engine" if defined?(Rails)
|
5
|
-
require "mailkick/processor"
|
6
|
-
require "mailkick/mailer"
|
7
5
|
require "mailkick/model"
|
8
6
|
require "mailkick/service"
|
9
7
|
require "mailkick/service/mailchimp"
|
8
|
+
require "mailkick/service/mailgun"
|
10
9
|
require "mailkick/service/mandrill"
|
11
10
|
require "mailkick/service/sendgrid"
|
12
|
-
require "mailkick/service/mailgun"
|
13
11
|
require "mailkick/version"
|
14
12
|
|
15
13
|
module Mailkick
|
16
14
|
mattr_accessor :services, :user_method, :secret_token, :mount
|
17
15
|
self.services = []
|
18
|
-
self.user_method =
|
16
|
+
self.user_method = ->(email) { User.where(email: email).first rescue nil }
|
19
17
|
self.mount = true
|
20
18
|
|
21
19
|
def self.fetch_opt_outs
|
@@ -65,7 +63,7 @@ module Mailkick
|
|
65
63
|
binds << email
|
66
64
|
end
|
67
65
|
if (user = options[:user])
|
68
|
-
parts << "user_id = ? and user_type = ?"
|
66
|
+
parts << "(user_id = ? and user_type = ?)"
|
69
67
|
binds.concat [user.id, user.class.name]
|
70
68
|
end
|
71
69
|
relation = relation.where(parts.join(" OR "), *binds) if parts.any?
|
@@ -88,10 +86,15 @@ module Mailkick
|
|
88
86
|
def self.opted_out_users(options = {})
|
89
87
|
Set.new(opt_outs(options).where("user_id IS NOT NULL").map(&:user))
|
90
88
|
end
|
91
|
-
end
|
92
89
|
|
93
|
-
|
94
|
-
|
90
|
+
def self.message_verifier
|
91
|
+
@message_verifier ||= ActiveSupport::MessageVerifier.new(Mailkick.secret_token)
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.generate_token(email, list: nil)
|
95
|
+
user = Mailkick.user_method.call(email) if Mailkick.user_method
|
96
|
+
message_verifier.generate([email, user.try(:id), user.try(:class).try(:name), list])
|
97
|
+
end
|
95
98
|
end
|
96
99
|
|
97
100
|
ActiveSupport.on_load(:active_record) do
|
data/lib/mailkick/engine.rb
CHANGED
@@ -4,8 +4,20 @@ module Mailkick
|
|
4
4
|
|
5
5
|
initializer "mailkick" do |app|
|
6
6
|
Mailkick.discover_services unless Mailkick.services.any?
|
7
|
-
|
8
|
-
Mailkick.secret_token ||=
|
7
|
+
|
8
|
+
Mailkick.secret_token ||= begin
|
9
|
+
creds =
|
10
|
+
if app.respond_to?(:credentials)
|
11
|
+
app.credentials
|
12
|
+
elsif app.respond_to?(:secrets)
|
13
|
+
app.secrets
|
14
|
+
else
|
15
|
+
app.config
|
16
|
+
end
|
17
|
+
|
18
|
+
creds.respond_to?(:secret_key_base) ? creds.secret_key_base : creds.secret_token
|
19
|
+
end
|
20
|
+
|
9
21
|
ActiveSupport.on_load :action_mailer do
|
10
22
|
helper Mailkick::UrlHelper
|
11
23
|
end
|
data/lib/mailkick/service.rb
CHANGED
@@ -6,7 +6,7 @@ module Mailkick
|
|
6
6
|
def initialize(options = {})
|
7
7
|
require "mailgun"
|
8
8
|
mailgun_client = ::Mailgun::Client.new(options[:api_key] || ENV["MAILGUN_API_KEY"])
|
9
|
-
domain = options[:domain] || ActionMailer::Base.
|
9
|
+
domain = options[:domain] || ActionMailer::Base.smtp_settings[:domain]
|
10
10
|
@mailgun_events = ::Mailgun::Events.new(mailgun_client, domain)
|
11
11
|
end
|
12
12
|
|
data/lib/mailkick/version.rb
CHANGED
data/mailkick.gemspec
CHANGED
@@ -9,7 +9,6 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.authors = ["Andrew Kane"]
|
10
10
|
spec.email = ["andrew@chartkick.com"]
|
11
11
|
spec.summary = "Email subscriptions made easy"
|
12
|
-
spec.description = "Email subscriptions made easy"
|
13
12
|
spec.homepage = "https://github.com/ankane/mailkick"
|
14
13
|
spec.license = "MIT"
|
15
14
|
|
@@ -18,14 +17,16 @@ Gem::Specification.new do |spec|
|
|
18
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
18
|
spec.require_paths = ["lib"]
|
20
19
|
|
21
|
-
spec.add_dependency "activesupport"
|
22
|
-
spec.add_dependency "safely_block", ">= 0.1.1"
|
20
|
+
spec.add_dependency "activesupport", ">= 4.2"
|
23
21
|
|
24
22
|
spec.add_development_dependency "bundler"
|
25
|
-
spec.add_development_dependency "rake"
|
26
|
-
spec.add_development_dependency "minitest"
|
27
|
-
spec.add_development_dependency "sendgrid_toolkit"
|
28
|
-
spec.add_development_dependency "mandrill-api"
|
29
23
|
spec.add_development_dependency "gibbon", ">= 2"
|
30
24
|
spec.add_development_dependency "mailgun-ruby"
|
25
|
+
spec.add_development_dependency "mandrill-api"
|
26
|
+
spec.add_development_dependency "minitest"
|
27
|
+
spec.add_development_dependency "rake"
|
28
|
+
spec.add_development_dependency "sendgrid_toolkit"
|
29
|
+
spec.add_development_dependency "combustion"
|
30
|
+
spec.add_development_dependency "rails"
|
31
|
+
spec.add_development_dependency "sqlite3"
|
31
32
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
<p><%= mailkick_unsubscribe_url %></p>
|
@@ -0,0 +1 @@
|
|
1
|
+
Unsubscribe: <%= mailkick_unsubscribe_url %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
ActiveRecord::Schema.define do
|
2
|
+
create_table :mailkick_opt_outs do |t|
|
3
|
+
t.string :email
|
4
|
+
t.references :user, polymorphic: true
|
5
|
+
t.boolean :active, null: false, default: true
|
6
|
+
t.string :reason
|
7
|
+
t.string :list
|
8
|
+
t.timestamps
|
9
|
+
end
|
10
|
+
|
11
|
+
add_index :mailkick_opt_outs, :email
|
12
|
+
|
13
|
+
create_table :users do |t|
|
14
|
+
t.string :email
|
15
|
+
end
|
16
|
+
end
|
data/test/mailkick_test.rb
CHANGED
@@ -4,8 +4,26 @@ class MailkickTest < Minitest::Test
|
|
4
4
|
def test_unsubscribe_url
|
5
5
|
message = UserMailer.welcome.deliver_now
|
6
6
|
html_body = message.html_part.body.to_s
|
7
|
-
|
7
|
+
assert_includes html_body, "BAhbCUkiFXRlc3RAZXhhbXBsZS5vcmcGOgZFVDAwMA==--f435e91ba90e1732d3e999af1f2126dcc8182a5d"
|
8
8
|
text_body = message.text_part.body.to_s
|
9
|
-
|
9
|
+
assert_includes text_body, "BAhbCUkiFXRlc3RAZXhhbXBsZS5vcmcGOgZFVDAwMA==--f435e91ba90e1732d3e999af1f2126dcc8182a5d"
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_opt_out
|
13
|
+
email = "test2@example.org"
|
14
|
+
user = User.create!(email: email)
|
15
|
+
|
16
|
+
Mailkick.opt_out(email: email, user: user)
|
17
|
+
|
18
|
+
opt_outs = Mailkick::OptOut.all.to_a
|
19
|
+
assert_equal 1, opt_outs.size
|
20
|
+
|
21
|
+
opt_out = opt_outs.first
|
22
|
+
assert_equal email, opt_out.email
|
23
|
+
assert_equal user, opt_out.user
|
24
|
+
|
25
|
+
assert user.opted_out?
|
26
|
+
assert_equal 1, User.opted_out.count
|
27
|
+
assert_equal 0, User.not_opted_out.count
|
10
28
|
end
|
11
29
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,22 +1,20 @@
|
|
1
1
|
require "bundler/setup"
|
2
|
+
require "combustion"
|
2
3
|
Bundler.require(:default)
|
3
4
|
require "minitest/autorun"
|
4
5
|
require "minitest/pride"
|
5
6
|
require "logger"
|
6
|
-
require "action_mailer"
|
7
7
|
|
8
8
|
Minitest::Test = Minitest::Unit::TestCase unless defined?(Minitest::Test)
|
9
|
-
ActionMailer::Base.delivery_method = :test
|
10
|
-
|
11
|
-
Mailkick.secret_token = "test123"
|
12
|
-
|
13
|
-
class UserMailer < ActionMailer::Base
|
14
|
-
default from: "from@example.com"
|
15
9
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
end
|
10
|
+
Combustion.path = "test/internal"
|
11
|
+
Combustion.initialize! :all do
|
12
|
+
if config.active_record.sqlite3.respond_to?(:represent_boolean_as_integer)
|
13
|
+
config.active_record.sqlite3.represent_boolean_as_integer = false
|
21
14
|
end
|
22
15
|
end
|
16
|
+
|
17
|
+
ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT) if ENV["VERBOSE"]
|
18
|
+
ActionMailer::Base.delivery_method = :test
|
19
|
+
|
20
|
+
Mailkick.secret_token = "test123"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mailkick
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Kane
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-04-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -16,30 +16,44 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '4.2'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '4.2'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: bundler
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
38
|
- - ">="
|
25
39
|
- !ruby/object:Gem::Version
|
26
40
|
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
42
|
+
name: gibbon
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
45
|
- - ">="
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
34
|
-
type: :
|
47
|
+
version: '2'
|
48
|
+
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
52
|
- - ">="
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
54
|
+
version: '2'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
56
|
+
name: mailgun-ruby
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
59
|
- - ">="
|
@@ -53,7 +67,7 @@ dependencies:
|
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
70
|
+
name: mandrill-api
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
58
72
|
requirements:
|
59
73
|
- - ">="
|
@@ -80,6 +94,20 @@ dependencies:
|
|
80
94
|
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: sendgrid_toolkit
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,7 +123,7 @@ dependencies:
|
|
95
123
|
- !ruby/object:Gem::Version
|
96
124
|
version: '0'
|
97
125
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
126
|
+
name: combustion
|
99
127
|
requirement: !ruby/object:Gem::Requirement
|
100
128
|
requirements:
|
101
129
|
- - ">="
|
@@ -109,21 +137,21 @@ dependencies:
|
|
109
137
|
- !ruby/object:Gem::Version
|
110
138
|
version: '0'
|
111
139
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
140
|
+
name: rails
|
113
141
|
requirement: !ruby/object:Gem::Requirement
|
114
142
|
requirements:
|
115
143
|
- - ">="
|
116
144
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
145
|
+
version: '0'
|
118
146
|
type: :development
|
119
147
|
prerelease: false
|
120
148
|
version_requirements: !ruby/object:Gem::Requirement
|
121
149
|
requirements:
|
122
150
|
- - ">="
|
123
151
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
152
|
+
version: '0'
|
125
153
|
- !ruby/object:Gem::Dependency
|
126
|
-
name:
|
154
|
+
name: sqlite3
|
127
155
|
requirement: !ruby/object:Gem::Requirement
|
128
156
|
requirements:
|
129
157
|
- - ">="
|
@@ -136,7 +164,7 @@ dependencies:
|
|
136
164
|
- - ">="
|
137
165
|
- !ruby/object:Gem::Version
|
138
166
|
version: '0'
|
139
|
-
description:
|
167
|
+
description:
|
140
168
|
email:
|
141
169
|
- andrew@chartkick.com
|
142
170
|
executables: []
|
@@ -144,6 +172,7 @@ extensions: []
|
|
144
172
|
extra_rdoc_files: []
|
145
173
|
files:
|
146
174
|
- ".gitignore"
|
175
|
+
- ".travis.yml"
|
147
176
|
- CHANGELOG.md
|
148
177
|
- Gemfile
|
149
178
|
- LICENSE.txt
|
@@ -159,9 +188,7 @@ files:
|
|
159
188
|
- lib/generators/mailkick/views_generator.rb
|
160
189
|
- lib/mailkick.rb
|
161
190
|
- lib/mailkick/engine.rb
|
162
|
-
- lib/mailkick/mailer.rb
|
163
191
|
- lib/mailkick/model.rb
|
164
|
-
- lib/mailkick/processor.rb
|
165
192
|
- lib/mailkick/service.rb
|
166
193
|
- lib/mailkick/service/mailchimp.rb
|
167
194
|
- lib/mailkick/service/mailgun.rb
|
@@ -169,6 +196,15 @@ files:
|
|
169
196
|
- lib/mailkick/service/sendgrid.rb
|
170
197
|
- lib/mailkick/version.rb
|
171
198
|
- mailkick.gemspec
|
199
|
+
- test/gemfiles/actionmailer42.gemfile
|
200
|
+
- test/gemfiles/actionmailer50.gemfile
|
201
|
+
- test/gemfiles/actionmailer51.gemfile
|
202
|
+
- test/internal/app/mailers/user_mailer.rb
|
203
|
+
- test/internal/app/models/user.rb
|
204
|
+
- test/internal/app/views/user_mailer/welcome.html.erb
|
205
|
+
- test/internal/app/views/user_mailer/welcome.text.erb
|
206
|
+
- test/internal/config/database.yml
|
207
|
+
- test/internal/db/schema.rb
|
172
208
|
- test/mailkick_test.rb
|
173
209
|
- test/test_helper.rb
|
174
210
|
homepage: https://github.com/ankane/mailkick
|
@@ -191,10 +227,19 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
191
227
|
version: '0'
|
192
228
|
requirements: []
|
193
229
|
rubyforge_project:
|
194
|
-
rubygems_version: 2.6
|
230
|
+
rubygems_version: 2.7.6
|
195
231
|
signing_key:
|
196
232
|
specification_version: 4
|
197
233
|
summary: Email subscriptions made easy
|
198
234
|
test_files:
|
235
|
+
- test/gemfiles/actionmailer42.gemfile
|
236
|
+
- test/gemfiles/actionmailer50.gemfile
|
237
|
+
- test/gemfiles/actionmailer51.gemfile
|
238
|
+
- test/internal/app/mailers/user_mailer.rb
|
239
|
+
- test/internal/app/models/user.rb
|
240
|
+
- test/internal/app/views/user_mailer/welcome.html.erb
|
241
|
+
- test/internal/app/views/user_mailer/welcome.text.erb
|
242
|
+
- test/internal/config/database.yml
|
243
|
+
- test/internal/db/schema.rb
|
199
244
|
- test/mailkick_test.rb
|
200
245
|
- test/test_helper.rb
|
data/lib/mailkick/mailer.rb
DELETED
data/lib/mailkick/processor.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
module Mailkick
|
2
|
-
class Processor
|
3
|
-
attr_reader :message
|
4
|
-
|
5
|
-
def initialize(message)
|
6
|
-
@message = message
|
7
|
-
end
|
8
|
-
|
9
|
-
def process
|
10
|
-
email = message.to.first
|
11
|
-
user = Mailkick.user_method.call(email) if Mailkick.user_method
|
12
|
-
list = message[:mailkick_list].try(:value)
|
13
|
-
if list
|
14
|
-
# remove header
|
15
|
-
message[:mailkick_list] = nil
|
16
|
-
end
|
17
|
-
|
18
|
-
verifier = ActiveSupport::MessageVerifier.new(Mailkick.secret_token)
|
19
|
-
token = verifier.generate([email, user.try(:id), user.try(:class).try(:name), list])
|
20
|
-
|
21
|
-
parts = message.parts.any? ? message.parts : [message]
|
22
|
-
parts.each do |part|
|
23
|
-
if part.content_type.match(/text\/(html|plain)/)
|
24
|
-
part.body = part.body.decoded.gsub(/%7B%7BMAILKICK_TOKEN%7D%7D/, CGI.escape(token))
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|